Spacy单词词形还原

6

我想获取单词的词形还原版本。是否可以使用"spacy"(一款非常棒的Python自然语言处理库)来实现这一点。

以下是我尝试过的代码,但并不能成功:

from spacy.lemmatizer import Lemmatizer
from spacy.lookups import Lookups
lookups = Lookups()
lemmatizer = Lemmatizer(lookups)
word = "ducks"
lemmas = lemmatizer.lookup(word)
print(lemmas)

我希望的结果是将“ducks”(复数)转换为“duck”(单数),但返回的仍然是“ducks”(复数)。是否有方法可以实现这一点?

注意:我意识到我可以处理整个文档中的单词字符串(nlp(document)),然后找到所需的令牌,再获取其引理(token.lemma_),但我需要引理化的单词有些动态,并不能作为大型文档进行处理。

4个回答

7
如果您想对单个令牌进行词形还原,可以尝试简化的文本处理库TextBlob
from textblob import TextBlob, Word
# Lemmatize a word
w = Word('ducks')
w.lemmatize()

输出

> duck

或者NLTK
import nltk
from nltk.stem import SnowballStemmer
stemmer = nltk.stem.SnowballStemmer('english')
stemmer.stem('ducks')

输出

> duck

否则,您可以继续使用 spaCy,但要在禁用parserNER管道组件后进行:
  • 首先下载一个12M小型模型(基于OntoNotes训练的英语多任务CNN)。
$ python -m spacy download en_core_web_sm
  • Python 代码
import spacy
nlp = spacy.load('en_core_web_sm', disable=['parser', 'ner']) # just keep tagger for lemmatization
" ".join([token.lemma_ for token in nlp('ducks')])

输出

> duck

2
我认为你忽略了使用spaCy数据库作为词形还原的参考部分。如果你看一下我在你的代码下面所做的修改,并提供输出,你会发现duckducks的正确lemma_
import spacy
from spacy.lemmatizer import Lemmatizer
from spacy.lookups import Lookups
lookups = Lookups()
lemmatizer = Lemmatizer(lookups)

word = "ducks"
#load spacy core database
nlp = spacy.load('en_core_web_sm')
#run NLP on input/doc
doc = nlp(word)
#Print formatted token attributes
print("Token Attributes: \n", "token.text, token.pos_, token.tag_, token.dep_, token.lemma_")
for token in doc:
    # Print the text and the predicted part-of-speech tag
    print("{:<12}{:<12}{:<12}{:<12}{:<12}".format(token.text, token.pos_, token.tag_, token.dep_, token.lemma_))

输出

Token Attributes: 
 token.text, token.pos_, token.tag_, token.dep_, token.lemma_
ducks       NOUN        NNS         ROOT        duck               

词形归一化(Lemmatization)非常依赖于单词的词性。只有相同词性的单词才会映射到相同的词形。在句子“This is confusing”中,“confusing”被分析为形容词,因此它的词形还是“confusing”。相比之下,在句子“I was confusing you with someone else”中,“confusing”被分析为动词,词形被还原为“confuse”。
如果您想将不同词性的单词映射到同一个词形,您可以使用词干提取算法,例如波特词干提取(Java),您可以对每个单词简单地调用该算法。

有没有一种方法可以对每个单词进行词形还原(而不是词干提取),而不依赖于该单词的词性(使用SpaCy)? - Nina

0

你可以使用spacy对单个单词进行词形还原,方法如下:

nlp = spacy.load("en_core_web_lg")
lemmatizer = nlp.get_pipe("lemmatizer")
my_word = "lemmatizing"
lemmatizer.lemmatize(nlp(my_word)[0]) # this method accepts only token object

这将输出所有可能的词形变化:

['lemmatize', 'lemmatiz']

0
使用NLTK,简单地说:
>>> from nltk.stem import WordNetLemmatizer
>>> wnl = WordNetLemmatizer()
>>> wnl.lemmatize('ducks')
'duck'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接