Python: extraer el sujeto y sus frases dependientes del texto

Sep 12 2020

Estoy tratando de seguir el hilo ( ¿Cómo extraer sujetos en una oración y sus respectivas frases dependientes? ). También quiero extraer el tema y sus dependientes del texto.

import spacy
from textpipeliner import PipelineEngine, Context
from textpipeliner.pipes import *

text = 'No Offline Maps! It used to have offline maps but they disappeared. It now has a menu option to watch a video in exchange for maps but it never downloads the map. Makes the app useless to me.'

pipes_structure = [
    SequencePipe([
        FindTokensPipe("VERB/nsubj/*"),
        NamedEntityFilterPipe(),
        NamedEntityExtractorPipe()
    ]),
    FindTokensPipe("VERB"),
    AnyPipe([
        SequencePipe([
            FindTokensPipe("VBD/dobj/NNP"),
            AggregatePipe([
                NamedEntityFilterPipe("GPE"),
                NamedEntityFilterPipe("PERSON")
            ]),
            NamedEntityExtractorPipe()
        ]),
        SequencePipe([
            FindTokensPipe("VBD/**/*/pobj/NNP"),
            AggregatePipe([
                NamedEntityFilterPipe("LOC"),
                NamedEntityFilterPipe("PERSON")
            ]),
            NamedEntityExtractorPipe()
        ])
    ])
]

engine = PipelineEngine(pipes_structure, Context(text), [0, 1, 2])
engine.process()

Cuando ejecuté el código anterior, arroja el siguiente error:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-22-5f5a5c9e8e51> in <module>()
----> 1 engine = PipelineEngine(pipes_structure, Context(text), [0, 1, 2])
      2 engine.process()

~/anaconda3/lib/python3.6/site-packages/textpipeliner/context.py in __init__(self, doc)
      4         self._current_sent_idx = -1
      5         self._paragraph = self._sents[0:9]
----> 6         for s in doc.sents:
      7             self._sents.append(s)
      8         self.doc = doc

AttributeError: 'str' object has no attribute 'sents'

No estoy seguro de dónde estoy cometiendo el error. ¿Alguien podría ayudar a solucionar el problema?

Respuestas

1 ktalik Sep 12 2020 at 13:11

Interesante biblioteca.

Tu contexto debe ser un objeto diferente. El error lo dice explícitamente. Verifique el ejemplo oficial del paquete :

nlp = spacy.load("en")
text = nlp('No Offline Maps! It used to have offline maps but they disappeared. It now has a menu option to watch a video in exchange for maps but it never downloads the map. Makes the app useless to me.')
1 mazore Sep 12 2020 at 13:13

Parece que está pasando una cadena como textvariable en esta línea

engine = PipelineEngine(pipes_structure, Context(text), [0, 1, 2])

Reemplace la línea 4 con

nlp = spacy.load("en")
text = nlp('No Offline Maps! It used to have offline maps but they disappeared. It now has a menu option to watch a video in exchange for maps but it never downloads the map. Makes the app useless to me.')

ya que esto es lo que hacen en la publicación a la que hiciste referencia.

Esta forma textno es una cadena, pero es del tipo que escupe la función nlp, por lo que funciona en la 2ª a la última línea.