Kompleks Chunking dengan NLTK

8

Saya mencoba mencari cara untuk menggunakan chunker cascading NLTK sesuai Bab 7 buku NLTK . Sayangnya, saya mengalami beberapa masalah saat melakukan tindakan chunking yang tidak sepele.

Mari kita mulai dengan frasa ini:

"adventure movies between 2000 and 2015 featuring performances by daniel craig"

Saya dapat menemukan semua NP yang relevan ketika saya menggunakan tata bahasa berikut:

grammar = "NP: {<DT>?<JJ>*<NN.*>+}"

Namun, saya tidak yakin bagaimana membangun struktur bersarang dengan NLTK. Buku ini memberikan format berikut, tetapi jelas ada beberapa hal yang hilang (mis. Bagaimana seseorang sebenarnya menentukan beberapa aturan?):

grammar = r"""
  NP: {<DT|JJ|NN.*>+}          # Chunk sequences of DT, JJ, NN
  PP: {<IN><NP>}               # Chunk prepositions followed by NP
  VP: {<VB.*><NP|PP|CLAUSE>+$} # Chunk verbs and their arguments
  CLAUSE: {<NP><VP>}           # Chunk NP, VP
  """

Dalam kasus saya, saya ingin melakukan sesuatu seperti berikut:

grammar = "MEDIA: {<DT>?<JJ>*<NN.*>+}
           RELATION: {<V.*>}{<DT>?<JJ>*<NN.*>+}
           ENTITY: {<NN.*>}"

Terpikir oleh saya bahwa CFG mungkin lebih cocok untuk ini, tetapi saya hanya mengetahui dukungan NLTK untuk fungsi ini sekitar 5 menit yang lalu (dari pertanyaan ini ), dan tampaknya tidak banyak dokumentasi untuk fitur ini ada.

Jadi, dengan asumsi bahwa saya ingin menggunakan chunker bertingkat untuk tugas saya, sintaks apa yang harus saya gunakan? Selain itu, apakah mungkin bagi saya untuk menentukan kata-kata tertentu (misalnya "diarahkan" atau "bertindak") ketika menggunakan chunker?

panggangan
sumber

Jawaban:

2

tata bahumu benar!

grammar = """MEDIA: {<DT>?<JJ>*<NN.*>+}
           RELATION: {<V.*>}
                     {<DT>?<JJ>*<NN.*>+}
           ENTITY: {<NN.*>}"""

dengan menentukan

RELATION: {<V.*>}
          {<DT>?<JJ>*<NN.*>+}

Anda menunjukkan bahwa ada dua cara untuk menghasilkan RELATIONpotongan yaitu {<V.*>}atau{<DT>?<JJ>*<NN.*>+}

begitu

grammar = """MEDIA: {<DT>?<JJ>*<NN.*>+}
               RELATION: {<V.*>}
                         {<DT>?<JJ>*<NN.*>+}
               ENTITY: {<NN.*>}"""
    chunkParser = nltk.RegexpParser(grammar)
    tagged = nltk.pos_tag(nltk.word_tokenize("adventure movies between 2000 and 2015 featuring performances by daniel craig"))

    tree = chunkParser.parse(tagged)

    for subtree in tree.subtrees():
        if subtree.label() == "RELATION": 
            print("RELATION: "+str(subtree.leaves()))

memberi

RELATION: [('featuring', 'VBG')]
AbtPst
sumber