仅首字母首字母的Python模糊匹配

2024-05-29 08:30:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个例子,需要将给定字符串中的名称与名称数据库相匹配。下面我举了一个非常简单的例子来说明我遇到的问题,我不清楚为什么一个案子比另一个案子有效?如果我没搞错的话,extractOne()的Python默认算法是Levenshtein distance算法。是因为克莱门斯的名字提供了前两个缩写,而冈萨雷斯只有一个?在

from fuzzywuzzy import fuzz
from fuzzywuzzy import process

s = ['Gonzalez, E. walked down the street.', 'Gonzalez, R. went to the market.', 'Clemens, Ko. reach the intersection; Clemens, Ka. did not.']

names = []

for i in s:

    name = [] #clear name
    for k in i.split():
        if k[0].isupper(): name.append(k)
        else: break
    names.append(' '.join(name))

    if ';' in i:
        for each in i.split(';')[1:]:
            name = [] #clear name
            for k in each.split():
                if k[0].isupper(): name.append(k)
                else: break
            names.append(' '.join(name))

print(names)

choices = ['Kody Clemens','Kacy Clemens','Gonzalez Ryan', 'Gonzalez Eddy']

for i in names:
    s = process.extractOne(i, choices)
    print(s, i)

输出:

^{pr2}$

Tags: thenamein名称算法forifnames
1条回答
网友
1楼 · 发布于 2024-05-29 08:30:41

虽然@Igle的建议确实解决了这个具体问题,但我想强调的是,这是一个狭隘的解决方案,不一定能解决所有问题。fuzzyfuzzy有多个记分器,它们使用Levenshtein距离算法结合不同的逻辑来比较字符串。默认记分器,毛茸茸的比较了直线Levenshtein距离算法的匹配得分(模糊比率)与其他变体一起,并返回所有得分手的最佳匹配。它不仅仅是这样,还包括关于从不同方法中加权得分的附加逻辑,如果您感兴趣,我建议您看看the source code for fuzz.WRatio。在

要查看您的案例发生了什么,您可以通过稍微调整代码的最后几行来比较评分者的所有选择的分数:

token_set_比率:

for i in names:
   s = process.extract(i, choices,scorer=fuzz.token_set_ratio)
   print(s, i)

[('Gonzalez Ryan', 89), ('Gonzalez Eddy', 89), ('Kody Clemens', 27), ('Kacy Clemens', 27)] Gonzalez, E.
[('Gonzalez Ryan', 89), ('Gonzalez Eddy', 89), ('Kody Clemens', 27), ('Kacy Clemens', 27)] Gonzalez, R.
[('Kody Clemens', 91), ('Kacy Clemens', 82), ('Gonzalez Ryan', 26), ('Gonzalez Eddy', 26)] Clemens, Ko.
[('Kacy Clemens', 91), ('Kody Clemens', 82), ('Gonzalez Ryan', 35), ('Gonzalez Eddy', 26)] Clemens, Ka.

U标记的排序比率:

^{pr2}$

虽然token_sort_ratio显示了一个明确的胜负,但是token_set_ratio返回更高的分数,这就是为什么毛茸茸的返回它选择的结果。另一个主要问题是,当您有类似的查询和选择时,它们的比较顺序就会变得重要。例如,当我运行与上面完全相同的代码,但是颠倒选项列表的顺序时,我们得到的是“Gonzalez Eddy”:

^{3}$

我猜正确的比赛实际上有更高的分数,但“埃迪”和“瑞安”已经足够接近两个回合的相同的最终得分。在

我过去处理类似问题的方式:

  1. 使用extract而不是extractionone(就像我在上面的示例中所做的那样)
  2. 使用多个记分器(ratio、token_set_ratio、token_sort_ratio)处理相同的查询/选择,并使用这些分数的加权平均值来选择最佳匹配。在
  3. 调整fuzzyfuzzy源代码以合并自定义权重或删除舍入。在

相关问题 更多 >

    热门问题