0

Python のヘルプが必要です。これは、リスト A からリスト B を減算してリスト C を作成する古典的な方法ではありません。代わりに、リスト B にないリスト A の項目 (都市名を一言で表す) のインデックスを調べて、それらを次の場所に格納します。新しいリスト C. また、リスト B の一致した項目はリスト A の項目とまったく同じではありません。それらは OCR からのものであるため、スペルが少し間違っています。それらが 90% 類似している場合、一致と見なしたいと思います。

例えば

リスト A: #すべてのリスト項目は、たった 1 語の都市名です

0. Corneria
1. klandasco
2. Blue_Mars
3. Setiro
4. Jeti_lo
5. Neo_Tokyo

リスト B: #citynames のスペルが少し間違っている

0. lcandasco
1. Ne0_Tolcyo

だから、結果は...

リスト C:

[0, 2, 3, 4]

結果のアイテム (Corneria、Blue_Mars、Setiro、Jeti_lo) は重要ではありません。代わりに、減算が行われた後、リスト A のアイテムの元のインデックスを保持する必要があります。

これまでのところ、私はこれをやっています...

a = ["aaa", "bbb", "ccc", "ddd", "ccc", "eee"]
b = ["bbb", "eee"]
c = [i for i, v in enumerate(a) if v not in b]
print(c)

出力...

[0, 2, 3, 4]

しかし、アイテムを 90% の類似性で一致させるために difflib 部分を実装する必要があります。純粋な python スクリプトのみを使用して (できれば difflib のみを使用して) どうすればこれを行うことができますか???

4

1 に答える 1

0

これはどう:

from difflib import SequenceMatcher

max_ratio = 0.9

c = [i for i, v in enumerate(a) 
     if not any(map(lambda x: SequenceMatcher(None, v, x).ratio()>=max_ratio, b))]

使用したスニペットfuzzywuzzy:

from fuzzywuzzy import fuzz

max_ratio = 90

c = [i for i, v in enumerate(a) 
     if not any(map(lambda x: fuzz.ratio(v, x)>=max_ratio, b))]

ノート。使用する前に、fuzzywuzzyインストールする必要があります。

于 2015-05-04T16:23:03.067 に答える