web-dev-qa-db-ja.com

[orth、pos、tag、lema、text]のspaCyドキュメント

私は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_)の違いの値も出力します。

11
ahmed osama

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]
_
14
alvas

1)Wordを出力する場合、基本的には、クラスから文字列を出力するように設定されているspacyから Token クラスを出力します。あなたはもっと見ることができます ここ 。したがって、Word.orth_またはWord.textを印刷するのとは異なり、これらは文字列を直接印刷します。

2)Word.orth_についてはよくわかりませんが、ほとんどの場合Word.textのようです。 Word.lemma_の場合、これは特定の単語の語彙です。例: isamareは、Word.lemma_beにマップされます。

1
titipata