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

标签 python regex parsing nltk earley-parser

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

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

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

类似于:

S -> '[0-9]+'

这将处理所有整数。

最佳答案

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

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

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

关于python - 在 NLTK 解析器中使用整数/日期作为终端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4148171/

相关文章:

regex - 使用正则表达式在字符串中精确匹配一次出现

java - 如何使用 apache.commons 中的 CSVParser 以任意顺序读取 CSV 列

javascript - 使用 PHP 解析原始获取数据

用于常见 javadoc 的 JavaDoc 解析器?

python - 使用Python在图像中创建 "spotlight"

python - 使用 Python 发送 Outlook 电子邮件的方法差异

regex - R中字符向量的快速转义/解析

python - 使用 sudo python 打开终端

python - 删除元组中的以下重复项

php - 使用RegEx在具有自定义格式的文件中查找语法错误