如何使用WordNet查找英语单词的频率计数?
有没有办法用Python通过WordNet或NLTK来找出一个单词在英语中使用的频率呢?
注意:我不是想要某个输入文件中单词的出现次数。我想要的是这个单词在当今的使用频率,想知道它在日常生活中被使用的情况。
8 个回答
你可以查看这个网站来了解单词的使用频率:http://corpus.byu.edu/coca/
有人整理了一份来自opensubtitles.org(电影剧本)的单词列表。这个列表是免费的,格式简单,可以下载,支持多种语言。
you 6281002
i 5685306
the 4768490
to 3453407
a 3048287
it 2879962
你可以用一个叫做“棕色语料库”的东西来做这件事,不过这个语料库有点过时了(最后一次更新是在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
把词频分布保存到一个文件里,这样下次加载的时候会更快。
语料库其实就是一个文件,里面每一行都是一句话,市面上有很多其他的语料库,你应该能找到一个适合你需求的。还有一些更新的语料库来源,比如:谷歌和美国国家语料库。
据说你还可以从当代美国英语语料库获取到一个最新的前60,000个单词及其出现频率的列表。
在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的书Speech and Language Processing,这些词义的频率来自于SemCor语料库,而这个语料库又是已经很小且过时的布朗语料库的一个子集。
所以,最好选择最适合你应用的语料库,并像Christopher建议的那样自己创建数据。
为了让这个代码兼容Python3.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()))