gpt4 book ai didi

python - 将几乎没有或没有异常的名称聚类/分组到 Pandas 中的聚类中

转载 作者:行者123 更新时间:2023-11-28 17:58:59 25 4
gpt4 key购买 nike

我有一个名称字段为的数据框:

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.

现在我想将所有这些相似的名称归为一类,这样最终的数据框看起来像这样:

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.' 在说明唯一名称时被视为不同的实体)。
那么是否有任何编程方法来解决此类问题场景?

我尝试使用 difflibfuzzywuzzy 库运行模糊匹配,但即使是其最终结果也不具体。通常 difflib 只会根据“limited”、“association”等词进行匹配。即使他们指的是两个不同的名称,其中只有“关联”或“有限”作为它们之间的通用词。
感谢您的帮助。

编辑:
即使我创建了一个包含“association”、“limited”、“cooprations”、“group”等词的停用词列表,当以不同方式提及时,也有可能遗漏这些停用词名称。例如,如果 'association' 和 'limited' 被提及为 'assoc.','ltd' 和 'ltd.'有可能我会错过将其中一些添加到停用词列表中。

我已经尝试过,使用 LDA 和 NMF 进行主题建模,结果与我之前使用 difflibfuzzywuzzy 库获得的结果非常相似。是的,我在任何这些方法之前进行了所有预处理(转换为小写、leamtization、额外的空格处理)

最佳答案

迟到的回答,关注了一个小时,可以用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

我尽最大努力的代码。

关于python - 将几乎没有或没有异常的名称聚类/分组到 Pandas 中的聚类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56684159/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com