Python 为什么不是';NLTK中是否有计算文档频率(DF)的功能?

Python 为什么不是';NLTK中是否有计算文档频率(DF)的功能?,python,nltk,Python,Nltk,我正在寻找一个函数来获取某个术语的DF(意思是一个语料库中有多少文档包含某个单词),但我似乎找不到这个函数。该页只有获取的值的函数。我专门为DF只寻找。我从文档中复制了下面的代码 matches=len([对于self中的文本为True.\u如果文本中的术语为text]) 但我不喜欢它带来的结果。例如,如果我有一个字符串列表,并且我正在查找单词Pete,它还包括我不想要的名称Peter。比如说 text=['the','boy','peter',['pete','the','boy',['pet

我正在寻找一个函数来获取某个术语的DF(意思是一个语料库中有多少文档包含某个单词),但我似乎找不到这个函数。该页只有获取的值的函数。我专门为DF只寻找。我从文档中复制了下面的代码

matches=len([对于self中的文本为True.\u如果文本中的术语为text])

但我不喜欢它带来的结果。例如,如果我有一个字符串列表,并且我正在查找单词
Pete
,它还包括我不想要的名称
Peter
。比如说

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


因此,我正在寻找出现两次的
pete
,但是我上面显示的代码会告诉您有三个pete,因为它也计算
pete
。我如何解决这个问题?谢谢。

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

作为示例的解决方案(注意,
pete
出现两次,而
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']])
比较这两个结果

编辑:


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

>>> texts = [['the', 'boy', 'peter'],['pete','the', 'boy'],['peter','rabbit']]
>>> len([True for text in texts if 'pete' in text])
1
匹配部分单词的唯一方法是文本未标记化(即,
text
是字符串列表,而不是标记列表)

但是上面的代码很糟糕,它毫无理由地构建了一个列表。一种更好(更传统)的点击计数方法是:

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

在您的示例中,
peter
出现两次,
pete
仅出现一次,因为您的第一个子列表在
boy
peter
之间没有逗号,我没有进行编辑,因此您可以notice@erasmortg哎呀,我没有意识到。我只是当场做了个例子。事实上,我有我自己的名单,太长了,不能把她发出去e、 谢谢你指出这一点。好吧,我发布的答案怎么样?可能是因为它不是那么直接有用,如果你真的在意,你可以从idf那里得到。嘿,谢谢你的答案。但我不认为这是我特别需要的。如果我将文本更改为
text=[['the','boy','peter',['pete','the','boy'],[“彼得”、“兔子”、“彼得”]]
它将打印出3个“peter”。我可能应该指定
文档频率
是一个术语出现的文档数。如果某个术语在文档中出现100次,它将仅计为1,而不是100。就像我的示例中,“peter”出现在2个文档中,因此df=2,尽管在2个文档中出现了3次(这里是文件清单).希望足够清楚?谢谢though@AnnaRG编辑了答案,请看第二个函数,我相信这会给出您想要的结果。谢谢,它是有效的。但很抱歉,我不得不使用另一个答案,因为它更有效。但您的代码也很好。我认为运营商需要一个词干分析器/柠檬化器、魔法提及检测+实体链接设备这是一个文档频率计数器。不知道为什么你的答案被否决了,但这个答案是正确的。@alvas我不知道你是否在挖苦人,但我肯定不是在请求关于词干分析器/柠檬化的帮助。无论如何,我想这是我需要的答案。非常感谢@alexis。我不认为@Anna要求的太多!这是一个问题在提问之前进行了调查,问题包括“你试过什么?”angle,但可能这个问题在背景信息中有点迷失了。很高兴我的回答帮助解决了这个问题!我不是在挖苦人。但是当你需要将
pete
peter
作为一个整体进行匹配时,很可能你需要一个提及检测+实体链接,通常也会假设一个词干分析器/lemmatizer=)Mais non,不管是谁投的反对票都是不必要的;PAha!:-)@alvas,请仔细阅读问题!将
pete
匹配到
peter
是代码的(感知)问题,而不是要求的功能。
>>> sum(1 for text in texts if 'pete' in text))
1