按相似度对单词进行分组
Grouping words by their similarity
我有大量 dictionary/dataframe 的德语单词,以及它们在庞大的文本语料库中出现的频率。例如:
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
有没有其他方法可以有效地聚类这些词?
首先,Buch 和 Bücher 非常简单,因为它们只是同一个词的不同形态。对于 Buch 和 Bücher,字典中只有一个版本(称为 lemma)。碰巧的是,der、die 和 das 也只是引理 [=18 的不同形态=]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)
计数器结果:
Counter({'der': 3,
'einen': 1,
'dass': 1,
'Buch': 2,
'Arbeitsplatz-Management': 1,
'Arbeitsplatz-Versicherung': 1})
我有大量 dictionary/dataframe 的德语单词,以及它们在庞大的文本语料库中出现的频率。例如:
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
有没有其他方法可以有效地聚类这些词?
首先,Buch 和 Bücher 非常简单,因为它们只是同一个词的不同形态。对于 Buch 和 Bücher,字典中只有一个版本(称为 lemma)。碰巧的是,der、die 和 das 也只是引理 [=18 的不同形态=]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)
计数器结果:
Counter({'der': 3, 'einen': 1, 'dass': 1, 'Buch': 2, 'Arbeitsplatz-Management': 1, 'Arbeitsplatz-Versicherung': 1})