Python 在Spacy中的引理后检测停止字

Python 在Spacy中的引理后检测停止字,python,nlp,spacy,stop-words,lemmatization,Python,Nlp,Spacy,Stop Words,Lemmatization,如何在spaCy中进行词干分析和柠檬化后检测单词是否为停止词 服刑 s = "something good\nsomethings 2 bad" 在这种情况下,某物是一个停止词。显然(对我来说?Something和Something也是stopwords,但它需要在前面加词干。下面的脚本将说明第一个是正确的,但后一个不是 import spacy from spacy.tokenizer import Tokenizer nlp = spacy.load('en') tokenizer = T

如何在
spaCy
中进行词干分析和柠檬化后检测单词是否为停止词

服刑

s = "something good\nsomethings 2 bad"
在这种情况下,
某物
是一个停止词。显然(对我来说?
Something
Something
也是stopwords,但它需要在前面加词干。下面的脚本将说明第一个是正确的,但后一个不是

import spacy
from spacy.tokenizer import Tokenizer
nlp = spacy.load('en')
tokenizer = Tokenizer(nlp.vocab)

s = "something good\nSomething 2 somethings"
tokens = tokenizer(s)

for token in tokens:
  print(token.lemma_, token.is_stop)
返回:

something True
good False
"\n" False
Something False
2 False
somethings False

有没有办法通过
spaCy
API来检测spaCy中的停止词只是一组字符串,这些字符串在词汇表上设置了一个标志,即词汇表中与上下文无关的条目(用于英语停止列表)。该标志只是检查STOP\u WORDS中的
文本是否为
,这就是为什么
的“something”返回
True
是\u STOP
,而“something”不返回的原因

但是,您可以检查令牌的引理或小写形式是否是阻止列表的一部分,该列表可通过
nlp.Defaults.stop_words
获得(即您使用的语言的默认值):

如果您正在使用spaCy v2.0,并且希望更优雅地解决这个问题,您还可以通过一个。您可以为属性选择任何名称,它将通过
token.
,例如
token.\u.is\u stop

from spacy.tokens import Token
from spacy.lang.en.stop_words import STOP_WORDS  # import stop words from language data

stop_words_getter = lambda token: token.is_stop or token.lower_ in STOP_WORDS or token.lemma_ in STOP_WORDS
Token.set_extension('is_stop', getter=stop_words_getter)  # set attribute with getter

nlp = spacy.load('en')
doc = nlp("something Something somethings")
assert doc[0]._.is_stop  # this was a stop word before, and still is
assert doc[1]._.is_stop  # this is now also a stop word, because its lowercase form is
assert doc[2]._.is_stop  # this is now also a stop word, because its lemma is

谢谢,这很好,但我希望我不必使用Python级别的方法。能有低层次的东西就好了。你认为这是唯一的选择吗?如果你想要非常低级别的访问,Cython API实际上非常好用。您可以调用
Lexeme.set_struct_attr(lex_ptr,attr_id,attr_value)
在Lexeme上设置一个值。通过使用
vocab.get()
或从
doc.c[i].lex
查找词素,可以获得指向该词素的指针。对于后者,您需要通过const进行转换以进行修改,因为相同类型的所有标记都指向相同的lexeme结构。词素是共享的这一事实解释了为什么停止词的行为与它们一样:标记被设置在词素上,它由一个精确的字符串进行键控。
from spacy.tokens import Token
from spacy.lang.en.stop_words import STOP_WORDS  # import stop words from language data

stop_words_getter = lambda token: token.is_stop or token.lower_ in STOP_WORDS or token.lemma_ in STOP_WORDS
Token.set_extension('is_stop', getter=stop_words_getter)  # set attribute with getter

nlp = spacy.load('en')
doc = nlp("something Something somethings")
assert doc[0]._.is_stop  # this was a stop word before, and still is
assert doc[1]._.is_stop  # this is now also a stop word, because its lowercase form is
assert doc[2]._.is_stop  # this is now also a stop word, because its lemma is