【问题标题】:How do I find the frequency count of a word in English using WordNet?如何使用 WordNet 查找英语单词的频率计数?
【发布时间】:2023-03-09 00:10:01
【问题描述】:

有没有办法使用 WordNet 或使用 Python 的 NLTK 找到英语单词的使用频率?

注意:我不希望给定输入文件中单词的频率计数。我想根据今天的使用情况来计算一个词的频率。

【问题讨论】:

  • 先接受一些答案。

标签: python nltk wordnet


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你可以从https://github.com/stanfordnlp/GloVe下载词向量glove.6B.zip,解压后查看文件glove.6B.50d.txt

    在那里,您会发现 400.000 个英文单词,每行一个(加上同一行中的每个单词 50 个数字),小写,从最频繁 (the) 到最不频繁排序。您可以通过以原始格式或pandas 阅读此文件来创建单词排名。

    它并不完美,但我过去曾使用过它。同一网站提供的其他文件最多包含 220 万个英文单词,大小写。

    【讨论】:

      【解决方案3】:

      在 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 的 the book 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()))
      

      【讨论】:

      • 只是为了回应 @Suzana_K 的观点,我发现 wordnet 的 lemma.count() 不是很有用,因为计数中的 0 的数量以及单词之间总体上缺乏频率差异。
      • 根据official WordNet documentation 中对频率计数的描述,我不确定这是否意味着我们认为的含义:>“频率计数基于单词的意义数。”
      • 那么为什么大多数的频率计数为零?零意义的词没有意义。
      • 计数是根据感觉标记的文本诱导的,这些文本的生成成本很高。 WordNet 中的许多感觉都非常不同(并且变化无常),这意味着在随机句子中找到它们的示例是不太可能的。外卖信息:标记数据很难找到,同义词只计算词义标记实例。如果您不关心感官,请改用原始语料库计数(不是 wordnet)
      • 根据 Daniel Jurafsky、James H. Martin 的“语音和语言处理”一书,WordNet 从“SemCor”语料库中获取感知频率。 (第二版第742页)
      【解决方案4】:

      查看此网站以了解词频: http://corpus.byu.edu/coca/

      有人整理了一份来自 opensubtitles.org(电影剧本)的单词列表。有一个像这样格式的免费简单文本文件可供下载。许多不同的语言。

      you 6281002
      i 5685306
      the 4768490
      to 3453407
      a 3048287
      it 2879962
      

      http://invokeit.wordpress.com/frequency-word-lists/

      【讨论】:

        【解决方案5】:

        Wiktionary 项目有几个基于 TV 脚本和古腾堡计划的 frequency lists,但它们的格式并不是特别适合解析。

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            你可以用棕色语料库来做,虽然它已经过时了(最后一次修订是在 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 转到一个文件以便稍后更快地加载。

            语料库基本上只是一个包含句子的文件,每行一个,并且还有很多其他语料库,因此您可能会找到适合您目的的语料库。更多最新语料库的其他几个来源:GoogleAmerican National Corpus

            您还可以从 Corpus of Contemporary American English

            【讨论】:

            • 分析旧文本的完美解决方案。 import nltk 不一定需要,from nltk.probablity import * 可以更改为仅导入 FreqDist
            • 如何打印语料库的所有单词及其频率并将 FreqDist 提取到 Python 中的文件中?请帮忙,因为我是 Python 酸洗的新手。
            • inc 属性已弃用,请参阅此帖子stackoverflow.com/questions/25827058/…
            【解决方案8】:

            您不能真正做到这一点,因为它在很大程度上取决于上下文。不仅如此,对于频率较低的词,频率将在很大程度上取决于样本。

            您最好的选择可能是找到给定类型的大量文本语料库(例如,从 Project Gutenberg 下载一百本书)并自己计算单词。

            【讨论】:

            • 请注意古腾堡计划只有文学书籍这一事实。如果您对更通俗的英语感兴趣,那么您可能需要不同的来源,例如在线博客文章/评论线程。另外,请善待您可能决定从中删除内容的任何网站:)
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-11
            • 2022-06-16
            • 1970-01-01
            • 1970-01-01
            • 2014-02-11
            • 1970-01-01
            相关资源
            最近更新 更多