我记得读过这篇关于fuzzywuzzy库的博客(看另一个问题),它可以做到这一点:
pip install fuzzywuzzy
Run Code Online (Sandbox Code Playgroud)
您可以使用其partial_ratio函数来"模糊匹配"字符串:
In [11]: from fuzzywuzzy.fuzz import partial_ratio
In [12]: partial_ratio('AAAB', 'the AAAB inc.')
Out[12]: 100
Run Code Online (Sandbox Code Playgroud)
这似乎有信心它是一个很好的匹配!
In [13]: partial_ratio('AAAB', 'AAPL')
Out[13]: 50
In [14]: partial_ratio('AAAB', 'Google')
Out[14]: 0
Run Code Online (Sandbox Code Playgroud)
我们可以在实际公司列表中获得最佳匹配(假设您拥有它):
In [15]: co_list = ['AAAB', 'AAPL', 'GOOG']
In [16]: df.Company.apply(lambda mistyped_co: max(co_list,
key=lambda co: partial_ratio(mistyped_co, co)))
Out[16]:
0 AAAB
1 AAAB
2 AAAB
3 AAAB
Name: Company, dtype: object
Run Code Online (Sandbox Code Playgroud)
我强烈怀疑scikit学习或者numpy库中的某些内容可以更有效地在大型数据集上执行此操作......但这应该可以完成工作.
如果你没有公司名单,你可能需要做一些更聪明的事情......
splitCompaniesSet = map( lambda cmpnyName :
set( map( lambda name : name.split(" "), cmpnyName ) ), dataFrame['Company'] )
Run Code Online (Sandbox Code Playgroud)
我认为这是对的。
基本上创建一个集合列表,每个集合都有公司名称分割。然后,从第一个元素开始,找到所有其他元素与该元素的集合交集。对于每个非空交集,将名称更改为所有非空结果集中最简单的匹配,即与所有非空集再取一个集合交集,并将结果设置为所有这些非空集的公司名称空匹配。
然后继续处理Company与第一个公司名称相交时产生空集的下一个。然后对您尝试的前两个为空的下一个执行此操作Company,依此类推。
不过,可能有一种更有效的方法来做到这一点。