0

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

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

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

4

1 回答 1

2

首先,Buch 和 Bücher非常简单,因为它们只是同一个词的不同形态。对于 Buch 和 Bücher,字典中只有一个版本(称为引理)。碰巧,derdiedas也只是引理的不同形态。我们只需要计算单词的字典形式(引理)。 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)

结果计数器:

Counter({'der': 3, 'einen': 1, 'dass': 1, 'Buch': 2, 'Arbeitsplatz-Management': 1, 'Arbeitsplatz-Versicherung': 1})

于 2021-09-13T12:03:59.907 回答