0

我试图在两个列表中找到几乎匹配的字符串。假设有两个列表如下

string_list_1 = ['apple_from_2018','samsung_from_2017','htc_from_2015','nokia_from_2010','moto_from_2019','lenovo_decommision_2017']

string_list_2 =
['apple_from_2020','samsung_from_2021','htc_from_2015','lenovo_decommision_2017']

Output
Similar = ['apple_from_2018','samsung_from_2017','htc_from_2015','lenovo_decommision_2017']
Not Similar =['nokia_from_2010','moto_from_2019']

我使用下面的实现尝试了上面的一个,但它没有给出正确的结果

similar = []
not_similar = []
for item1 in string_list_1:
   for item2 in string_list_2:
      if SequenceMatcher(a=item1,b=item2).ratio() > 0.90:
         similar.append(item1)
      else:
          not_similar.append(item1)
  

当我尝试上述实现时,它并不像预期的那样。如果有人可以识别缺失的部分并获得所需的结果,将不胜感激

4

1 回答 1

0

您可以使用以下函数来查找两个给定字符串之间的相似性

from difflib import SequenceMatcher

def similar(a, b):
    return SequenceMatcher(None, a, b).ratio()


print(similar("apple_from_2018", "apple_from_2020"))

输出 :

0.8666666666666667

因此,使用此功能,您可以选择超过百分比相似度阈值的字符串。尽管您可能需要将阈值从 90 降低到 85 才能获得预期的输出。

因此,以下代码应该适合您

string_list_1 = ['apple_from_2018','samsung_from_2017','htc_from_2015','nokia_from_2010','moto_from_2019','lenovo_decommision_2017']

string_list_2 = ['apple_from_2020','samsung_from_2021','htc_from_2015','lenovo_decommision_2017']



from difflib import SequenceMatcher


similar = []
not_similar = []
for item1 in string_list_1:

    # Set the state as false
    found = False
    for item2 in string_list_2:
        if SequenceMatcher(None, a=item1,b=item2).ratio() > 0.80:
            similar.append(item1)
            found = True
            break
    
    if not found:
        not_similar.append(item1)

print("Similar : ", similar)
print("Not Similar : ", not_similar)

输出 :

Similar :  ['apple_from_2018', 'samsung_from_2017', 'htc_from_2015', 'lenovo_decommision_2017']
Not Similar :  ['nokia_from_2010', 'moto_from_2019']

这确实减少了时间和多余的附加。此外,由于 90 太高,我已将相似性度量降低到 80。但是可以随意调整这些值。

于 2020-12-21T06:50:09.323 回答