【问题标题】:Matching multiple words with FreqDist in nltk在 nltk 中使用 FreqDist 匹配多个单词
【发布时间】:2015-09-30 01:35:34
【问题描述】:
import nltk
from nltk.tokenize import word_tokenize

txt = "finding a common place isn't commonly available among commoners place"

fd = nltk.FreqDist()

for w in word_tokenize(a.lower()):
    fd[w] += 1

我有上面的脚本可以正常工作。如果我输入 fd['place'] 我得到 2,如果我输入 fd['common'] 我得到 1。

是否可以键入类似于fd['common*'] 的内容(这不起作用)来获取 3 以及可能的这些匹配项的列表?三场比赛将是(common, commonly, commoners)

我假设它与regex 有关,但不确定如何使用FreqDist() 实现

如果没有,是否有任何其他软件包可以做到这一点?

【问题讨论】:

    标签: python regex python-3.x nltk


    【解决方案1】:

    FreqDist 只是一种字典,字典键只能通过完全匹配起作用。

    要将正则表达式用于这样的事情,您需要以艰难的方式进行:遍历所有条目并将匹配单词的计数相加。当然,这需要扫描整个列表,所以如果列表很大,它会很慢,你需要做很多。

    如果您只是通过前缀匹配,请使用称为“前缀树”或"trie" 的数据结构。你大概可以猜到它的作用。一个简单的解决方法是在 FreqDist 中记录您看到的每个单词的每个前缀的计数(因此不仅仅是完整的单词)。

    【讨论】:

      【解决方案2】:

      利用Ch 3.4这就是我最终要做的

      import re
      
      for w in fd:
          if re.search('common', w):
              print(w,fd[w])
      

      【讨论】:

      • 正如我在回答中所写的那样,这非常慢,因为您必须扫描整个词汇表来检查您检查的每个单词。
      • 我同意你的看法。 FreqDist 总体上很慢,我可能会为 Counter 放弃它,它似乎运行得更快。问题不仅在于前缀,我的示例可能已经显示了这种方式,但我正在寻找包含该单词的所有匹配项。
      • 但您只是在枚举和扫描所有键。这比FreqDistCounter 之间的任何可能差异要慢得多。如果你想要快速查找,你需要索引子字符串或者你需要改变你的方法。
      • 对不起,查找本身并不慢,我指的是FreqDistCounter之间的实际计数过程很快。
      猜你喜欢
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      • 2022-08-14
      • 1970-01-01
      相关资源
      最近更新 更多