1

私がPython辞書を持っているとしましょう:

d = {"a":1, "b":2}

これは、文字列内の文字の出現回数を表します。したがって、上記の辞書は「abb」、「bab」、または「bba」の文字列を生成する可能性があります。

2つの辞書間の最大類似度は、> =0と<=1の比率であり、最も類似して生成された2つの文字列がどれほど類似しているかを示します。

例えば、

d1 = {"a":1, "b":2}
d2 = {"c": 3}
d3 = {"a":1, "d":2}

max_sim(d1, d2) # equals to 0.0 because no indexes 
# of an arrangement of ccc matches any indexes of an arrangement of abb
max_sim(d1, d3) # equals to 0.333 because an arrangement of add matches
# one out of three characters of an arrangement of abb
# note that if we compared dda and abb, the similarity ratio would be 0.0
# but we always take into account the most similarly generated strings

文字ごとの出現回数を確認するだけで、任意の2つの辞書(同じ長さ)の最大の類似性を生成するにはどうすればよいですか?つまり、単に辞書を分析し、実際に文字列を生成して各ペアの類似度をチェックするのではありません。

注:辞書データを収集するために2つの文字列を既にループしているため、文字列ではなく辞書でmax_simを使用しています(他のものに加えて)。2つの文字列(元の文字列または辞書を文字列に戻す)でmax_simを使用すると、冗長な計算を実行しているだけだと思います。ですから、答えに2つの辞書が入力されていれば幸いです。

4

1 に答える 1

1

これはどうですか:

def max_sim(d1, d2):
    # assume that's the same for both dicts
    length = sum(d1.values())
    matches = 0
    for letter in set(d1.keys() + d2.keys()):
        matches += min(d1.get(letter, 0), d2.get(letter, 0))
    return matches / float(length)

結果:

d1 = {"a":1, "b":2}
d2 = {"c": 3} 
d3 = {"a":1, "d":2}
d4 = {"a": 1, "b": 1, "c": 1 }

max_sim(d1, d2) # 0.0
max_sim(d1, d3) # 0.333
max_sim(d1, d4) # 0.666
max_sim(d1, d1) # 1.0
于 2013-02-28T00:01:02.600 に答える