我有一个名字段的dataframe,如:
print(df)
names
--------------------------------
0 U.S.A.
1 United States of America
2 USA
4 US America
5 Kenyan Footbal League
6 Kenyan Football League
7 Kenya Football League Assoc.
8 Kenya Footbal League Association
9 Tata Motors
10 Tat Motor
11 Tata Motors Ltd.
12 Tata Motor Limited
13 REL
14 Reliance Limited
15 Reliance Co.现在,我想把所有类似的名字合并成一个类别,这样最后的dataframe看起来就像这样:
print(df)
names group_name
---------------------------------------------
0 U.S.A. USA
1 United States of America USA
2 USA USA
4 US America USA
5 Kenyan Footbal League Kenya Football League
6 Kenyan Football League Kenya Football League
7 Kenya Football League Assoc. Kenya Football League
8 Kenya Footbal League Association Kenya Football League
9 Tata Motors Tata Motors
10 Tat Motor Tata Motors
11 Tata Motors Ltd. Tata Motors
12 Tata Motor Limited Tata Motors
13 REL Reliance
14 Reliance Limited. Reliance
15 Reliance Co. Reliance现在这仅仅是16条记录,所以很容易查找所有可能的名称和名称中的异常,并创建一个映射字典。但实际上,我有一个数据帧,有大约5800个唯一的名称(注意:'USA‘和'U.S.A.’表示唯一计数时计算为不同的实体)。
因此,是否有任何方案办法来处理这种情况?
我试着使用difflib和fuzzywuzzy库运行模糊匹配,但是即使它的最终结果也不具体。通常情况下,difflib只会根据诸如“限制”、“联想”等单词进行匹配,尽管它们会使用两个不同的名称,其中只有“联想”或“有限”。
任何帮助都是非常感谢的。
编辑:
即使我创建了一个停止词的列表,比如“联合”、“有限”、“合作”、“组”等等,但如果以不同的方式提到这些停止词,也有可能会遗漏这些停止词的名字。例如,如果“协会”和“有限公司”被称为“assoc.”、“ltd”和“ltd.”我有可能会错过把其中的一些添加到停止词列表中。
我已经尝试过用LDA和NMF进行主题建模--结果与我之前使用difflib和fuzzywuzzy库所取得的结果非常相似。是的,在这些方法之前,我做了所有的预处理(转换为更低的情况,学习,额外的空白处理)。
发布于 2019-06-21 10:39:24
延迟回答,集中讨论一个小时,您可以使用difflib.SequenceMatcher并过滤比0.6大的比率,以及大量的代码.此外,我只需删除每个列表的最后一个字,在修改后的names列中,得到最长的单词,这显然会得到您想要的结果,这里是.
import difflib
df2 = df.copy()
df2.loc[df2.names.str.contains('America'), 'names'] = 'US'
df2['names'] = df2.names.str.replace('.', '').str.lstrip()
df2.loc[df2.names.str.contains('REL'), 'names'] = 'Reliance'
df['group_name'] = df2.names.apply(lambda x: max(sorted([i.rsplit(None, 1)[0] for i in df2.names.tolist() if difflib.SequenceMatcher(None, x, i).ratio() > 0.6]), key=len))
print(df)输出:
names group_name
0 U.S.A. USA
1 United States of America USA
2 USA USA
3 US America USA
4 Kenyan Footbal League Kenya Football League
5 Kenyan Football League Kenya Football League
6 Kenya Football League Assoc. Kenya Football League
7 Kenya Footbal League Association Kenya Football League
8 Tata Motors Tata Motors
9 Tat Motor Tata Motors
10 Tata Motors Ltd. Tata Motors
11 Tata Motor Limited Tata Motors
12 REL Reliance
13 Reliance Limited Reliance
14 Reliance Co. Reliance用我最大的努力。
发布于 2019-06-20 11:03:15
据我所知。我不认为这样你可以得到准确的结果,但是你可以做一些有助于你清理数据的事情
应该研究python中存在的多个类库,如gensim、nltk。
https://radimrehurek.com/gensim/tutorial.html
即使我创建了非常基本的文档相似项目,您也可以检查这个github
https://github.com/tawabshakeel/Document-similarity-NLP-
我希望所有这些都能帮助你解决问题。
https://stackoverflow.com/questions/56684159
复制相似问题