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

6 投票
1 回答
981 浏览
提问于 2025-04-16 06:52

我正在尝试在NLTK中使用Earley解析器来解析像这样的句子:

如果日期在2010年12月21日之前,那么序列号 = 10

为此,我想写一个上下文无关文法(CFG),但问题是我需要将日期和整数作为终结符的一般格式,而不是具体的数值。

有没有办法将生成规则的右侧指定为正则表达式,这样就可以处理这种情况呢?

比如说:

S -> '[0-9]+'

这样可以处理所有的整数。

1 个回答

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

这样做还可以让日期和月份用单个数字表示,增加了一些灵活性。

撰写回答