6

我正在使用熊猫数据框,并且我有每个公司都有客户的数据。但是,公司名称略有不同,但最终会影响数据。例子:

Company    Customers
AAAB       1,000
AAAB Inc.  900
The AAAB Inc.  20
AAAB the INC   10

我想从几个不同公司的数据库中获取所有客户,这些公司的名称不是标准的。知道我应该从哪里开始吗?

4

3 回答 3

8

我记得读过这个关于fuzzywuzzy 库的博客(研究另一个问题),它可以做到这一点:

pip install fuzzywuzzy

您可以使用它的 partial_ratio 函数来“模糊匹配”字符串:

In [11]: from fuzzywuzzy.fuzz import partial_ratio

In [12]: partial_ratio('AAAB', 'the AAAB inc.')
Out[12]: 100

这似乎对这是一场精彩的比赛充满信心!

In [13]: partial_ratio('AAAB', 'AAPL')
Out[13]: 50

In [14]: partial_ratio('AAAB', 'Google')
Out[14]: 0

我们可以在实际的公司列表中取最佳匹配(假设你有):

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

我强烈怀疑 scikit learn 或 numpy 库中有一些东西可以在大型数据集上更有效地执行此操作……但这应该可以完成工作。

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

于 2013-10-17T22:14:31.240 回答
1
splitCompaniesSet = map( lambda cmpnyName : 
    set( map( lambda name : name.split(" "), cmpnyName ) ), dataFrame['Company'] )

我认为这是对的。

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

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

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

于 2013-10-17T21:49:52.403 回答
0

利用pip install cleanco

尝试以下代码: -

from cleanco import prepare_terms, basename
business_name = "The AAAB Inc."
terms = prepare_terms()
basename(business_name, terms, prefix=False, middle=False, suffix=True)

预期输出:-

The AAAB
于 2021-03-17T13:51:01.600 回答