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

Posted

技术标签:

【中文标题】在 NLTK 解析器中使用整数/日期作为终端【英文标题】:Using integers/dates as terminals in NLTK parser 【发布时间】:2011-05-08 02:01:20 【问题描述】:

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

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

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

类似:

S -> '[0-9]+'

它将处理所有整数。

【问题讨论】:

您的日期格式取决于区域设置。而且主要是模棱两可的(与数学表达式 12 div 21 div 2010 冲突,这可能不是您想要的 你是对的,但这很容易处理,因为输入永远不会包含你提到的任何数学表达式。日期格式也将是固定的,例如 MM/DD/YYYY。我找到了一种处理整数的方法,但我仍在寻找合适的日期解决方案。 【参考方案1】:

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

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

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

【讨论】:

以上是关于在 NLTK 解析器中使用整数/日期作为终端的主要内容,如果未能解决你的问题,请参考以下文章

NLTK 中用于解析的英语语法

带有 NLTK 的斯坦福依赖解析器:UnicodeDecodeError:

使用 buildSchema 时如何访问字段解析器中父解析器的值?

如何在 AppSync 解析器中使用多个过滤器表达式

GrapQHL Apollo Server,提取值并在解析器中使用它们

Prisma:在突变解析器中使用计数