Загрузка и редактирование файла cfg для разбора грамматики - PullRequest
0 голосов
/ 20 апреля 2019

Я следую указанным здесь шагам - http://www.nltk.org/book/ch10.html загружать и анализировать данные, используя файл cfg. Когда я использую код ниже, я не сталкиваюсь ни с какой проблемой.

cp = load_parser('grammars/book_grammars/sql0.fcfg')
query = 'What cities are located in China'
trees = list(cp.parse(query.split()))
answer = trees[0].label()['SEM']
answer = [s for s in answer if s]
q = ' '.join(answer)
print(q)

Что я хочу сделать, так это вынуть sql0.fcfg, внести в него изменения и снова загрузить его в анализатор, чтобы проверить его с моими собственными предложениями. Именно здесь я сталкиваюсь с проблемами.

Я скопировал содержимое файла sql0.fcg в текстовый файл, который хранится в моей локальной системе, переименовал его в .cfg, но когда я анализирую его, как показано ниже, я получаю сообщение об ошибке nltk.download ('C:' ).

cp = load_parser('C:/Users/212757677/Desktop/mygrammar.fcfg')

Второй метод, который я попробовал, состоял в том, чтобы скопировать грамматику из файла fcfg и попытаться загрузить ее следующим образом. Здесь я получаю сообщение об ошибке «Невозможно разобрать строку 2. Ожидаемая стрелка»

import nltk
groucho_grammar = nltk.CFG.fromstring("""
S[SEM=(?np + WHERE + ?vp)] -> NP[SEM=?np] VP[SEM=?vp]
VP[SEM=(?v + ?pp)] -> IV[SEM=?v] PP[SEM=?pp]
VP[SEM=(?v + ?ap)] -> IV[SEM=?v] AP[SEM=?ap]
NP[SEM=(?det + ?n)] -> Det[SEM=?det] N[SEM=?n]
PP[SEM=(?p + ?np)] -> P[SEM=?p] NP[SEM=?np]
AP[SEM=?pp] -> A[SEM=?a] PP[SEM=?pp]
NP[SEM='Country="greece"'] -> 'Greece'
NP[SEM='Country="china"'] -> 'China'
Det[SEM='SELECT'] -> 'Which' | 'What'
N[SEM='City FROM city_table'] -> 'cities'
IV[SEM=''] -> 'are'
A[SEM=''] -> 'located'
P[SEM=''] -> 'in'
""")
cp = load_parser(groucho_grammar)
query = 'What cities are located in China'
trees = list(cp.parse(query.split()))
answer = trees[0].label()['SEM']
answer = [s for s in answer if s]
q = ' '.join(answer)
print(q)

ValueError: Unable to parse line 2: S[SEM=(?np + WHERE + ?vp)] -> NP[SEM=?np] VP[SEM=?vp]
Expected an arrow

Я просто хочу отредактировать существующую грамматику в sql0.fcfg и проанализировать ее. Может кто-нибудь подсказать, как это сделать?

1 Ответ

0 голосов
/ 20 апреля 2019

Прототипом для nltk.load_parser является

nltk.load_parser(grammar_url, trace=0, parser=None, chart_class=None, beam_size=0, **load_args)

Обратите внимание, что первый аргумент - это URL, а не просто путь к файлу (см. Модуль данных документации для очень краткого объяснения).URL-адрес nltk начинается с протокола, за которым следует двоеточие, поэтому он будет интерпретировать C: как протокол.Вы, вероятно, должны быть явными: file:C:/Users/212757677/Desktop/mygrammar.fcfg.(Или, может быть, это file:///C:/Users/212757677/Desktop/mygrammar.fcfg - у меня нет машины с Windows, чтобы проверить его.)

nltk.load_parser угадывает формат грамматики на основе расширения имени файла.В этом случае вы загружаете грамматику функции (.fcfg), а не простой CFG.Если вы хотите создать синтаксический анализатор вручную, вам следует следовать примеру из инструкции NLTK по синтаксическому анализу грамматики функций .

...