2017-11-28 4 views
1

spaCyでステミングとリーマライズした後に、ワードがストップワードであるかどうかを検出する方法は?Spacyで補題の後にストップワードを検出する

somethingがストップワードである。この場合、文章

s = "something good\nsomethings 2 bad" 

と仮定する。明らかに(私に)Somethingsomethingsもストップワードですが、それは前に起ころうとする必要があります。次のスクリプトは、最初のものは真だが後者はそうではないと言います。

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を通じてこれを検出する方法はありますか?

答えて

2

spaCyのストップワードは、語彙の文脈に依存しないエントリ(英語のストップリストの場合はsee here)のフラグを設定する文字列のセットです。このフラグは、text in STOP_WORDSが「何か」がis_stopの場合はTrueを返し、「何か」が返されないのかどうかを単純にチェックします。しかし

、何できトークンの補題または小文字のフォームが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._.is_stopため、token._.を経由して利用できるようになります:

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 
+0

おかげで、これは良いですが、私は、Pythonレベルのメソッドを使用する必要がないであろうと期待していました。それは何か低いレベルを持っていることがうれしいです。これが唯一の選択肢だと思いますか? –

+1

Cython APIは、非常に低レベルのアクセスを望むなら、実際にはうまく動作します。 'Lexeme.set_struct_attr(lex_ptr、attr_id、attr_value)'を呼び出すと、値を語彙に設定できます。字句へのポインターは、 'vocab.get()'または 'doc.c [i] .lex'で探すことができます。後者では、同じ型のすべてのトークンが同じ字句構造体を指しているので、変更するconstを通してキャストする必要があります。 字句が共有されているという事実は、なぜ停止語がそのように振舞うのかを説明しています。字句にはフラグが設定されています。字句には正確な文字列が入ります。 –

関連する問題