从 spaCy 中的词根 (lemma) 和词性 (POS) 标签中获取完全形成的词 "text"
Get fully formed word "text" from word root (lemma) and part-of-speech (POS) tags in spaCy
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可以将这句话tokenize/parse转化为以下包含"TEXT"、"LEMMA"、词性标签("POS")、详细词性标签("TAG"), 等等:
doc = nlp(u'Apple is looking at buying U.K. startup for 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"/[= 的情况下得到一个 "TEXT" 字符串66=]组合。
也就是说,
getText(lemma="look", pos="verb", tag="vbg")
会return"looking"
.
这可以在 spaCy 中实现吗?如果可以,怎么做?
如果不是,是否可以对 roots/lemmas 中的单词和不同库的词性标签进行取消标记?
我知道pattern.en可以pluralize/conjugate/etc("untokenize"?)的话,但是如果使用spaCy更快的处理速度和python3的兼容性就好了。
不想使用 pattern.en 的另一个原因:我想对文本进行标记化,然后再取消标记化,最好为两者使用相同的库。我发现 spaCy 在标记化方面比 pattern.en 好得多。 (例如 pattern.en 不会将 "easiest" 标记为 "easy",但 spaCy 会。
"tokenize"我的意思是把一个句子分成词根和词性标签。
据我所知,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 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",但 "looked" 是正确的。
至于进行结合的可靠方法,pattern
是我遇到的最好的库。如果您将 vbd
函数替换为正确的共轭函数,并为您想要的任何其他共轭或词形变化定义函数,您将非常接近您的想象。这将允许您仅将 pattern
用于共轭,但使用 spaCy
进行标记化和词形还原。
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可以将这句话tokenize/parse转化为以下包含"TEXT"、"LEMMA"、词性标签("POS")、详细词性标签("TAG"), 等等:
doc = nlp(u'Apple is looking at buying U.K. startup for 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"/[= 的情况下得到一个 "TEXT" 字符串66=]组合。
也就是说,
getText(lemma="look", pos="verb", tag="vbg")
会return"looking"
.
这可以在 spaCy 中实现吗?如果可以,怎么做?
如果不是,是否可以对 roots/lemmas 中的单词和不同库的词性标签进行取消标记?
我知道pattern.en可以pluralize/conjugate/etc("untokenize"?)的话,但是如果使用spaCy更快的处理速度和python3的兼容性就好了。
不想使用 pattern.en 的另一个原因:我想对文本进行标记化,然后再取消标记化,最好为两者使用相同的库。我发现 spaCy 在标记化方面比 pattern.en 好得多。 (例如 pattern.en 不会将 "easiest" 标记为 "easy",但 spaCy 会。
"tokenize"我的意思是把一个句子分成词根和词性标签。
据我所知,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 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",但 "looked" 是正确的。
至于进行结合的可靠方法,pattern
是我遇到的最好的库。如果您将 vbd
函数替换为正确的共轭函数,并为您想要的任何其他共轭或词形变化定义函数,您将非常接近您的想象。这将允许您仅将 pattern
用于共轭,但使用 spaCy
进行标记化和词形还原。