使用从这篇博客文章中提取的信息,我试图定义一个语法,其中包括添加日期作为一个新的块,语法如下;
grammar = r"""
NBAR:
{<NN.*|JJ>*<NN.*>} # Nouns and Adjectives, terminated with Nouns
NP:
{<NBAR>}
{<NBAR><IN><NBAR>} # Above, connected with in/of/etc...
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'
但是当我调用chunker = nltk.RegexpParser(grammar)
时,这抛出了一个非法的块模式,任何我如何包括日期的想法,这些日期总是用8位数字DD/MM/YYYY
表示,或者以长形式拼写月份,日期后跟顺序指示符st,nd, or th
,这样结果将是DDthMONTHYYYY
。
你把苹果和橘子混在一起了。根据RegexpParser
规则,只有前两个扩展是有效的,因此第三个扩展会出现错误。将其余部分转换为相同的格式:将分隔符从->
更改为:
,然后将展开写成RegexpParser
表达式。注意,您使用的是分块器,而不是层次解析器。(请参阅上述文档,以及NLTK书的所有第7章)