我正在寻找一个函数来获取特定术语的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
。我该如何解决这个问题?感谢。
答案 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