Python: Mengekstrak subjek dan frasa dependennya dari teks

Sep 12 2020

Saya mencoba mengikuti utas ( Bagaimana cara mengekstrak subjek dalam kalimat dan frasa dependen masing-masing? ). Saya juga ingin mengekstrak subjek dan ketergantungannya dari teks.

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

Ketika saya menjalankan kode di atas, muncul kesalahan berikut:

---------------------------------------------------------------------------
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'

Saya tidak yakin di mana saya membuat kesalahan. Adakah yang bisa membantu dalam memperbaiki masalah?

Jawaban

1 ktalik Sep 12 2020 at 13:11

Perpustakaan yang menarik.

Konteks Anda harus menjadi objek yang berbeda. Kesalahan mengatakan itu secara eksplisit. Lihat contoh resmi paket :

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

Sepertinya Anda memasukkan string sebagai textvariabel ke dalam baris ini

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

Gantikan baris 4 dengan

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.')

karena inilah yang mereka lakukan di postingan yang Anda referensikan.

Cara textini bukan string, tapi itu jenis apa pun yang dikeluarkan fungsi nlp, jadi ini berfungsi di baris ke-2 hingga terakhir.