2013-10-16 8 views
5

मैं एक प्रोग्राम लिखने की कोशिश कर रहा हूं जो दो वाक्यों में लगेगा और जांचें कि वे समान हैं या नहीं। मैं एक पूर्ण पार्सर का उपयोग नहीं करना चाहता था, और एक साधारण व्याकरण का उपयोग करके एक बनाया जो मुझे लगता है कि मुझे अक्सर सामना करना पड़ेगा। अब, मेरी रुचि वाक्यों में संज्ञा वाक्यांशों में है। संज्ञा वाक्यांशों के रूप में टैग की गई उपट्री की समानता की जांच करना काफी आसान होगा। मैं इसमें और जोड़ना चाहता हूं, और उपयोगकर्ता को यह तय करने दें कि क्या लापता/मेल नहीं खाता निर्धारक स्वीकार किए जाते हैं (आंशिक मिलान)।दो समान, गैर-समान एनएलटीके पेड़ों की तुलना

आउटपुट पेड़ फॉर्म का है (एस (एनपी द/डीटी बैग/एनएन)/वीबीजेड (जेपी ब्लू/जेजे) है, जहां मैंने व्याकरण संज्ञा वाक्यांश (एनपी) और विशेषण वाक्यांश (जेपी) परिभाषित किया है।

  • प्रासंगिक पेड़ों में निर्धारक नोड्स को हटाने के लिए और फिर तुलना
  • एक आम मूल्य के लिए सभी निर्धारक नोड्स के मान बदलने के लिए:

    मिलान के बारे में जाने के लिए, मैं कुछ मार्गों पर विचार किया है , कहें, एक्स

  • सभी पत्ती नोड्स की एक सूची बनाने के लिए 'डी' के रूप में टैग किए गए को छोड़कर टी '

मैं अजगर करने के लिए नया हूँ और यहाँ कुछ समस्याओं का सामना कर रहा हूँ:

  • अगर मैं संज्ञा पद पेड़ पार करने के लिए जब तक यह एक निर्धारक के साथ एक पत्ता तक पहुँच जाता है एक पुनरावर्ती समारोह लिखते हैं, मैं मूल पेड़ में मूल्य को संशोधित करने में असमर्थ हूं, क्योंकि यह केवल मूल्य को पार कर रहा है।

  • एनएलटीके पेड़ों के संबंध में मुझे मिला एकमात्र डिलीट फ़ंक्शन वह है जिसके लिए पेड़ की जड़ के संबंध में नोड को सटीक इंडेक्स की आवश्यकता होती है, जैसे कि [0,0] यदि यह है रूट नोड के बाएं बच्चे के बाएं बच्चे। यह मुश्किल है क्योंकि पेड़ की ऊंचाई के साथ बढ़ने वाले पूर्णांक की एक सूची शामिल होगी, प्रत्येक नोड

  • मैंने सूचियों की एक सूची बनाई, जहां प्रत्येक सूची में एक संज्ञा वाक्यांश से सभी पत्तियां होती हैं निर्धारकों को छोड़कर, और इनकी तुलना की गई।

तो, मेरे सवाल कर रहे हैं,

मैं कैसे [, 0,0,1,0 ...] प्रथम रूप में यह सूचकांक प्राप्त किए बिना एक NLTK पेड़ से एक नोड नष्ट कर सकता हूं?

मैं कैसे एक सूचकांक का उपयोग किए बिना फिर से एक पत्ता मूल्य को संशोधित करते हैं? (मैं एक पुनरावर्ती समारोह का उपयोग करना चाहते हैं, और जब भी समारोह एक पत्ता मैं संशोधित करना चाहते हैं मारता है, मैं इसे संशोधित करना चाहते हैं)

यदि ये संभव नहीं हैं, तो मैं एक पत्ता की अनुक्रमणिका कैसे प्राप्त कर सकता हूं? मैं इस पर फंस गया हूँ। एनएलटीके पेड़ों में एक वृक्षारोपण कार्य होता है, लेकिन यह केवल उपट्री के लिए काम करता है। क्या पाइथन अन्य नोड्स की तुलना में पत्ते को एक अलग प्रकार के रूप में मानते हैं? क्योंकि वृक्षारोपण मेरी पत्तियों के लिए काम नहीं कर रहा है। ऐसा इसलिए हो सकता है क्योंकि मेरे पत्ते tuples हैं और न सिर्फ तारों, लेकिन मुझे नहीं पता कि इसे कैसे बदला जाए, क्योंकि यह pos टैगर का आउटपुट है। तो क्या मेरे पत्ते को प्रतिस्थापित करने का कोई तरीका है, जो फॉर्म (डीटी) के रूप में फॉर्म [द/डीटी] का एक गुच्छा है? रिकर्सिव प्रक्रियाओं को फिर से परिभाषित करना मूल पेड़ को संशोधित नहीं करेगा।

कोई सुझाव/टिप्पणियां?

उत्तर

3

ठीक है, चलो अपने प्रश्नों को एक-एक करके निपटें।

tree = Tree.parse("(S (NP The/DT bag/NN) is/VBZ (JP blue/JJ))") 

एक नोड हटाना:

tree.remove(Tree('JP', ['blue/JJ']))

tree.remove('is/VBZ')

एक मूल्य को संशोधित करना। आप ट्री के एक सदस्य के सूचकांक हो रही द्वारा ऐसा कर सकता है (याद रखें, यह सूची विरासत):

tree.index('is/VBZ')

लेकिन फिर से, यह एक अच्छा तरीका नहीं है।

पत्ते traversing tree.leaves() साथ पत्ते हो रही है और उसके बाद tree.leaf_treeposition(index) द्वारा अनुक्रमित हो रही है, और इन संशोधित करने के लिए उपयोग करने में सबसे अच्छा तरीका है/इन-जगह पत्ती को हटा दें।

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