2015-06-02 10 views
5

मैं पायथन एनएलटीके वर्डनेट एपीआई के साथ काम कर रहा हूं। मैं सबसे अच्छा synset खोजने की कोशिश कर रहा हूँ जो शब्दों के समूह का प्रतिनिधित्व करता है।शब्द वाक्यांश के लिए एनएलटीके वर्डनेट सिंसेट

यदि मुझे "स्कूल & कार्यालय की आपूर्ति" जैसे कुछ के लिए सर्वश्रेष्ठ सिंकसेट खोजने की आवश्यकता है, तो मुझे यकीन नहीं है कि इस बारे में कैसे जाना है।

def find_best_synset(category_name): 
    text = word_tokenize(category_name) 
    tags = pos_tag(text) 

    node_synsets = [] 
    for word, tag in tags: 
     pos = get_wordnet_pos(tag) 
     if not pos: 
      continue 
     node_synsets.append(wordnet.synsets(word, pos=pos)) 

    max_score = 0 
    max_synset = None 
    max_combination = None 
    for combination in itertools.product(*node_synsets): 
     for test in itertools.combinations(combination, 2): 
      score = wordnet.path_similarity(test[0], test[1]) 
      if score > max_score: 
       max_score = score 
       max_combination = test 
       max_synset = test[0].lowest_common_hypernyms(test[1]) 
    return max_synset 

हालांकि यह बहुत अच्छी तरह से काम नहीं करता है के साथ साथ यह बहुत महंगा है: अब तक मैं प्रत्येक शब्द के synsets खोजने और फिर इस तरह की गणना सबसे अच्छा सबसे कम आम hypernym कोशिश की है। क्या यह समझने के कोई तरीके हैं कि कौन सा सिंटसेट एक साथ कई शब्दों का प्रतिनिधित्व करता है?

आपकी मदद के लिए धन्यवाद!

+0

यदि आपके सभी भाव उस उदाहरण की तरह हैं, तो आपको शायद एक सामान्य हाइपरनाम नहीं दिखना चाहिए। "स्कूल की आपूर्ति" एक तरह की आपूर्ति है, लेकिन वे किसी तरह का स्कूल नहीं हैं। इसके बजाय, आप पिछले शब्द के synsets पर विचार कर सकते हैं और पिछले शब्दों का उपयोग करने वालों के बीच असंबद्ध (मुझे यकीन नहीं है कि यह कैसे करना है)। – lenz

+0

हमम, मैं आपका बिंदु देखता हूं लेकिन मुझे नहीं लगता कि सभी अभिव्यक्ति उस उदाहरण की तरह हैं। मुझे एहसास है कि "स्कूल और कार्यालय" आपूर्ति के प्रकार हैं लेकिन उन्हें अभी भी विशेषण के बजाय संज्ञा के रूप में पहचाना जाता है। –

+0

ठीक है, यदि अभिव्यक्तियों में अलग-अलग आंतरिक संरचनाएं हैं, तो यह आपके कार्य को सरल नहीं करेगा। मेरा सुझाव है कि आप मैन्युअल रूप से एक यादृच्छिक नमूना में सही synset असाइन करें (जैसे 20 से शुरू करने के लिए) और फिर देखें कि क्या आप एक पैटर्न देख सकते हैं। या मैन्युअल रूप से और भी उदाहरण करते हैं और निर्णय पेड़ को प्रशिक्षित करते हैं। – lenz

उत्तर

4

मैंने पहले से ही टिप्पणियों में जो कहा है, उसके अलावा, मुझे लगता है कि जिस तरह से आप सबसे अच्छा हाइपरोन चुनते हैं, वह त्रुटिपूर्ण हो सकता है। आपके द्वारा समाप्त किया गया समीकरण सभी शब्दों का सबसे कम आम हाइपरनाम नहीं है, लेकिन उनमें से केवल दो ही है।

चलो "स्कूल & कार्यालय की आपूर्ति" के उदाहरण के साथ चिपके रहें। अभिव्यक्ति में प्रत्येक शब्द के लिए आपको कई सिंकसेट मिलते हैं। तो चर node_synsets निम्नलिखित कुछ ऐसी दिखाई देगी:

[[school_1, school_2], [office_1, office_2, office_3], [supply_1]] 

इस उदाहरण में, वहाँ दूसरों से किसी के साथ प्रत्येक synset गठबंधन करने के लिए 6 तरीके हैं:

[(school_1, office_1, supply_1), 
(school_1, office_2, supply_1), 
(school_1, office_3, supply_1), 
(school_2, office_1, supply_1), 
(school_2, office_2, supply_1), 
(school_2, office_3, supply_1)] 

ये ट्रिपल क्या तुम पर पुनरावृति हैं बाहरी for लूप (itertools.product के साथ) में। अगर अभिव्यक्ति में 4 शब्द हैं, तो आप क्वाड्रूल्स पर 5 से अधिक क्विंटुपल्स इत्यादि के साथ फिर से शुरू करेंगे,

अब, आंतरिक for लूप के साथ, आप प्रत्येक ट्रिपल को जोड़ते हैं। पहला वाला है:

[(school_1, office_1), 
(school_1, supply_1), 
(office_1, supply_1)] 

... और आप प्रत्येक जोड़ी के बीच निम्नतम हाइपरनाम निर्धारित करते हैं। तो अंत में आप निम्नतम हाइपरनाम, school_2 और office_1 प्राप्त करते हैं, जो कि किसी प्रकार का संस्थान हो सकता है। यह शायद बहुत सार्थक नहीं है, क्योंकि यह अंतिम शब्द के किसी भी synset पर विचार नहीं करता है।

शायद आपको अपने सिन्ससेट के प्रत्येक संयोजन में सभी तीन शब्दों के सबसे कम आम हाइपरनेम को खोजने का प्रयास करना चाहिए, और उनमें से एक को सर्वश्रेष्ठ स्कोर करना चाहिए।

+0

मैं सहमत हूं, मैंने बाद में पुनरावृत्ति में ऐसा करने की कोशिश की। समाधान का उपयोग करने के बाद मैं इन्हें एक ही हाइपरनीम में कम नहीं करना था बल्कि सर्वश्रेष्ठ स्कोर प्राप्त करने के लिए सभी जेनरेट किए गए सिंकसेट का उपयोग करना था। बहुत अधिक "node_synsets" लौट रहा है और इसका उपयोग कर रहा है। यदि मैं सभी तीनों के लिए एलसीएच खोजना चाहता हूं ... क्या मैं इसे दो में से एक के बीच खोजूंगा और फिर तीसरे के साथ एलसीएच गणना में इसका उपयोग करूंगा? –

+0

मैं ऐसा कहूंगा, हाँ। – lenz

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