在具有匹配字符串值及其计数的列表中查找模糊匹配字符串
Find fuzzy match string in a list with matching string value and their count
我有一个列表A如下。
A = ['vikash','vikas','Vinod',Vikky','Akash','Vinodh','Sachin','Salman,'Ajay','Suchin','Akash','vikahs']
我想将列表中的每个元素与每个元素进行匹配,并找出每个元素的匹配率90%以上的模糊匹配串和匹配元素的个数。
我的结果在数据框中应该如下所示。
string Matching strings count
===============================
Vikash vikas,vikahs 2
vikas vikash,vikahs 2
vinod vinodh 1
Vikky 0
Akash Akash 1
...
..
Vikahs vikash,vikas 2
谁能帮助我实现这一目标,因为我是 python 的新人?
谢谢
这可以通过以下方式使用 FuzzyWuzzy 实现:
import pandas as pd
from fuzzywuzzy import fuzz
elements = ['vikash', 'vikas', 'Vinod', 'Vikky', 'Akash', 'Vinodh', 'Sachin', 'Salman', 'Ajay', 'Suchin', 'Akash', 'vikahs']
results = [[name, [], 0] for name in elements]
for (i, element) in enumerate(elements):
for (j, choice) in enumerate(elements[i+1:]):
if fuzz.ratio(element, choice) >= 90:
results[i][2] += 1
results[i][1].append(choice)
results[j+i+1][2] += 1
results[j+i+1][1].append(element)
data = pd.DataFrame(results, columns=['name', 'duplicates', 'duplicate_count'])
作为替代方案,我编写了库 RapidFuzz
,它在返回与 FuzzyWuzzy 相同的结果时速度更快,并且可以通过以下方式实现:
import pandas as pd
from rapidfuzz import fuzz
elements = ['vikash', 'vikas', 'Vinod', 'Vikky', 'Akash', 'Vinodh', 'Sachin', 'Salman', 'Ajay', 'Suchin', 'Akash', 'vikahs']
results = [[name, [], 0] for name in elements]
for (i, element) in enumerate(elements):
for (j, choice) in enumerate(elements[i+1:]):
if fuzz.ratio(element, choice, score_cutoff=90):
results[i][2] += 1
results[i][1].append(choice)
results[j+i+1][2] += 1
results[j+i+1][1].append(element)
data = pd.DataFrame(results, columns=['name', 'duplicates', 'duplicate_count'])
我做了 运行 快速基准测试以显示两者在 1000 运行 秒上的 运行 时间差:
# FuzzyWuzzy
0.13835792080499232
# RapidFuzz
0.03843669104389846
两者的输出为:
name duplicates duplicate_count
0 vikash [vikas] 1
1 vikas [vikash, vikahs] 2
2 Vinod [Vinodh] 1
3 Vikky [] 0
4 Akash [Akash] 1
5 Vinodh [Vinod] 1
6 Sachin [] 0
7 Salman [] 0
8 Ajay [] 0
9 Suchin [] 0
10 Akash [Akash] 1
11 vikahs [vikas] 1
我有一个列表A如下。
A = ['vikash','vikas','Vinod',Vikky','Akash','Vinodh','Sachin','Salman,'Ajay','Suchin','Akash','vikahs']
我想将列表中的每个元素与每个元素进行匹配,并找出每个元素的匹配率90%以上的模糊匹配串和匹配元素的个数。
我的结果在数据框中应该如下所示。
string Matching strings count
===============================
Vikash vikas,vikahs 2
vikas vikash,vikahs 2
vinod vinodh 1
Vikky 0
Akash Akash 1
...
..
Vikahs vikash,vikas 2
谁能帮助我实现这一目标,因为我是 python 的新人?
谢谢
这可以通过以下方式使用 FuzzyWuzzy 实现:
import pandas as pd
from fuzzywuzzy import fuzz
elements = ['vikash', 'vikas', 'Vinod', 'Vikky', 'Akash', 'Vinodh', 'Sachin', 'Salman', 'Ajay', 'Suchin', 'Akash', 'vikahs']
results = [[name, [], 0] for name in elements]
for (i, element) in enumerate(elements):
for (j, choice) in enumerate(elements[i+1:]):
if fuzz.ratio(element, choice) >= 90:
results[i][2] += 1
results[i][1].append(choice)
results[j+i+1][2] += 1
results[j+i+1][1].append(element)
data = pd.DataFrame(results, columns=['name', 'duplicates', 'duplicate_count'])
作为替代方案,我编写了库 RapidFuzz
,它在返回与 FuzzyWuzzy 相同的结果时速度更快,并且可以通过以下方式实现:
import pandas as pd
from rapidfuzz import fuzz
elements = ['vikash', 'vikas', 'Vinod', 'Vikky', 'Akash', 'Vinodh', 'Sachin', 'Salman', 'Ajay', 'Suchin', 'Akash', 'vikahs']
results = [[name, [], 0] for name in elements]
for (i, element) in enumerate(elements):
for (j, choice) in enumerate(elements[i+1:]):
if fuzz.ratio(element, choice, score_cutoff=90):
results[i][2] += 1
results[i][1].append(choice)
results[j+i+1][2] += 1
results[j+i+1][1].append(element)
data = pd.DataFrame(results, columns=['name', 'duplicates', 'duplicate_count'])
我做了 运行 快速基准测试以显示两者在 1000 运行 秒上的 运行 时间差:
# FuzzyWuzzy
0.13835792080499232
# RapidFuzz
0.03843669104389846
两者的输出为:
name duplicates duplicate_count
0 vikash [vikas] 1
1 vikas [vikash, vikahs] 2
2 Vinod [Vinodh] 1
3 Vikky [] 0
4 Akash [Akash] 1
5 Vinodh [Vinod] 1
6 Sachin [] 0
7 Salman [] 0
8 Ajay [] 0
9 Suchin [] 0
10 Akash [Akash] 1
11 vikahs [vikas] 1