2014-12-21 32 views
6

我期待使用NLTK獲取單個單詞和句子中的每個單詞之間的相似性。NLTK將標記化的句子轉換爲synset格式

NLTK可以得到兩個特定單詞之間的相似性,如下所示。這種方法要求給出一個特定的單詞,在這種情況下,它是'dog.n.01',其中dog是名詞,我們想要使用第一個(01)NLTK定義。

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

問題是我需要從句子中的每個單詞獲取詞性信息。 NLTK包可以獲取如下所示句子中每個單詞的詞性。然而,這些語音部分('NN','VB','PRP'...)與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格式的數據結果在NLTK?通過同義詞集格式化我的意思是像dog.n.01

回答

9

您可以使用一個簡單的轉換功能:

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 

標記的句子,你可以打個單詞句子內部使用此功能的同義詞集之後。下面是一個例子:

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 

結果:[同義詞集( 'be.v.01'),同義詞集( 'travel.v.01'),同義詞集( 'buy.v.01'),同義詞集( 'gift.n.01')]

+0

我發現這個'lesk'的例子,但你的代碼似乎給出更好的結果,我想知道爲什麼(只是好奇):http://www.nltk.org/ howto/wsd.html –

+1

Lesk並沒有很好地工作。此代碼可能更好地工作的唯一原因是因爲它獲得第一個synset。在wordnet中,synsets按頻率排序。換句話說,如果我們不考慮上下文,第一個同義詞集合是最可能的。 – bogs

1

格式可以使用wordnet.synset的另一種形式:

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

你仍然需要通過翻譯爲pos_tag那些wordnet.sysnset支持所提供的標籤 - 不幸的是,我不知道這樣做的預製字典,所以(除非我錯過了這樣一個對應表的存在),你需要建立自己的(你可以做一次,然後醃製它,以便後續重裝)。

http://www.nltk.org/book/ch05.html,小節1,如何獲取有關特定標記集的幫助 - 例如nltk.help.upenn_tagset('N.*')將確認賓夕法尼亞大學標籤集(我相信是pos_tag使用默認的)使用「N」後面的東西,以確定什麼synset將看作wordnet.NOUN的變種。

我還沒有試過http://www.nltk.org/_modules/nltk/tag/mapping.html但它可能正是你所需要的 - 試試吧!

相關問題