6
我試圖使用厄雷解析器NLTK來分析句子,如:使用整數/日期爲NLTK解析器終端
如果日期早於12/21/2010則串行= 10
要做到這一點,我試圖寫一個CFG,但問題是我需要有一個通用的日期和整數格式作爲終端,而不是具體的值。 是否有任何方法將生產規則的右側指定爲正則表達式,這將允許進行此類處理?
喜歡的東西:
S -> '[0-9]+'
這將處理所有的整數。
我試圖使用厄雷解析器NLTK來分析句子,如:使用整數/日期爲NLTK解析器終端
如果日期早於12/21/2010則串行= 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)))
這也提供在允許的日期,月,爲單位的形式有一定的靈活性。
您的日期格式依賴於語言環境。主要是ambigous(碰撞與數學表達式12 div 21 div 2010這可能不是你想要的 – VGE 2010-12-25 10:02:51
你是對的,但這將很容易處理,因爲輸入將永遠不會包含任何數學表達式,如你所說的。日期格式將被固定,比如MM/DD/YYYY。我找到了一種處理整數的方法,但我仍然在尋找適合日期的解決方案。 – FahimH 2011-01-03 04:20:41