我想计算每个令牌的正/负文档频率的出现次数。但是我的python脚本整个上午都在运行并运行。你能告诉我什么问题吗?提前感谢。
import numpy as np
positive_feature=[[{'a':2,'b':1},1],
[{'b':2,'c':1},1]
]
negative_feature=[[{'e':2,'b':1},0]
]
alltokens=['a','b','c','e']
dic=dict((t,i) for i,t in enumerate(alltokens))
vacabulary_size=len(dic)
positive_doc_frequency,negative_doc_frequency=np.zeros(vacabulary_size), np.zeros(vacabulary_size)
for t in alltokens:
for x in positive_feature:
if t in x[0].keys():
positive_doc_frequency[dic[t]]+=1
for x in negative_feature:
if t in x[0].keys():
negative_doc_frequency[dic[t]]+=1
根据alltokens列表的元素顺序,我想对positive_doc_frequency / negative_doc_frequency如下:
alltokens=['a','b','c','e']
positive_doc_frequency=[1,2,1,0]
negative_doc_frequency=[0,1,0,1]
但是python脚本现在仍然在运行(从早上8点到下午4点),我的脚本是否有任何优化?再次感谢。
更新 由于样本数据不佳,这个问题具有误导性。让我纠正一下。
输入:
alltokens=['a','b','c','e']
positive_feature=[[{'a':aa,'b':bb},1],
[{'b':vv,'c':cc},1]
]
negative_feature=[[{'e':ee,'b':bb},0]
]
我想要的输出是:
positive_doc_frequency=[1,2,1,0]
negative_doc_frequency=[0,1,0,1]
positive_doc_frequency列表中的<1,2> 1,2,1,0代表&#39; a&#39;在positive_feature列表中出现一次,&#39; b&#39;发生两次,&#39; c&#39;发生一次,&#39; e&#39;在positive_feature列表中发生零次。
答案 0 :(得分:0)
from itertools import chain
from collections import Counter
c = Counter(chain.from_iterable(d for d, x in positive_feature))
print(*sorted(c.items()))
这将列出positive_feature
中的所有键,然后计算每个键的数量,然后打印计数。
要获得您想要的计数,请执行
pos_freq = [c[key] for key in alltokens]
答案 1 :(得分:0)
我不确定为什么你的代码会在那么长的时间内运行,即使数据集很大。
Python中count occurrences of things的方法有很多种。我performance tested使用了一些不同的技术,发现标准库中的collections.Counter是最快的方法(因为它仅针对此用例进行了优化,因此毫不奇怪)。
在您的代码中使用collections.Counter
看起来像这样:
from collections import Counter
positive_doc_frequency = Counter()
negative_doc_frequency = Counter()
for t in alltokens:
for x in positive_feature:
positive_doc_frequency.update(x[0].keys())
for x in negative_feature:
negative_doc_frequency.update(x[0].keys())