2014-07-09 99 views
5

Python 2.7中有沒有使用NLTK來獲取單詞的方法,而不是包含"synset"和括號以及"n.01"等的額外格式?如何使用Python NLTK在WordNet同義詞集中打印出單詞本身?

舉例來說,如果我做

 wn.synsets('dog') 

我的結果如下:

[Synset('dog.n.01'), Synset('frump.n.01'), Synset('dog.n.03'), Synset('cad.n.01'), Synset('frank.n.02'), Synset('pawl.n.01'), Synset('andiron.n.01'), Synset('chase.v.01')] 

我怎樣才能得到,而不是像這樣的列表?

dog 
frump 
cad 
frank 
pawl 
andiron 
chase 

有沒有辦法做到這一點使用NLTK或做我必須使用regular expressions?我可以在python腳本中使用regular expressions嗎?

+0

按規則'包括「同義詞集」和括號和「N.01」''frank'和'chase'不應該成爲其中的一部分期望的輸出? – Braj

+0

與問題無關,但「frank」是「法蘭克福香腸」的同義詞/簡寫,它是「熱狗」或「狗」的同義詞。同樣,「狗」作爲動詞意味着「追逐」。 – aelfric5578

+0

我看到一個微弱的諷刺失敗,遇到微妙的諷刺色調... – JonathanHayward

回答

3

如果您想要在沒有正則表達式的情況下執行此操作,可以使用列表理解。

[synset.name.split('.')[0] for synset in wn.synsets('dog') ] 

你在這裏做的是說,對於每個synset,返回句點之前的第一個單詞。

+0

確保使用名稱()而不是名稱,NLTK稍微改變了這個功能。 – frogbandit

3

試試這個:

for synset in wn.synsets('dog'): 
    print synset.lemmas[0].name 

你想遍歷每個同義詞集狗,然後打印出同義詞集的中心詞。請記住,多的話可能會連接到相同的同義詞集,所以如果你想獲得的所有同義詞集狗有關的所有的話,你可以這樣做:

for synset in wn.synsets('dog'): 
    for lemma in synset.lemmas: 
     print lemma.name 
+0

唉,第一個剪切掉的''instancemethod'對象不是可代換的',第二個代碼段拋出'TypeError:'instancemethod'對象不能迭代NLTK 3.0 – duhaime

+2

@duhaime什麼是以前的屬性已成爲方法。你需要做'synset.lemmas()[0] .name()' – rlms

+0

非常感謝您的關注! – duhaime

1

使用引理的名字可能會奏效,但有一個對於該Synset對象的同義詞集名典型變量,嘗試:

>>> from nltk.corpus import wordnet as wn 
>>> wn.synset('dog.n.1') 
Synset('dog.n.01') 
>>> wn.synset('dog.n.1').name 
'dog.n.01' 
>>> wn.synset('dog.n.1').name.partition('.')[0] 
'dog' 
>>> for ss in wn.synsets('dog'): 
...  print ss.name.partition('.')[0] 
... 
dog 
frump 
dog 
cad 
frank 
pawl 
andiron 
chase 
+0

你碰巧知道NLTK 3.0中是否有類似的方法?我得到一個錯誤運行分區線''功能'對象沒有屬性'分區' – duhaime

+3

@duhaime,使用'wn.synset('dog.n.1')。name()'因爲NLTK改變了Synset屬性取而代之的是功能。見https://github.com/alvations/pywsd/issues/6 – alvas

+0

非常好!這很有幫助 - 謝謝! – duhaime