从词根(引理)和spaCy中的词性(POS)标签中获取完全形成的单词“text”

问题描述 投票:1回答:1

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')

parsed tokens:

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中做,如果是,怎么做?

如果没有,是否可以使用不同的库来标记来自词根/词条和词性标签的单词?

我知道pattern.en可以复数/共轭/ etc(“unokenize”?)单词,但使用spaCy更快的处理速度和python3兼容性会更好。

不想使用pattern.en的另一个原因:我想稍后对它进行标记化,然后对文本进行非语音化,对两者使用相同的库会更好。我发现spaCy在标记化方面要比pattern.en好得多。 (例如,pattern.en不会将“最简单”标记为“简单”,但spaCy会这样做)。

通过“标记化”,我的意思是将句子分成单词根和词性标签。

python nlp spacy
1个回答
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”和“buyed”,但“看起来”是正确的。

至于做结合的强有力的方法,pattern是我遇到的最好的库。如果你用正确的共轭函数替换vbd函数,并为你想要的任何其他变形或变形定义函数,你将非常接近你想象的。这将允许您仅使用pattern进行共轭,但使用spaCy进行标记化和lemmatize。

© www.soinside.com 2019 - 2024. All rights reserved.