2010-11-10 10 views
6

मैं NLTK में Earley पार्सर उपयोग करने के लिए इस तरह के रूप वाक्य पार्स करने के लिए कोशिश कर रहा हूँ पूर्णांकों/दिनांक का उपयोग करते हुए: अगर तिथि से पहले कीरूप NLTK पार्सर में टर्मिनलों

12/21/2010 तो धारावाहिक = 10

ऐसा करने के लिए, मैं एक CFG लिखने की कोशिश कर रहा हूँ, लेकिन समस्या मैं विशिष्ट मान के स्थान पर, दिनांक और टर्मिनलों के रूप में पूर्णांकों का एक सामान्य प्रारूप की आवश्यकता होती है। क्या नियमित अभिव्यक्ति के रूप में उत्पादन नियम के दाईं ओर निर्दिष्ट करने के कोई तरीके हैं, जो इस प्रकार की प्रसंस्करण की अनुमति देंगे?

कुछ की तरह:

S -> '[0-9]+' 

जो सभी पूर्णांकों संभाल होगा।

+0

आपका दिनांक प्रारूप लोकेल निर्भर है। और मुख्य रूप से ambigous है (एक गणितीय अभिव्यक्ति 12 div 21 div 2010 है जो शायद नहीं है के साथ भिड़ना है कि आप – VGE

+0

चाहते हैं तो आप सही हो लेकिन यह है कि संभाल करने के बाद से इनपुट आप क्या उल्लेख किया है जैसे किसी भी गणितीय अभिव्यक्ति होते हैं कभी नहीं होगा आसान हो जाएगा। इसके अलावा तिथि प्रारूप तय किया जाएगा, कहें, एमएम/डीडी/वाई वाई वाई। मुझे पूर्णांक को संभालने का एक तरीका मिला, लेकिन मैं अभी भी तिथियों के लिए उचित समाधान ढूंढ रहा हूं। – FahimH

उत्तर

2

इसके लिए काम करने के लिए, आप की तारीख tokenize करने के लिए इतना है कि प्रत्येक अंक और स्लेश एक अलग टोकन है की आवश्यकता होगी।

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

यह भी तारीख और महीने एकल अंक होने के लिए अनुमति देता है के रूप में कुछ लचीलापन मिलता।

संबंधित मुद्दे