2014-12-21 9 views
6

मैं एनएलटीके का उपयोग करके एक शब्द और प्रत्येक शब्द के बीच समानता प्राप्त करने के लिए देख रहा हूं।एनएलटीके टोकनयुक्त वाक्य को synset प्रारूप में परिवर्तित करें

एनएलटीके नीचे दिखाए गए दो विशिष्ट शब्दों के बीच समानता प्राप्त कर सकता है। इस विधि के लिए आवश्यक है कि शब्द का एक विशिष्ट संदर्भ दिया गया है, इस मामले में यह 'dog.n.01' है जहां कुत्ता एक संज्ञा है और हम पहली (01) एनएलटीके परिभाषा का उपयोग करना चाहते हैं।

dog = wordnet.synset('dog.n.01') 
cat = wordnet.synset('cat.n.01') 
print dog.path_similarity(cat) 
>> 0.2 

समस्या यह है कि मुझे वाक्य में प्रत्येक शब्द से भाषण जानकारी का हिस्सा प्राप्त करने की आवश्यकता है। एनएलटीके पैकेज में नीचे दिए गए अनुसार वाक्य में प्रत्येक शब्द के लिए भाषण के हिस्सों को प्राप्त करने की क्षमता है। हालांकि, इन भाषण भागों ('एनएन', 'वीबी', 'पीआरपी' ...) प्रारूप के साथ मेल नहीं खाते हैं जो synset पैरामीटर के रूप में लेता है।

text = word_tokenize("They refuse to permit us to obtain the refuse permit") 
pos_tag(text) 
>> [('They', 'PRP'), ('refuse', 'VBP'), ('to', 'TO'), ('permit', 'VB'), ('us', 'PRP'), ('to', 'TO'), ('obtain', 'VB'), ('the', 'DT'), ('refuse', 'NN'), ('permit', 'NN')] 

एनएलटीके में pos_tag() परिणामों से synset प्रारूपित डेटा प्राप्त करना संभव है? synset से मेरा dog.n.01

उत्तर

9

आप एक सरल रूपांतरण समारोह का उपयोग कर सकते हैं।

from nltk.stem import WordNetLemmatizer 
from nltk import pos_tag, word_tokenize 

sentence = "I am going to buy some gifts" 
tagged = pos_tag(word_tokenize(sentence)) 

synsets = [] 
lemmatzr = WordNetLemmatizer() 

for token in tagged: 
    wn_tag = penn_to_wn(token[1]) 
    if not wn_tag: 
     continue 

    lemma = lemmatzr.lemmatize(token[0], pos=wn_tag) 
    synsets.append(wn.synsets(lemma, pos=wn_tag)[0]) 

print synsets 

परिणाम:: [Synset ('be.v.01'), Synset ('travel.v.01'), Synset ('buy.v.01'), Synset (यहाँ एक उदाहरण है 'gift.n.01')]

+0

मुझे यह 'लेस्क' उदाहरण मिला, लेकिन आपका कोड बेहतर परिणाम देता है, मुझे आश्चर्य है कि यह क्यों है (केवल उत्सुक): http://www.nltk.org/ howto/wsd.html –

+1

लेस्क वास्तव में अच्छी तरह से काम नहीं करता है। एकमात्र कारण जिसके लिए यह कोड बेहतर काम कर सकता है क्योंकि यह पहला सिंकसेट प्राप्त करता है। वर्डनेट में synsets आवृत्ति द्वारा आदेश दिया जाता है। दूसरे शब्दों में, यदि हम संदर्भ को ध्यान में रखते हैं तो पहला synset सबसे संभावित है। – bogs

1

तरह प्रारूप मतलब स्वरूपित आप wordnet.synset के वैकल्पिक फार्म का उपयोग कर सकते हैं:

wordnet.synset('dog', pos=wordnet.NOUN) 

तुम अब भी wordnet.sysnset द्वारा समर्थित उन में pos_tag द्वारा की पेशकश की टैग का अनुवाद करने की आवश्यकता होगी - दुर्भाग्यवश, मुझे ऐसा करने वाले पूर्व-निर्मित शब्दकोश के बारे में पता नहीं है, इसलिए (जब तक कि मुझे ऐसी पत्राचार तालिका का अस्तित्व नहीं मिल रहा है) आपको अपना खुद का निर्माण करना होगा (आप इसे एक बार कर सकते हैं और बाद में इसे चुन सकते हैं पुन: लोड)।

http://www.nltk.org/book/ch05.html देखें, subchapter 1, कैसे एक विशिष्ट tagset के बारे में मदद पाने के लिए पर - जैसे nltk.help.upenn_tagset('N.*') की पुष्टि करेगा कि UPenn tagset (जो मेरा मानना ​​है कि डिफ़ॉल्ट एक pos_tag द्वारा प्रयोग किया जाता है) का उपयोग करता है 'एन' कुछ के बाद पहचान करने के लिए synset के वेरिएंट wordnet.NOUN के रूप में देखेंगे।

मैंने http://www.nltk.org/_modules/nltk/tag/mapping.html की कोशिश नहीं की है, लेकिन यह हो सकता है जो आपको चाहिए - इसे आज़माएं! टैगिंग एक वाक्य आप एक SYNSET इस समारोह का उपयोग कर के साथ वाक्य के अंदर एक शब्द टाई कर सकते हैं के बाद

from nltk.corpus import wordnet as wn 

def penn_to_wn(tag): 
    if tag.startswith('J'): 
     return wn.ADJ 
    elif tag.startswith('N'): 
     return wn.NOUN 
    elif tag.startswith('R'): 
     return wn.ADV 
    elif tag.startswith('V'): 
     return wn.VERB 
    return None 

:

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