在大Pandas中把很少或没有异常的名字聚成一团

2024-04-29 16:53:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个dataframe,其中names字段为:

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库运行fuzzy match,但即使是它的最终结果也不具体。通常情况下,difflib只会根据“limited”、“association”等词进行匹配,即使它们指的是两个不同的名称,其中只有“association”或“limited”作为常用词。
感谢您的帮助。你知道吗

编辑:
即使我创建了一个包含“association”、“limited”、“cooprations”、“group”等单词的停止词列表,当以不同方式提及时,也有可能遗漏这些停止词名称。例如,如果“association”和“limited”只是指“assoc.”、“ltd”和“ltd.”,那么我很可能会错过将其中一些添加到停止词列表中的机会。你知道吗

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


Tags: 名称limitedmotorusaleaguefootballassociationtata
2条回答

迟答,集中一个小时,你可以用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

尽我最大努力的一个代码。你知道吗

据我所知。我不这么认为,你可以有准确的结果,但你可以做一些事情,这将有助于你清理你的数据

  1. 首先使用.lower()降低字符串
  2. 使用Strip()剥离字符串以删除多余的空格
  3. 标记字符串
  4. 对您的数据进行词干化和柠檬化

你应该研究句子的相似性,python中有多个库,比如gensim,nltk
https://radimrehurek.com/gensim/tutorial.html
https://spacy.io/
https://www.nltk.org/

即使我创建了非常基本的文档相似性项目,您也可以查看这个github
https://github.com/tawabshakeel/Document-similarity-NLP-

我希望这些都能帮助你解决问题。你知道吗

相关问题 更多 >