在 Spacy 中检测引理后的停用词
Detect stopword after lemma in Spacy
如何在 spaCy
中进行词干提取和词形还原后检测词是否为停用词?
假设句
s = "something good\nsomethings 2 bad"
在这种情况下 something
是停用词。显然(对我而言?)Something
和 somethings
也是停用词,但需要先进行词干提取。下面的脚本会说第一个是真的,但后者不是。
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)
Returns:
something True
good False
"\n" False
Something False
2 False
somethings False
有没有办法通过 spaCy
API 来检测?
spaCy 中的停用词只是一组字符串,它在词素上设置了一个标志,词汇表中与上下文无关的条目(see here 用于英语停用列表)。该标志只是检查是否 text in STOP_WORDS
,这就是为什么 "something" returns True
用于 is_stop
而 "somethings" 没有。
但是,您 可以 做的是检查令牌的引理或小写形式是否是停止列表的一部分,可通过 nlp.Defaults.stop_words
(即默认值您使用的语言):
def extended_is_stop(token):
stop_words = nlp.Defaults.stop_words
return token.is_stop or token.lower_ in stop_words or token.lemma_ in stop_words
如果您使用的是 spaCy v2.0 并且想更优雅地解决这个问题,您也可以通过 custom Token
attribute extension 实现您自己的 is_stop
函数。您可以为您的属性选择任何名称,它将通过 token._.
可用,例如 token._.is_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
如何在 spaCy
中进行词干提取和词形还原后检测词是否为停用词?
假设句
s = "something good\nsomethings 2 bad"
在这种情况下 something
是停用词。显然(对我而言?)Something
和 somethings
也是停用词,但需要先进行词干提取。下面的脚本会说第一个是真的,但后者不是。
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)
Returns:
something True
good False
"\n" False
Something False
2 False
somethings False
有没有办法通过 spaCy
API 来检测?
spaCy 中的停用词只是一组字符串,它在词素上设置了一个标志,词汇表中与上下文无关的条目(see here 用于英语停用列表)。该标志只是检查是否 text in STOP_WORDS
,这就是为什么 "something" returns True
用于 is_stop
而 "somethings" 没有。
但是,您 可以 做的是检查令牌的引理或小写形式是否是停止列表的一部分,可通过 nlp.Defaults.stop_words
(即默认值您使用的语言):
def extended_is_stop(token):
stop_words = nlp.Defaults.stop_words
return token.is_stop or token.lower_ in stop_words or token.lemma_ in stop_words
如果您使用的是 spaCy v2.0 并且想更优雅地解决这个问题,您也可以通过 custom Token
attribute extension 实现您自己的 is_stop
函数。您可以为您的属性选择任何名称,它将通过 token._.
可用,例如 token._.is_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