gpt4 book ai didi

java - 如何使用 Stemmer 或 Lemmatizer 来提取特定单词的词干

转载 作者:太空宇宙 更新时间:2023-11-04 10:40:01 26 4
gpt4 key购买 nike

我目前正在尝试阻止一个大语料库(大约 800k 个句子)。我已经成功地只阻止了基本的一个。现在的问题是我只想提取特定单词的词干,例如此方法仅适用于引理是原始单词的子字符串的情况。例如,“苹果”一词的后缀是“苹果”和“s”。但如果不是子串,它不会像单词“tooths” split 成“tooth”一样将其拆分。

我还阅读了有关词形还原器 WordNet 的内容,我们可以在其中添加动词、名词或形容词等词性参数。有没有办法可以应用上面的方法?

提前致谢!

最佳答案

这里有一个完整的例子 -

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] 这就是神奇发生的地方。如果词形还原的单词是主词的子集,则该词将被词干化,否则它仅保持词形还原。

注意

您尝试的词形还原存在一些边缘情况。 WordnetLemmatizer 不够智能,无法处理“teeth”-->“tooth”等特殊情况。在这些情况下,您可能需要查看Wordnet.synset,它可能会派上用场。

我在评论中添加了一个小案例供您调查。

关于java - 如何使用 Stemmer 或 Lemmatizer 来提取特定单词的词干,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49094311/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com