tl; dr如何将词根和词性标签组合成完全修改过的词?
例如:
getText('easy', 'adjective', 'superlative') --> 'easiest'
getText('eat', 'verb', '3rd-person-singular') --> 'eats'
getText('spoon', 'noun', 'plural') --> 'spoons'
getText('swim', 'verb', 'past-participle') --> 'swum'
等
spaCy可以将此句子标记/解析为包含“TEXT”,“LEMMA”,词性标记(“POS”),详细词性标记(“TAG”)等的以下标记:
doc = nlp(u'Apple is looking at buying U.K. startup for $1 billion')
TEXT LEMMA POS TAG DEP SHAPE ALPHA STOP
Apple apple PROPN NNP nsubj Xxxxx True False
is be VERB VBZ aux xx True True
looking look VERB VBG ROOT xxxx True False
at at ADP IN prep xx True True
buying buy VERB VBG pcomp xxxx True False
U.K. u.k. PROPN NNP compound X.X. False False
...
我想来扭转这个过程 - 在给定特定“LEMMA”/“POS”/“TAG”组合的情况下获取“TEXT”字符串。
那就是
之类的东西getText(lemma="look", pos="verb", tag="vbg")
会返回"looking"
。
这可以在spaCy中进行,如果可以,怎么做?
如果没有,是否可以使用不同的库来取消root / lemmas和词性标注中的单词?
我知道pattern.en可以复数/共轭/ etc(“untokenize”?)单词,但使用spaCy更快的处理速度和python3兼容性会更好。
不想使用pattern.en的另一个原因:我想稍后对文本进行标记化,然后对文本进行无标记,并且为两者使用相同的库会更好。我发现spaCy在标记化方面要比pattern.en好得多。 (例如,pattern.en不会将“最简单”标记为“简单”,但spaCy会这样做。)
“tokenize”是指将一个句子分为单词词根和词性标签。
答案 0 :(得分:1)
据我所知,spaCy目前还没有内置的功能。但是,设置custom token attributes可以很容易地做一些类似于你要求的事情。例如,如果要为所有动词标记定义过去时共轭属性,可以创建一个VBD
函数并将其作为每个标记的getter应用为自定义属性,如下所示:
>>> import spacy
>>> nlp = spacy.load('en')
>>> def vbd(token):
... """a bad conjugation function"""
... if token.pos_ == 'VERB':
... return token.lemma_ + 'ed'
>>> spacy.tokens.Token.set_extension('vbd', getter=vbd, default=None)
>>> doc = nlp(u'Apple is looking at buying U.K. startup for $1 billion')
>>> for token in doc:
... print(token.text, ":", token._.vbd)
Apple : None
is : beed
looking : looked
at : None
buying : buyed
U.K. : None
startup : None
for : None
$ : None
1 : None
billion : None
正如您所看到的,该功能非常强大,因为它会吐出" beed"并且"买了",但"看起来"是正确的。
至于做结合的有力方法,pattern
是我遇到过的最好的图书馆。如果您使用正确的共轭函数替换vbd
函数,并为您想要的任何其他变形或变形定义函数,那么您将非常接近您的想象。这将允许您仅使用pattern
进行共轭,但使用spaCy
进行标记化和词形化。