我一直在测试不同的python lemmatizers作为我正在构建的解决方案。我遇到的一个难题是,词干提取器生成的非英语单词不适用于我的用例。尽管词干提取器正确地将“政治”和“政治”归于同一词干,但我想使用词形修饰符来做到这一点,但是spacy和nltk却对“政治”和“政治”使用了不同的词。有谁知道更强大的lemmatizer?我理想的解决方案如下所示:

from nltk.stem import WordNetLemmatizer

lemmatizer = WordNetLemmatizer()

print("political = ", lemmatizer.lemmatize("political"))
print("politics = ", lemmatizer.lemmatize("politics"))


返回:

political =  political
politics =  politics


我要返回的地方:

political =  politics
politics =  politics

最佳答案

首先,引理不是您所想的“根”字。它只是字典中存在的一种形式,对于NLTK WordNetLemmatizer中的英语,字典是WordNet,并且只要字典条目在WordNet中是引理,就存在“政治”和“政治”条目,因此它们是有效的引理:

from itertools import chain
print(set(chain(*[ss.lemma_names() for ss in wn.synsets('political')])))
print(set(chain(*[ss.lemma_names() for ss in wn.synsets('politics')])))


[出]:

{'political'}
{'political_sympathies', 'political_relation', 'government', 'politics', 'political_science'}


也许还有其他工具可以做到这一点,但是我将首先尝试它。

首先,将所有引理名称词干,并用相同的词干对引理进行分组:

from collections import defaultdict

from wn import WordNet
from nltk.stem import PorterStemmer

porter = PorterStemmer()
wn = WordNet()

x = defaultdict(set)
i = 0
for lemma_name in wn.all_lemma_names():
    if lemma_name:
        x[porter.stem(lemma_name)].add(lemma_name)
        i += 1


注意:pip install -U wn

然后,作为健全性检查,我们检查是否存在。引理数>不。组:

print(len(x.keys()), i)


[出]:

(128442, 147306)


然后,我们可以看一下分组:

for k in sorted(x):
    if len(x[k]) > 1:
        print(k, x[k])


看来我们需要做的事情就是将这些单词与它们的“根词”组合在一起,例如

poke {'poke', 'poking'}
polar {'polarize', 'polarity', 'polarization', 'polar'}
polaris {'polarisation', 'polarise'}
pole_jump {'pole_jumping', 'pole_jumper', 'pole_jump'}
pole_vault {'pole_vaulter', 'pole_vault', 'pole_vaulting'}
poleax {'poleaxe', 'poleax'}
polem {'polemically', 'polemics', 'polemic', 'polemical', 'polemize'}
police_st {'police_state', 'police_station'}
polish {'polished', 'polisher', 'polish', 'polishing'}
polit {'politics', 'politic', 'politeness', 'polite', 'politically', 'politely', 'political'}
poll {'poll', 'polls'}


但是,如果我们仔细观察,就会有些困惑:

polit {'politics', 'politic', 'politeness', 'polite', 'politically', 'politely', 'political'}


所以我建议下一步是

再次遍历这些分组并运行一些语义并检查单词的“相关性”并拆分可能不相关的单词,例如,尝试使用通用句子编码器之类的方法。 https://colab.research.google.com/drive/1BM-eKdFb2G2zXqNt3dHgVm4gH8PaPJOq(可能不是一件简单的任务)

或做一些手动工作并重新排列分组。 (工作负担很重,已经由搬运工词干在分组中完成,现在是时候进行一些人工工作了)

然后您必须以某种方式在每组单词中找到词根(即集群的原型/标签)。

最后,使用您创建的词组资源,您将无法“找到词根”。

关于python - python lemmatizer,将“政治”和“政治”词化为同一个词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56024637/

10-09 04:50