Я пытаюсь использовать NLTK для семантического разбора голосовых навигационных команд, таких как «поехать в Сан-Франциско», «проложить маршрут до 123 Main Street» и т. д.
Это можно сделать с помощью довольно простой грамматики CFG, такой как
S -> COMMAND LOCATION
COMMAND -> "go to" | "give me directions to" | ...
LOCATION -> CITY | STREET | ...
Проблема в том, что это включает в себя неатомарные (длиной более одного слова) литералы, такие как «перейти к», для которых NLTK, похоже, не настроен (поправьте меня, если я ошибаюсь). Задача синтаксического анализа требует тегирования в качестве предварительного условия, и все тегировщики, кажется, всегда помечают отдельные слова. Итак, мои варианты выглядят так:
a) Определите настраиваемый тегировщик, который может назначать несинтаксические теги последовательностям слов, а не отдельным словам (например, «перейти»: «КОМАНДА»). б) Используйте функции для дополнения грамматики, например, что-то вроде:
COMMAND -> VB[sem='go'] P[sem='to'] | ...
c) Используйте блокировщик для извлечения подструктур, таких как COMMAND, затем примените анализатор к результату. Разрешает ли NLTK каскадирование чанкеров-> парсеров?
Некоторые из этих вариантов кажутся запутанными (хаки). Есть ли хороший способ?