2014-07-09 71 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