如何使用WordNet查找英语单词的频率计数?

22

使用WordNet或NLTK与Python,有没有一种方法可以查找英语单词的使用频率?

注意:我不想要给定输入文件中单词的计数频率。我希望根据今天的用法,得到一个单词在一般情况下的计数频率。


7
请先接受一些回答。 - PrettyPrincessKitty FS
8个回答

21
在WordNet中,每个词形的频率计数可以通过方法lemma.count()获取,并存储在文件nltk_data/corpora/wordnet/cntlist.rev中。
代码示例:
from nltk.corpus import wordnet
syns = wordnet.synsets('stack')
for s in syns:
    for l in s.lemmas():
        print l.name + " " + str(l.count())

结果:

stack 2
batch 0
deal 1
flock 1
good_deal 13
great_deal 10
hatful 0
heap 2
lot 13
mass 14
mess 0
...

然而,许多计数为零,并且在源文件或文档中没有信息表明用于创建此数据的语料库是哪一个。根据Daniel Jurafsky和James H. Martin的书《言语和语言处理》,意义频率来自SemCor语料库,它是已经很小且过时的Brown语料库的子集。

因此,最好选择适合您应用程序的语料库,并像Christopher建议的那样自己创建数据。

要使其兼容Python 3.x,只需执行以下操作:

示例代码:

from nltk.corpus import wordnet
syns = wordnet.synsets('stack')
for s in syns:
    for l in s.lemmas():
        print( l.name() + " " + str(l.count()))

只是 echo @Suzana_K 的观点,我发现 wordnet 的 lemma.count() 对于单词计数中的 0 的数量以及单词之间缺乏频率区别并不是非常有用。 - Ram Narasimhan
根据官方WordNet文档中对频率计数的描述,我不确定它的意思是否和我们所想的一样:
“频率计数是基于一个单词拥有的义项数量。”
- anana
1
那么为什么大多数单词的频率计数为零呢?一个没有意义的单词是毫无意义的。 - Suzana
3
这段话的意思是:计数是在有标注意义的文本上进行的,生成这些文本的成本较高。WordNet中的许多词义非常明显(且易变),这意味着在随机句子中找到其示例的可能性相当小。简要概括为:标记数据很难找到,WordNet只统计有标注语义的单词实例。如果您不关心语义,请使用原始语料库计数而不是WordNet。 - Ritwik Bose
1
根据Daniel Jurafsky和James H. Martin的《语音与语言处理》一书,WordNet从“SemCor”语料库中获取它们的词义频率。(第二版第742页) - alvitawa
感谢提供信息。SemCor语料库只是布朗语料库的语义注释子集,而布朗语料库本身已经很小且过时(1960年代)。这就解释了频率数据质量差的原因。 - Suzana

12
你可以使用布朗语料库来进行一些操作,虽然它已经过时了(最后修订于1979年),因此缺少许多当前的单词。
import nltk
from nltk.corpus import brown
from nltk.probability import *

words = FreqDist()

for sentence in brown.sents():
    for word in sentence:
        words.inc(word.lower())

print words["and"]
print words.freq("and")
你可以使用cpickle将FreqDist存储到文件中,以便以后更快地加载。语料库基本上只是一个充满句子的文件,每行一个句子,还有许多其他的语料库,所以你可以找到适合你目的的其中一个。一些其他更为当前的语料库来源:Google美国国家语料库。你还可以从现代美国英语语料库中获取包含前 60,000 个单词及其频率的当前列表。

分析旧文本的完美解决方案。不一定需要“import nltk”,而“from nltk.probablity import *”可以更改为仅导入“FreqDist”。 - davidjb
如何在Python中打印语料库的所有单词及其频率,并将FreqDist存储到文件中?由于我是Python pickling的新手,请帮忙。 - M S
inc属性已被弃用,请参见此帖子https://dev59.com/UV8e5IYBdhLWcg3wYJYN - Woden

3

2
请查看Wordnet相似性项目的信息内容部分,网址是http://wn-similarity.sourceforge.net/。您可以在那里找到Wordnet引用词条的单词频率数据库(或者说是由单词频率派生出来的信息内容),这些数据是从几个不同的语料库中计算出来的。源代码是用Perl编写的,但是数据库是独立提供的,可以很容易地与NLTK一起使用。

2

你不能真正做到这一点,因为这取决于情境。不仅如此,对于不太常见的词汇,其频率将严重依赖于样本。

你最好的选择可能是找到一个特定类型的大型文本语料库(例如,从古腾堡计划下载一百本书),并自己统计单词数。


3
请注意,古腾堡计划只有文学类书籍。如果您对更口语化的英语感兴趣,可能需要使用其他来源,比如在线博客文章或评论串。同时,请友好地对待您可能决定爬取内容的任何网站 :) - Mihai Oprea

2
你可以从 https://github.com/stanfordnlp/GloVe 下载单词向量 glove.6B.zip,解压并查看文件 glove.6B.50d.txt。在那里,您将找到 400,000 个英语单词,每行一个(加上同一行中每个单词的 50 个数字),小写,按最常见(the)到最不常见的顺序排序。您可以通过以原始格式或 pandas 读取此文件来创建单词排名。虽然不完美,但我过去曾使用过它。同一网站提供了其他文件,其中包含多达 2.2m 个英语单词,大小写敏感。

1

维基词典项目有一些基于电视剧本和Project Gutenberg的频率列表,但它们的格式不太适合解析。


0

这是Christopher Pickslay解决方案的Python 3版本(包括将频率保存到tempdir):

from pathlib import Path
from pickle import dump, load
from tempfile import gettempdir

from nltk.probability import FreqDist


def get_word_frequencies() -> FreqDist:
  tmp_path = Path(gettempdir()) / "word_freq.pkl"
  if tmp_path.exists():
    with tmp_path.open(mode="rb") as f:
      word_frequencies = load(f)
  else:
    from nltk import download
    download('brown', quiet=True)
    from nltk.corpus import brown
    word_frequencies = FreqDist(word.lower() for sentence in brown.sents()
                                for word in sentence)
    with tmp_path.open(mode="wb") as f:
      dump(word_frequencies, f)

  return word_frequencies

使用方法:

word_frequencies = get_word_frequencies()

print(word_frequencies["and"])
print(word_frequencies.freq("and"))

输出:

28853
0.02484774266443448

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