当前位置: 首页 > 面试题库 >

Python模糊匹配(FuzzyWuzzy)-仅保留最佳匹配

子车英达
2023-03-14
问题内容

我试图模糊匹配两个csv文件,每个文件包含一列名称,它们相似但不相同。

到目前为止,我的代码如下:

import pandas as pd
from pandas import DataFrame
from fuzzywuzzy import process
import csv

save_file = open('fuzzy_match_results.csv', 'w')
writer = csv.writer(save_file, lineterminator = '\n')

def parse_csv(path):

with open(path,'r') as f:
    reader = csv.reader(f, delimiter=',')
    for row in reader:
        yield row


if __name__ == "__main__":
## Create lookup dictionary by parsing the products csv
data = {}
for row in parse_csv('names_1.csv'):
    data[row[0]] = row[0]

## For each row in the lookup compute the partial ratio
for row in parse_csv("names_2.csv"):
    #print(process.extract(row,data, limit = 100))
    for found, score, matchrow in process.extract(row, data, limit=100):
        if score >= 60:
            print('%d%% partial match: "%s" with "%s" ' % (score, row, found))
            Digi_Results = [row, score, found]
            writer.writerow(Digi_Results)


save_file.close()

输出如下:

Name11 , 90 , Name25 
Name11 , 85 , Name24 
Name11 , 65 , Name29

该脚本工作正常。输出是预期的。但是我所寻找的只是最佳的匹配。

Name11 , 90 , Name25
Name12 , 95 , Name21
Name13 , 98 , Name22

因此,我需要基于第2列中的最大值,以某种方式删除第1列中的重复名称。这应该相当简单,但是我似乎无法弄清楚。任何帮助,将不胜感激。


问题答案:

Fuzzywuzzy会process.extract()以反向排序的顺序返回列表,最佳匹配排在最前面。

因此,要找到最佳匹配项,可以将limit参数设置为1,以便它仅返回最佳匹配项;如果大于60,则可以像现在一样将其写入csv。

范例-

from fuzzywuzzy import process
## For each row in the lookup compute the partial ratio
for row in parse_csv("names_2.csv"):

    for found, score, matchrow in process.extract(row, data, limit=1):
        if score >= 60:
            print('%d%% partial match: "%s" with "%s" ' % (score, row, found))
            Digi_Results = [row, score, found]
            writer.writerow(Digi_Results)


 类似资料:
  • 本文向大家介绍python fuzzywuzzy模块模糊字符串匹配详细用法,包括了python fuzzywuzzy模块模糊字符串匹配详细用法的使用技巧和注意事项,需要的朋友参考一下 github主页 导入: 1) fuzz.ratio()对位置敏感,全匹配。fuzz.partial_ratio()对位置敏感,搜索匹配。 2) 对字符串s排序。force_ascii:True 或者False。为T

  • 问题内容: 我在项目中使用模糊匹配,主要是查找拼写错误和具有相同名称的不同拼写。我需要完全了解elasticsearch的模糊匹配如何工作以及它如何使用标题中提到的2个参数。 据我了解, min_similarity 是查询的字符串与数据库中的字符串匹配的百分比。我找不到有关此值如何计算的确切描述。 据我了解, max_expansions 是应该执行搜索的Levenshtein距离。如果这实际上

  • 问题内容: 我想在查询上使用模糊匹配,但在结果顶部显示完全匹配。 我已经尝试了以下方法。 由于格式错误的查询错误,此方法不起作用。 有任何想法吗? 问题答案: 我最终没有使用模糊匹配来解决我的问题,而是使用了ngram。 结果正是我想要的。它根据搜索查询中包含的ngram部分构造匹配项。

  • 问题内容: 我有一个包含单词的表和一个输入字段,可使用实时搜索来搜索该表。当前,我使用以下查询来搜索表: 有没有一种方法可以对结果进行排序,以使在单词开头找到字符串的字符串排在最前面,而在单词后面出现字符串的字符串排在最后呢? 例如:搜索“ hab ”当前返回 一个 lphabet ^ h 升技 [R EHAB 但我想这样: 赞 一下(首先是因为“赞”是开始) alp hab et(第二个原因是’

  • 我的目标是筛选出最佳匹配。在我的例子中,我有一个人员列表,我想按姓氏和名字过滤。 匹配的预趋势将是: < li >姓和名都匹配,返回第一个匹配项 < li >仅姓氏匹配,返回第一个匹配项 < li >不匹配,抛出一些异常 我目前为止的代码:

  • 考虑以下Javascript正则表达式代码: 第二个正则表达式,尽管不匹配,但保留第一个正则表达式匹配。 RegExp对象不应该是空的,因为第二个正则表达式不匹配吗?