将很少或没有异常的名称聚类/分组到熊猫中的聚类中

  • 本文关键字:聚类 熊猫 异常 python pandas
  • 更新时间 :
  • 英文 :


>我有一个数据帧,其名称字段为:

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 个唯一名称的数据框(注意:"美国"和"美国"在说明唯一名称计数时被视为不同的实体)。
那么,是否有任何程序化的方法来解决这种情况呢?

我尝试使用difflibfuzzywuzzy库运行模糊匹配,但即使是它的最终结果也不具体。很多时候,difflib只是根据"有限"、"协会"等词进行匹配,即使它们指的是两个不同的名称,其中只有"协会"或"有限"作为它们的常用词。
任何帮助,不胜感激。

编辑:
即使我创建了一个带有"associatio","limited","cooprations","group"等词的停用词列表,当以不同的方式提及时,也有可能错过这些停用词名称。例如,如果"协会"和"有限"只是被提及为"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

我尽最大努力的代码。

据我所知。我不认为你可以得到准确的结果,但你可以做一些可以帮助你清理数据的事情

  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-

我希望所有这些事情都能帮助你解决问题。

最新更新