在NLTK解析器中使用整数/日期作为终端

时间:2010-11-10 19:17:56

标签: python regex parsing nltk earley-parser

我正在尝试使用NLTK中的Earley解析器来解析句子,例如:

如果日期在12/21/2010之前,那么serial = 10

要做到这一点,我正在尝试编写CFG,但问题是我需要将日期和整数的一般格式作为终端,而不是具体的值。 有没有办法将生产规则的右侧指定为正则表达式,这将允许这种处理?

类似的东西:

S -> '[0-9]+'

将处理所有整数。

1 个答案:

答案 0 :(得分:2)

为此,您需要对日期进行标记,以便每个数字和斜杠都是一个单独的标记。

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)))

这也提供了一些灵活性,允许日期和月份为单位数。