繁体   English   中英

如何使用Stemmer或Lemmatizer阻止特定单词

[英]How to use Stemmer or Lemmatizer to stem specific word

我目前正在尝试阻止一个大型语料库(大约80万个句子)。 我设法只阻止了基本的一个。 现在的问题是,我只想词干一个特定的单词,例如,仅当引理是原始单词的子字符串时,此方法才适用。 例如,单词apples的后缀是apple和's'。 但是,如果不是子字符串,它将不会像牙齿一词一样将其拆分为牙齿。

我还阅读了lemmatizer WordNet,我们可以在其中添加pos的参数,例如动词,名词或形容词。 有没有一种方法可以应用上述方法?

提前致谢!

这里有一个完整的例子-

import nltk
from nltk.corpus import wordnet
from difflib import get_close_matches as gcm
from itertools import chain
from nltk.stem.porter import *

texts = [ " apples are good. My teeth will fall out.",
          " roses are red. cars are great to have"]

lmtzr = nltk.WordNetLemmatizer()
stemmer = PorterStemmer()

for text in texts:
    tokens = nltk.word_tokenize(text) # should sent tokenize it first
    token_lemma = [ lmtzr.lemmatize(token) for token in tokens ] # take your pick here between lemmatizer and wordnet synset.
    wn_lemma = [ gcm(word, list(set(list(chain(*[i.lemma_names() for i in wordnet.synsets(word)]))))) for word in tokens ]
    #print(wn_lemma) # works for unconventional words like 'teeth' --> tooth. You might want to take a closer look
    tokens_final = [ stemmer.stem(tokens[i]) if len(tokens[i]) > len(token_lemma[i]) else token_lemma[i] for i in range(len(tokens)) ]
    print(tokens_final)

输出量

['appl', 'are', 'good', '.', 'My', 'teeth', 'will', 'fall', 'out', '.']
['rose', 'are', 'red', '.', 'car', 'are', 'great', 'to', 'have']

说明

stemmer.stem(tokens[i]) if len(tokens[i]) > len(token_lemma[i]) else token_lemma[i]请注意stemmer.stem(tokens[i]) if len(tokens[i]) > len(token_lemma[i]) else token_lemma[i]这就是发生魔术的地方。 如果去词化的词是主词的子集,则该词会被词干,否则它只会被去词化。

注意

您尝试的词条化有一些极端情况。 WordnetLemmatizer不够智能,无法处理“牙齿”->“牙齿”等特殊情况。 在这些情况下,您可能想看看可能会派上用场的Wordnet.synset

我在评论中包括了一个小案例,供您调查。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM