使用WordNet或NLTK与Python,有没有一种方法可以查找英语单词的使用频率?
注意:我不想要给定输入文件中单词的计数频率。我希望根据今天的用法,得到一个单词在一般情况下的计数频率。
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()))
lemma.count()
对于单词计数中的 0 的数量以及单词之间缺乏频率区别并不是非常有用。 - Ram Narasimhanimport 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 个单词及其频率的当前列表。you 6281002
i 5685306
the 4768490
to 3453407
a 3048287
it 2879962
你不能真正做到这一点,因为这取决于情境。不仅如此,对于不太常见的词汇,其频率将严重依赖于样本。
你最好的选择可能是找到一个特定类型的大型文本语料库(例如,从古腾堡计划下载一百本书),并自己统计单词数。
这是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