【问题标题】:Grouping words by their similarity按相似度对单词进行分组
【发布时间】:2021-09-13 07:41:16
【问题描述】:

我有一个庞大的德语单词字典/数据框,以及它们在庞大的文本语料库中出现的频率。例如:

der                                23245
die                                23599
das                                23959
eine                               22000
dass                               18095
Buch                               15988
Büchern                             1000
Arbeitsplatz-Management              949
Arbeitsplatz-Versicherung            800

由于像“Buch”(书)和“Büchern”(书,但以不同的变格形式)这样的词具有相似的含义,我想将它们的频率加起来。与文章“der, die, das”相同,但最后两个词的含义完全不同,即使它们源于相同的词。

我尝试了 Levenshtein 距离,即“将一个单词更改为另一个单词所需的最小单字符编辑(插入、删除或替换)次数”。但是“Buch”和“Bücher”之间的 Levenshtein 距离比“das”和“dass”之间的距离更大(含义完全不同)

import enchant
string1 = "das"
string2 = "dass"
string3 = "Buch"
string4 = "Büchern"
print(enchant.utils.levenshtein(string1, string2))
print(enchant.utils.levenshtein(string3, string4))
>>>> 1
>>>> 4

有没有其他方法可以有效地聚类这些单词?

【问题讨论】:

  • 您可以尝试将单词转换为嵌入,并测量它们的余弦距离。一对之间余弦距离短的词在意义上应该更接近。见deepset.ai/german-word-embeddings
  • 感谢您的建议!虽然余弦距离对我来说很有意义,但我不确定我是否理解嵌入转换部分。我已经有了(大部分)不同语法形式的单词。
  • 嵌入是向量。字典中的每个单词都对应一个向量。您可以从第一条评论中的链接下载预训练的嵌入模型(它基本上是一个词向量查找表)。
  • @EricL 谢谢,我会调查的。目前我只尝试了类似于这里给出的解决方案stackoverflow.com/questions/29484529/…,但结果与 Levenshtein 距离一样糟糕。
  • 你可以先词干。使用例如德语的雪球词干分析器。请参阅:snowball.tartarus.org/algorithms/german/stemmer.html。它基本上将一个单词简化为它的词干。如果您需要更多解释性聚类(例如“工作”类似于“工作”),您应该使用已经建议的一些嵌入。 youtube 上有很棒的视频解释了它是如何工作的

标签: python text nlp pyenchant enchant


【解决方案1】:

首先,Buch 和 Bücher 非常简单,因为它们只是同一个词的不同形态。对于 Buch 和 Bücher,字典中只有一个版本(称为 lemma)。碰巧,derdiedas 也只是引理 der 的不同形态。我们只需要计算单词的字典形式(引理)。 Spacy 有一个简单的方法来访问一个词的引理,例如:

import spacy
from collections import Counter

nlp = spacy.load('de')
words = ['der', 'die', 'das', 'eine', 'dass', 'Buch', 'Büchern', 'Arbeitsplatz-Management','Arbeitsplatz-Versicherung']
lemmas = [nlp(a)[0].lemma_ for a in words]
counter = Counter(lemmas)

结果计数器:

计数器({'der': 3, '艾宁': 1, “达斯”:1, “布赫”:2, 'Arbeitsplatz-管理':1, 'Arbeitsplatz-Versicherung': 1})

【讨论】:

  • 谢谢,但我确实在一开始就尝试了 spacy 并且 spacy.load('de') 给了我以下错误:“OSError: [E941] 找不到模型 'de'。看起来您正在尝试从快捷方式加载模型,该快捷方式在 spaCy v3.0 中已过时。要加载模型,请改用其全名:nlp = spacy.load("de_core_news_sm")"。因此,我尝试了他们建议的那个,但找不到模型。你知道我该如何解决这个问题吗?我从一开始就一直在努力解决这个问题,这就是我决定尝试其他方法的原因。
  • 你可能需要先下载模型:python -m spacy download de
  • 确实如此,然后使用 nlp = spacy.load("de_core_news_sm")。
猜你喜欢
  • 2020-12-12
  • 1970-01-01
  • 1970-01-01
  • 2018-01-14
  • 2020-05-26
  • 1970-01-01
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多