【问题标题】:FreqDist with NLTK使用 NLTK 的 FreqDist
【发布时间】:2011-06-05 19:23:42
【问题描述】:
python 中的

NLTK 有一个函数FreqDist,它可以为您提供文本中单词的频率。我正在尝试将我的文本作为参数传递,但结果是以下形式:

[' ', 'e', 'a', 'o', 'n', 'i', 't', 'r', 's', 'l', 'd', 'h', 'c', 'y', 'b', 'u', 'g', '\n', 'm', 'p', 'w', 'f', ',', 'v', '.', "'", 'k', 'B', '"', 'M', 'H', '9', 'C', '-', 'N', 'S', '1', 'A', 'G', 'P', 'T', 'W', '[', ']', '(', ')', '0', '7', 'E', 'J', 'O', 'R', 'j', 'x']

而在 NLTK 网站的示例中,结果是整个单词而不仅仅是字母。我是这样做的:

file_y = open(fileurl)
p = file_y.read()
fdist = FreqDist(p)
vocab = fdist.keys()
vocab[:100]

你知道我有什么问题吗?谢谢!

【问题讨论】:

  • 请添加示例链接。
  • 注意,更好的 Python 习语是:with open(fileurl) as file_y: ...for line in open(file url):

标签: python nlp nltk


【解决方案1】:
text_dist = nltk.FreqDist(word for word in list(text) if word.isalpha())
top1_text1 = text_dist.max()
maxfreq = top1_text1

【讨论】:

  • 虽然这段代码可以回答这个问题,但最好在不介绍其他代码的情况下解释它是如何解决问题的,以及为什么要使用它。从长远来看,纯代码的答案没有用处。
【解决方案2】:
Your_string = "here is my string"
tokens = Your_string.split()

这样做,然后使用 NLTK 函数

它将以文字而不是字符形式提供您的标记

【讨论】:

    【解决方案3】:

    您只需像这样使用它:

    import nltk
    from nltk.probability import FreqDist
    
    sentence='''This is my sentence'''
    tokens = nltk.tokenize.word_tokenize(sentence)
    fdist=FreqDist(tokens)
    

    变量 fdist 的类型为“class 'nltk.probability.FreqDist”,包含单词的频率分布。

    【讨论】:

      【解决方案4】:

      NLTK 的 FreqDist 接受任何可迭代的。由于字符串是逐个字符迭代的,因此它会以您所体验的方式将事物分开。

      为了计算字数,您需要输入 FreqDist 字数。你是怎样做的?好吧,您可能会认为(正如其他人在回答您的问题时所建议的那样)将整个文件提供给 nltk.tokenize.word_tokenize

      >>> # first, let's import the dependencies
      >>> import nltk
      >>> from nltk.probability import FreqDist
      
      >>> # wrong :(
      >>> words = nltk.tokenize.word_tokenize(p)
      >>> fdist = FreqDist(words)
      

      word_tokenize 从句子中构建词模型。它需要一次喂一个句子。当给定整个段落甚至文档时,它会做得相对较差。

      那么,该怎么办?简单,添加一个句子标记器!

      >>> fdist = FreqDist()
      >>> for sentence in nltk.tokenize.sent_tokenize(p):
      ...     for word in nltk.tokenize.word_tokenize(sentence):
      >>>         fdist[word] += 1
      

      要记住的一点是,有很多方法可以对文本进行标记。模块nltk.tokenize.sent_tokenizenltk.tokenize.word_tokenize 只是为相对干净的英文文本选择了一个合理的默认值。还有其他几个选项可供选择,您可以在API documentation 中阅读。

      【讨论】:

      • OP 不想要字母频率! (也没有其他人这样做......)他们想要词频。
      • 实际上,字母频率是自动语言检测非常常见的特征。
      • 没错,对于那个利基市场。还解密。不过一般来说不多。
      • 非常有用的答案,但它似乎有点过时:AttributeError: 'FreqDist' object has no attribute 'inc'。不抱怨,只是把它扔在那里让其他人意识到这一点。我会尝试找出答案;)谢谢
      • 是的,在过去 5 年中,一些内部 NLTK API 发生了很大变化!将更新代码:)
      【解决方案5】:

      FreqDist 在令牌数组上运行。您正在向它发送一个字符数组(一个字符串),您应该首先对输入进行标记:

      words = nltk.tokenize.word_tokenize(p)
      fdist = FreqDist(words)
      

      【讨论】:

        【解决方案6】:

        FreqDist 需要一个可迭代的令牌。字符串是可迭代的——迭代器产生每个字符。

        首先将您的文本传递给标记器,然后将标记传递给FreqDist

        【讨论】:

        • 确实如此,但它的文档字符串并没有说 anywhere,也没有说它的错误消息,而且它的__init__() 要么引发错误是微不足道的消息在非迭代器输入上这样说,或者接受一个序列并将其转换为一个迭代器。
        • @afg102 如果有效,请接受答案,以便其他人也知道问题的解决方案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-19
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多