单个词的空间词形还原
Spacy lemmatization of a single word
我正在尝试获取单个单词的词形还原版本。有没有办法使用 "spacy"(很棒的 python NLP 库)来做到这一点。
下面是我试过的代码,但这不起作用):
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_),但是单词 ( s) 我需要词形还原有些动态,无法作为大型文档处理。
我认为您遗漏了使用 spaCy 数据库作为词形还原参考的部分。如果您在下面看到我对您的代码所做的修改,并提供了输出。 duck
是 ducks
的正确 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
词形还原主要取决于标记的词性。只有具有相同词性的标记才会映射到相同的引理。
在句子"This is confusing"中,confusing
被解析为形容词,因此词形还原为confusing
。在句子"I was confusing you with someone else"中,相比之下,confusing
被分析为一个动词,并被词形化为confuse
。
如果您希望将具有不同词性的标记映射到相同的引理,您可以使用词干提取算法,例如 Porter Stemming (Java),您可以简单地调用每个令牌。
如果要对单个标记进行词形还原,请尝试简化文本处理库 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,但在禁用parser
和NER
管道组件后:
- 先下载一个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
使用 NLTK,只需:
>>> from nltk.stem import WordNetLemmatizer
>>> wnl = WordNetLemmatizer()
>>> wnl.lemmatize('ducks')
'duck'
我正在尝试获取单个单词的词形还原版本。有没有办法使用 "spacy"(很棒的 python NLP 库)来做到这一点。
下面是我试过的代码,但这不起作用):
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_),但是单词 ( s) 我需要词形还原有些动态,无法作为大型文档处理。
我认为您遗漏了使用 spaCy 数据库作为词形还原参考的部分。如果您在下面看到我对您的代码所做的修改,并提供了输出。 duck
是 ducks
的正确 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
词形还原主要取决于标记的词性。只有具有相同词性的标记才会映射到相同的引理。
在句子"This is confusing"中,confusing
被解析为形容词,因此词形还原为confusing
。在句子"I was confusing you with someone else"中,相比之下,confusing
被分析为一个动词,并被词形化为confuse
。
如果您希望将具有不同词性的标记映射到相同的引理,您可以使用词干提取算法,例如 Porter Stemming (Java),您可以简单地调用每个令牌。
如果要对单个标记进行词形还原,请尝试简化文本处理库 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,但在禁用parser
和NER
管道组件后:
- 先下载一个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
使用 NLTK,只需:
>>> from nltk.stem import WordNetLemmatizer
>>> wnl = WordNetLemmatizer()
>>> wnl.lemmatize('ducks')
'duck'