如何规范化名称

Ale*_*wis 6 python nlp normalize pandas

我正在使用pandas数据帧,我有数据,我每个公司都有客户.但是,公司的标题略有不同,但最终会影响数据.例:

Company    Customers
AAAB       1,000
AAAB Inc.  900
The AAAB Inc.  20
AAAB the INC   10
Run Code Online (Sandbox Code Playgroud)

我希望从具有非标准名称的公司的几个不同公司的数据库中获得总客户.知道我应该从哪里开始吗?

And*_*den 8

我记得读过这篇关于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库中的某些内容可以更有效地在大型数据集上执行此操作......但这应该可以完成工作.

如果你没有公司名单,你可能需要做一些更聪明的事情......


Мат*_*нер 1

splitCompaniesSet = map( lambda cmpnyName : 
    set( map( lambda name : name.split(" "), cmpnyName ) ), dataFrame['Company'] )
Run Code Online (Sandbox Code Playgroud)

我认为这是对的。

基本上创建一个集合列表,每个集合都有公司名称分割。然后,从第一个元素开始,找到所有其他元素与该元素的集合交集。对于每个非空交集,将名称更改为所有非空结果集中最简单的匹配,即与所有非空集再取一个集合交集,并将结果设置为所有这些非空集的公司名称空匹配。

然后继续处理Company与第一个公司名称相交时产生空集的下一个。然后对您尝试的前两个为空的下一个执行此操作Company,依此类推。

不过,可能有一种更有效的方法来做到这一点。