如何在NLTK中获取一个同义词集的WordNet语义频率?

9
根据文档,我可以在nltk中加载一个带有sense标记的语料库,方法如下:
>>> from nltk.corpus import wordnet_ic
>>> brown_ic = wordnet_ic.ic('ic-brown.dat')
>>> semcor_ic = wordnet_ic.ic('ic-semcor.dat')

我还可以这样获取定义词性偏移量例句

>>> wn.synset('dog.n.01').examples
>>> wn.synset('dog.n.01').definition

但是如何从语料库中获取一个synset的频率呢?为了解答这个问题,我们需要分步讲解:

  1. 首先,如何计算一个synset在标记感知语料库中出现的次数?
  2. 然后,下一步是将该计数除以所有synsets出现次数总和,给定特定词元的计数。

在文档的词元部分,显示了一些计数,但我不确定它们是什么。http://nltk.googlecode.com/svn/trunk/doc/howto/wordnet.html - alvas
2个回答

7
我用这种方法成功地完成了它。
from nltk.corpus import wordnet as wn

word = "dog"
synsets = wn.synsets(word)

sense2freq = {}
for s in synsets:
  freq = 0  
  for lemma in s.lemmas:
    freq+=lemma.count()
  sense2freq[s.offset+"-"+s.pos] = freq

for s in sense2freq:
  print s, sense2freq[s]

2
我不会依赖于 lemma.count(),因为很多条目的值是零,并且没有提供从哪个文集中获取频率数据的信息。请参考这个相关问题 - Suzana
感谢提醒关于0计数的问题。虽然这种平滑方法有些简陋,但我已经用拉普拉斯平滑处理了。至少得到0.001比得到0并破坏管道中的其他子系统要好 =) - alvas
很不幸,当使用WordNet在线查找词义时,总和与显示的词义频率并不相同。在我看来,后者才是有用的数字。 - Radio Controlled

-1
如果您只需要知道最常用的单词是什么,可以执行wn.synsets(word)[0],因为WordNet通常将它们从最常用到最不常用进行排序。

2
这不是真的,因为在顶层有一种分类,遵循词性的恒定顺序。 - Radio Controlled

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接