NLTKのEarleyパーサーを使用して、次のような文を解析しようとしています。
日付が2010年12月21日より前の場合、シリアル= 10
これを行うには、CFGを作成しようとしていますが、問題は、特定の値ではなく、日付と整数の一般的な形式を端末として使用する必要があることです。プロダクションルールの右辺を正規表現として指定する方法はありますか?これにより、この種の処理が可能になりますか?
何かのようなもの:
S -> '[0-9]+'
これはすべての整数を処理します。
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)))
これにより、日付と月を 1 桁にできるという形である程度の柔軟性が得られます。