【问题标题】:How to get the wordnet sense frequency of a synset in NLTK?如何在 NLTK 中获取同义词集的 wordnet 感知频率?
【发布时间】:2013-03-11 04:18:22
【问题描述】:

根据文档,我可以像这样在 nltk 中加载带有感觉标记的语料库:

>>> from nltk.corpus import wordnet_ic
>>> brown_ic = wordnet_ic.ic('ic-brown.dat')
>>> semcor_ic = wordnet_ic.ic('ic-semcor.dat')

我也可以得到definitionposoffsetexamples这样的:

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

但是如何从语料库中获取同义词集的频率? 分解问题:

  1. 首先如何计算一个同义词集在一个有义标签的语料库中出现的次数?
  2. 那么下一步是除以计数除以给定特定引理的所有同义词集出现的计数总数。

【问题讨论】:

标签: python nlp nltk wordnet wsd


【解决方案1】:

如果您只需要知道最常用的词是什么,您可以使用wn.synsets(word)[0],因为 WordNet 通常将它们从最频繁到最不频繁排列。

(来源:Daniel Jurafsky 的语音和语言处理第二版)

【讨论】:

  • 这是不正确的,因为在顶层有一个分类遵循词性的恒定顺序。
【解决方案2】:

我设法做到了。

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]

【讨论】:

  • 我不会依赖lemma.count(),许多条目都是零,并且没有信息形式的频率数据是从哪个语料库中获取的。另见this related question
  • 感谢关于 0 计数的说明。这是一种蹩脚的平滑,但我虽然用拉普拉斯平滑了它。至少得到 0.001 比 0 好,并且打破了管道中的其他子系统 =)
  • 很遗憾,使用 WordNet 在线查找感官时,总和与显示的感官频率不同。在我看来,后者是有用的数字。
猜你喜欢
  • 2013-10-16
  • 2017-04-18
  • 2015-09-22
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
  • 2014-08-31
  • 1970-01-01
相关资源
最近更新 更多