Разбор CFG сверху вниз в nltk с python 36

Я новичок в изучении НЛП. Я прочитал о CFG и хочу применить его при синтаксическом анализе и анализе снизу вверх. Я начал с разбора сверху вниз. Я хочу нарисовать дерево синтаксического анализа сверху вниз с помощью nltk и python 36. Я написал следующий код, но он не работает. что не так? Кто-нибудь может помочь мне улучшить код?

import nltk
from nltk.tag import pos_tag
from nltk.tokenize import word_tokenize
from nltk.tree import *
from nltk.draw import tree
from nltk import Nonterminal, nonterminals, Production, CFG
from nltk.parse import RecursiveDescentParser
text = input('Please enter a sentence: ')
words = text.split()
sentence = pos_tag(words)

grammar1 = nltk.CFG.fromstring("""
    S -> NP VP
    S -> VP
    VP -> V NP | V NP PP
    NP ->  Det N | Det N PP
    PP -> P NP
    V -> "saw" | "ate" | "walked" | "book" | "prefer" | "sleeps"
    Det -> "a" | "an" | "the" | "my" | "that"
    N -> "man" | "dog" | "cat" | "telescope" | "park" | "flight" | "apple"
    P -> "in" | "on" | "by" | "with"
     """)

rd = nltk.RecursiveDescentParser(grammar1, "Input")
result = rd.parse(sentence)
result.draw()

Я ввел этот текст для разбора "Книга, что полет".

1 ответ

В следующий раз, когда вы зададите вопрос, не говорите "это не работает". Объясните, где происходит сбой и что происходит (включая трассировку стека и сообщение об ошибке, если происходит сбой с ошибкой).

С вашим кодом есть две проблемы: Аргумент "Input" не принадлежит в конструкторе парсера. Я не знаю, откуда ты это взял, но избавься от этого. Во-вторых, грамматики CFG выполняют свою собственную маркировку POS. Передайте список простых слов words парсеру.

rd = nltk.RecursiveDescentParser(grammar1)
result = rd.parse(words)
Другие вопросы по тегам