Использование целых чисел / дат в качестве терминалов в анализаторе NLTK - PullRequest
6 голосов
/ 10 ноября 2010

Я пытаюсь использовать анализатор Earley в NLTK для разбора предложений, таких как:

Если дата до 21.12.2010, то serial = 10

Для этого я пытаюсь написать CFG, но проблема в том, что мне нужно иметь общий формат дат и целых чисел в качестве терминалов вместо конкретных значений.Есть ли способы указать правую часть производственного правила как регулярное выражение, которое бы разрешало такую ​​обработку?

Что-то вроде:

S -> '[0-9]+'

, который обрабатывал бы все целые числа.

1 Ответ

2 голосов
/ 04 июня 2011

Чтобы это работало, вам нужно токенизировать дату, чтобы каждая цифра и косая черта были отдельным токеном.

from nltk.parse.earleychart import EarleyChartParser
import nltk

grammar = nltk.parse_cfg("""
DATE -> MONTH SEP DAY SEP YEAR
SEP -> "/"
MONTH -> DIGIT | DIGIT DIGIT
DAY -> DIGIT | DIGIT DIGIT
YEAR -> DIGIT DIGIT DIGIT DIGIT
DIGIT -> '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '0'
""")

parser = EarleyChartParser(grammar)
print parser.parse(["1", "/", "1", "0", "/", "1", "9", "8", "7"])

Вывод:

(DATE
  (MONTH (DIGIT 1))
  (SEP /)
  (DAY (DIGIT 1) (DIGIT 0))
  (SEP /)
  (YEAR (DIGIT 1) (DIGIT 9) (DIGIT 8) (DIGIT 7)))

Это также обеспечивает некоторую гибкость в том смысле, что даты и месяцы могут быть однозначными.

...