Python: extraindo assunto e suas frases dependentes do texto
Estou tentando acompanhar o tópico ( Como extrair assuntos em uma frase e suas respectivas frases dependentes? ). Também quero extrair o assunto e seu dependente do 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()
Quando executei o código acima, ele gerou o seguinte erro:
---------------------------------------------------------------------------
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'
Não tenho certeza de onde estou cometendo o erro. Alguém poderia ajudar a corrigir o problema?
Respostas
Biblioteca interessante.
Seu contexto precisa ser um objeto diferente. O erro diz isso explicitamente. Veja o exemplo oficial do pacote :
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.')
Parece que você está passando uma string como a textvariável para esta linha
engine = PipelineEngine(pipes_structure, Context(text), [0, 1, 2])
Substitua a linha 4 por
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.')
pois isso é o que eles fazem na postagem que você referenciou.
Dessa forma, textnão é uma string, mas é qualquer tipo que a função nlp divulgue, então funciona da 2ª à última linha.