为什么没有功能来计算NLTK中的文档频率(DF)?

时间:2017-09-27 09:37:21

标签: python nltk

我正在寻找一个函数来获取特定术语的DF(意味着有多少文档包含语料库中的某个单词),但我似乎无法找到函数here。该页面仅具有获取tf, idf, and tf_idf值的功能。我只是专门寻找DF。我从文档中复制了以下代码,

matches = len([True for text in self._texts if term in text])

但我不喜欢它给出的结果。例如,如果我有一个字符串列表,并且我正在寻找单词Pete,那么它还包含名称Peter,这不是我想要的。例如。

texts = [['the', 'boy', 'peter'],['pete','the', 'boy'],['peter','rabbit']]

所以我正在寻找看似TWICE的pete,但我上面展示的代码会告诉你有三个皮特,因为它也算peter。我该如何解决这个问题?感谢。

2 个答案:

答案 0 :(得分:1)

至于你提出的问题(为什么(...)?):我不知道。

作为您示例的解决方案(注意peter只发生两次而pete只发生一次:

texts = [['the', 'boy', 'peter'],['pete','the', 'boy'],['peter','rabbit']]
def flatten(l):
    out = []
    for item in l:
        if isinstance(item, (list, tuple)):
            out.extend(flatten(item))
        else:
            out.append(item)
    return out

flat = flatten(texts)

len([c for c in flat if c in ['pete']])
len([c for c in flat if c in ['peter']])

比较两个结果

编辑:

import collections
def counts(listr, word):
    total = []
    for i in range(len(texts)):
        total.append(word in collections.Counter(listr[i]))
    return(sum(total))

counts(texts,'peter')
#2

答案 1 :(得分:1)

您的描述不正确。当您在pete中搜索texts时,您发布的表达确实给出1而不是3:

>>> texts = [['the', 'boy', 'peter'],['pete','the', 'boy'],['peter','rabbit']]
>>> len([True for text in texts if 'pete' in text])
1

你可以匹配部分单词的唯一方法是你的文本没有被标记化(即如果texts是一个字符串列表,而不是一个令牌列表列表。)

但是上面的代码很糟糕,它完全没有任何理由建立一个列表。计算命中率的更好(也更常规)的方法是:

>>> sum(1 for text in texts if 'pete' in text))
1