私はspaCyを初めて使用します。この投稿をドキュメント用に追加し、初心者でも簡単にできるようにしました。
_import spacy
nlp = spacy.load('en')
doc = nlp(u'KEEP CALM because TOGETHER We Rock !')
for Word in doc:
print(Word.text, Word.lemma, Word.lemma_, Word.tag, Word.tag_, Word.pos, Word.pos_)
print(Word.orth_)
_
Orth、lemma、tag、posの意味を理解しようとしていますか?このコードは、print(Word)
とprint(Word.orth_)
の違いの値も出力します。
Orth、lemma、tag、posの意味は何ですか?
https://spacy.io/docs/usage/pos-tagging#pos-schemes を参照してください
Print(Word)とprint(Word.orth_)の違い
要するに:
_Word.orth_
_と_Word.text
_は同じです。 cythonプロパティがアンダースコアで終わるという事実は、通常、開発者がユーザーに公開したくない変数です。
要するに:
https://github.com/explosion/spaCy/blob/develop/spacy/tokens/token.pyx#L537 で_Word.orth_
_プロパティにアクセスすると、インデックスにアクセスしようとします単語のすべての語彙が保持されている場所の:
_property orth_:
def __get__(self):
return self.vocab.strings[self.c.Lex.orth]
_
(詳細については、以下の_In long
_の説明について_self.c.Lex.orth
_を参照してください)
そして、_Word.text
_は、単に_orth_
_プロパティをラップするWordの文字列表現を返します。 https://github.com/explosion/spaCy/blob/develop/spacy/tokens/を参照) token.pyx#L128
_property text:
def __get__(self):
return self.orth_
_
また、print(Word)
を出力すると、___repr__
_変数を指す_Word.__unicode__
_または_Word.__byte__
_を返す_Word.text
_ dunder関数が呼び出されます。 https://github.com/explosion/spaCy/blob/develop/spacy/tokens/token.pyx#L55 を参照してください
_cdef class Token:
"""
An individual token --- i.e. a Word, punctuation symbol, whitespace, etc.
"""
def __cinit__(self, Vocab vocab, Doc doc, int offset):
self.vocab = vocab
self.doc = doc
self.c = &self.doc.c[offset]
self.i = offset
def __hash__(self):
return hash((self.doc, self.i))
def __len__(self):
"""
Number of unicode characters in token.text.
"""
return self.c.Lex.length
def __unicode__(self):
return self.text
def __bytes__(self):
return self.text.encode('utf8')
def __str__(self):
if is_config(python3=True):
return self.__unicode__()
return self.__bytes__()
def __repr__(self):
return self.__str__()
_
長い間:
このステップをステップバイステップで見ていきましょう。
_>>> import spacy
>>> nlp = spacy.load('en')
>>> doc = nlp(u'This is a foo bar sentence.')
>>> type(doc)
<type 'spacy.tokens.doc.Doc'>
_
文がnlp()
関数に渡された後、ドキュメントから _spacy.tokens.doc.Doc
_ オブジェクトが生成されます。
_cdef class Doc:
"""
A sequence of `Token` objects. Access sentences and named entities,
export annotations to numpy arrays, losslessly serialize to compressed
binary strings.
Aside: Internals
The `Doc` object holds an array of `TokenC` structs.
The Python-level `Token` and `Span` objects are views of this
array, i.e. they don't own the data themselves.
Code: Construction 1
doc = nlp.tokenizer(u'Some text')
Code: Construction 2
doc = Doc(nlp.vocab, orths_and_spaces=[(u'Some', True), (u'text', True)])
"""
_
したがって、_spacy.tokens.doc.Doc
_オブジェクトは _spacy.tokens.token.Token
_ オブジェクトのシーケンスです。 Token
オブジェクト内に、列挙されたcython property
の波が表示されます。 https://github.com/explosion/spaCy/blob/develop/spacy/tokens/token.pyx#L162
_property orth:
def __get__(self):
return self.c.Lex.orth
_
さかのぼると、_self.c = &self.doc.c[offset]
_:
_cdef class Token:
"""
An individual token --- i.e. a Word, punctuation symbol, whitespace, etc.
"""
def __cinit__(self, Vocab vocab, Doc doc, int offset):
self.vocab = vocab
self.doc = doc
self.c = &self.doc.c[offset]
self.i = offset
_
完全なドキュメントがないと、_self.c
_の意味はわかりませんが、その外観からは、に渡された_&self.doc
_を指す_Doc doc
_参照内のトークンの1つにアクセスしています。 ___cinit__
_関数。おそらく、トークンにアクセスするためのショートカットです
_Doc.c
_を見てください:
_cdef class Doc:
def __init__(self, Vocab vocab, words=None, spaces=None, orths_and_spaces=None):
self.vocab = vocab
size = 20
self.mem = Pool()
# Guarantee self.Lex[i-x], for any i >= 0 and x < padding is in bounds
# However, we need to remember the true starting places, so that we can
# realloc.
data_start = <TokenC*>self.mem.alloc(size + (PADDING*2), sizeof(TokenC))
cdef int i
for i in range(size + (PADDING*2)):
data_start[i].Lex = &EMPTY_LEXEME
data_start[i].l_Edge = i
data_start[i].r_Edge = i
self.c = data_start + PADDING
_
これで、_Doc.c
_が_data_start
_オブジェクトを格納するためにメモリを割り当てるcythonポインタ配列_spacy.tokens.doc.Doc
_を参照していることがわかります(説明が表示されたら訂正してください_<TokenC*>
_違う)。
したがって、_self.c = &self.doc.c[offset]
_に戻ると、基本的には、配列が格納されているメモリポイントにアクセスしようとしています。具体的には、配列の「オフセット番目」の項目にアクセスしようとしています。
それが_spacy.tokens.token.Token
_です。
property
に戻ります:
_property orth:
def __get__(self):
return self.c.Lex.orth
_
_self.c.Lex
_が _data_start[i].Lex
_ from _spacy.tokens.doc.Doc
_ にアクセスしており、_self.c.Lex.orth
_は単に単語の出現のインデックスを示す整数であることがわかります。それは_spacy.tokens.doc.Doc
_内部語彙に保持されます。
したがって、_property orth_
_が_self.vocab.strings
_からのインデックスを使用して_self.c.Lex.orth
_にアクセスしようとしていることがわかります https://github.com/explosion/spaCy/blob/develop/spacy/ tokens/token.pyx#L162
_property orth_:
def __get__(self):
return self.vocab.strings[self.c.Lex.orth]
_