propn python nlp cython spacy

python - propn - spaCy Documentación para



spacy tags (2)

1) Cuando imprime una word , básicamente imprime Token class desde spacy, que está configurado para imprimir cadena de la clase. Puedes ver más aquí . Por lo tanto, es diferente de imprimir word.orth_ o word.text donde estos imprimirán cadena directamente.

2) No estoy seguro acerca de word.orth_ , parece que es word.text para la mayoría de los casos. Para word.lemma_ , es la lematización de la palabra dada, por ejemplo, am , am , voy a mapear para be en word.lemma_ .

Soy nuevo en el spaCy. Agregué esta publicación para documentación y la hago simple para principiantes como yo.

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_)

Estoy buscando entender el significado de orth, lemma, tag y pos? Este código imprime los valores también cuál es la diferencia entre print(word) vs print(word.orth_)


¿Cuál es el significado de orth, lemma, tag y pos?

Ver https://spacy.io/docs/usage/pos-tagging#pos-schemes

Qué diferencia entre print (word) vs print (word.orth_)

En súper corto:

word.orth_ y word.text son lo mismo. El hecho de que la propiedad cython termine con un guión bajo, generalmente es una variable que los desarrolladores realmente no querían exponer al usuario.

En breve:

Cuando accede a la propiedad word.orth_ en https://github.com/explosion/spaCy/blob/develop/spacy/tokens/token.pyx#L537 , intenta acceder al índice de donde se guarda todo el vocabulario de las palabras :

property orth_: def __get__(self): return self.vocab.strings[self.c.lex.orth]

(Para más detalles, vea In long para la explicación de self.c.lex.orth )

Y word.text devuelve la representación de cadena de la palabra que simplemente se ajusta a la propiedad orth_ , consulte https://github.com/explosion/spaCy/blob/develop/spacy/tokens/token.pyx#L128.

property text: def __get__(self): return self.orth_

Y cuando imprime print(word) , llama a la función __repr__ dunder que devuelve la word.__unicode__ o word.__byte__ que apunta a la variable word.text , consulte 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__()

En larga:

Intentemos caminar paso a paso:

>>> import spacy >>> nlp = spacy.load(''en'') >>> doc = nlp(u''This is a foo bar sentence.'') >>> type(doc) <type ''spacy.tokens.doc.Doc''>

Después de pasar la oración a la función nlp() , produce un objeto spacy.tokens.doc.Doc , de los documentos:

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)]) """

Entonces, el objeto spacy.tokens.doc.Doc es una secuencia del objeto spacy.tokens.token.Token . Dentro del objeto Token , vemos una ola de property cython enumerada, por ejemplo, en 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] , vemos que 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

Sin una documentación exhaustiva, no sabemos realmente qué significa self.c , pero desde el punto de vista de ello, se está accediendo a uno de los tokens dentro de la referencia &self.doc apunta al Doc doc que se pasó a la función __cinit__ . Entonces, lo más probable es que sea un atajo para acceder a los tokens

Mirando el 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

Ahora vemos que el Doc.c se refiere a una matriz de puntero data_start que asigna la memoria para almacenar el objeto spacy.tokens.doc.Doc ( spacy.tokens.doc.Doc si obtengo la explicación <TokenC*> incorrecta).

Volviendo a self.c = &self.doc.c[offset] , básicamente intenta acceder al punto de memoria donde está almacenada la matriz y más específicamente acceder al elemento "offset-th" en la matriz.

Eso es lo que spacy.tokens.token.Token es.

Volviendo a la property :

property orth: def __get__(self): return self.c.lex.orth

Vemos que self.c.lex está accediendo al data_start[i].lex desde spacy.tokens.doc.Doc y self.c.lex.orth es simplemente un entero que indica el índice de la ocurrencia de la palabra que está mantenido en el vocabulario interno de spacy.tokens.doc.Doc .

Por lo tanto, vemos que la property orth_ intenta acceder a self.vocab.strings con el índice de 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]