2

同義語の辞書があります:

synonym = {"this": ["this", "same"],
           "all": ["all", "any", "*"],
           "alluptolastyear": ["alluptolastyear", "uptolastyear"],
           "dekadbefore": ["dekadbefore", "lastdekad", "formerdekad", "precedingdekad"],
           "dekadafter": ["dekadafter", "nextdekad", "followingdekad"],
           "yearbefore": ["yearbefore", "lastyear", "formeryear"],
           "monthbefore": ["monthbefore", "lastmonth", "precedingmonth"]}

各配列には、キーを介して参照される同義語が格納されます。XMLファイルから2つの文字列を読み取り、それらを比較してみます。

例えば:

  • "this""same"等しい(同義語)
  • '"lastyear"'と'"formeryear"'は等しい(同義語)
  • "all""nextdekad"は異なります
  • もちろん、各キー値は対応する配列にあるため、各キーはその配列の文字列の同義語です。

同義語辞書を使用して、これらの文字列のpythonic比較を作成するのに役立つものはありますか?

4

5 に答える 5

6

これを試して:

def are_sinonims(a, b):
    return a in synonym.get(b,[]) or b in synonym.get(a,[]) or any(a in synonym[k] and b in synonym[k] for k in synonym)

また、パーツa in synonym[k] and b in synonym[k] for k in synonyma in words and b in words for words in synonym.values()次のように書き直すこともできます。

def are_sinonims(a, b):
    return a in synonym.get(b,[]) \
           or b in synonym.get(a,[]) \
           or any(a in words and b in words for words in synonym.values())
于 2012-10-12T08:22:52.390 に答える
4

各単語を「同義語ハッシュ」(2つの単語が同義語である場合は等しく、それ以外の場合は異なるもの)に変換できます。

def sym_hash(word):
    for w, s in synonym.items():
        if word == w or word in s:
            return w
    return word

次に、「ハッシュ」を使用して単語を比較します。

def phrases_equal(p1, p2):
    return all(sym_hash(a) == sym_hash(b) for a, b in zip(p1, p2))

p1 = "all your base this dekadbefore are formeryear".split()
p2 = "any your base same lastdekad are yearbefore".split()

print phrases_equal(p1, p2) # True

実際、同義語データベースの適切なデータ構造は、辞書ではなく、セットのリストであるように見えます。

synonym = [
    {"this", "same"},
    {"all", "any", "*"},
    {"alluptolastyear", "uptolastyear"},
    {"dekadbefore", "lastdekad", "formerdekad", "precedingdekad"},
    {"dekadafter", "nextdekad", "followingdekad"},
    {"yearbefore", "lastyear", "formeryear"},
    {"monthbefore", "lastmonth", "precedingmonth"}
]

この場合、次のようにsym_hash効率的にコーディングできます。

def sym_hash(word):
    return next((s for s in synonym if word in s), word)
于 2012-10-12T11:03:45.987 に答える
3

なぜだけではないのですか?

def are_sinonims(a, b):
    return b in synonym.get(a, []) or a in synonym.get(b, [])

誤りのあるコメントの後に編集。

于 2012-10-12T08:19:26.437 に答える
1

まず、キーとしてすべての同義語に対して新しいdictを作成します。

word_to_word = {}    
for syns in synonym.values():
    for word in syns:
        word_to_word[word] = syns

文字列を比較する関数:

def are_sinomic(a, b):    
    words_a, words_b = a.split(), b.split()
    if len(words_a) != len(words_b):
        return False
    for word_a, word_b in zip(words_a, words_b):
       if word_a != word_b and word_b not in word_to_word.get(word_a, []):
           return False
    return True
于 2012-10-12T08:22:28.977 に答える
0

何か同義語であることにのみ関心がある場合は、dictの値の順列から2タプルのセットを作成できます...:

synonym = {"this": ["this", "same"], 
           "all": ["all", "any", "*"], 
           "alluptolastyear": ["alluptolastyear", "uptolastyear"], 
           "dekadbefore": ["dekadbefore", "lastdekad", "formerdekad", "precedingdekad"], 
           "dekadafter": ["dekadafter", "nextdekad", "followingdekad"], 
           "yearbefore": ["yearbefore", "lastyear", "formeryear"], 
           "monthbefore": ["monthbefore", "lastmonth", "precedingmonth"]} 

from itertools import chain, permutations
synonym_set = set(chain.from_iterable(permutations(val, 2) for val in synonym.values()))

def are_synonyms(a, b):
    return (a, b) in synonym_set
于 2012-10-12T09:58:46.433 に答える