2010-11-10 52 views
6

我試圖使用厄雷解析器NLTK來分析句子,如:使用整數/日期爲NLTK解析器終端

如果日期早於12/21/2010則串行= 10

要做到這一點,我試圖寫一個CFG,但問題是我需要有一個通用的日期和整數格式作爲終端,而不是具體的值。 是否有任何方法將生產規則的右側指定爲正則表達式,這將允許進行此類處理?

喜歡的東西:

S -> '[0-9]+' 

這將處理所有的整數。

+0

您的日期格式依賴於語言環境。主要是ambigous(碰撞與數學表達式12 div 21 div 2010這可能不是你想要的 – VGE 2010-12-25 10:02:51

+0

你是對的,但這將很容易處理,因爲輸入將永遠不會包含任何數學表達式,如你所說的。日期格式將被固定,比如MM/DD/YYYY。我找到了一種處理整數的方法,但我仍然在尋找適合日期的解決方案。 – FahimH 2011-01-03 04:20:41

回答

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

這也提供在允許的日期,月,爲單位的形式有一定的靈活性。