我有一个excel文件,其中一列包含1000多个公司名称,而另一列包含约20,000个公司名称。
目标是匹配尽可能多的名称。问题是第一列(1000 +)中的名称格式设置不正确,这意味着“公司名称”字符串的外观可能类似于“ 9Com(panynAm9e00” )。我试图找出解决此问题的最佳方法(只有12个名字完全匹配)
在尝试了不同的方法之后,我最终尝试使用正则表达式来匹配每个名称中的4-5个或更多字符,具体取决于每个字符串的长度。但是我只是在努力寻找最有效的方法来做到这一点。
例如:
第1列
1. 9Com(panynAm9e00
2. NikE4
3. Mitrosof2
第2列
1. Microsoft
2. Company Name
3. Nike
在第1列中获取第一个元素,然后在第2列中查找匹配项。如果不完全匹配,则查找具有4-5个相同字符的字符串。
有什么建议吗?
答案 0 :(得分:6)
我建议使用pandas
和pd.read_excel()
阅读您的Excel文件,然后使用fuzzywuzzy
进行匹配,例如:
import pandas as pd
from fuzzywuzzy import process, fuzz
df = pd.DataFrame([['9Com(panynAm9e00'],
['NikE4'],
['Mitrosof2']],
columns=['Name'])
known_list = ['Microsoft','Company Name','Nike']
def find_match(x):
match = process.extractOne(x, known_list, scorer=fuzz.partial_token_sort_ratio)[0]
return match
df['match found'] = [find_match(row) for row in df['Name']]
收益:
Name match found
0 9Com(panynAm9e00 Company Name
1 NikE4 Nike
2 Mitrosof2 Microsoft
答案 1 :(得分:0)
我猜想数字在实际的公司名称中不是很常见,因此最初的过滤步骤将极大地帮助前进,但是即使没有这种方法,这也是一种可以相对较好地实现的实现。如果您愿意的话,采用“成语袋”(word-of-words)方法。
字典距离实现取决于您。