Ale*_*exZ 1 python sorting math
好的 - 我陷入了两难境地.到目前为止,我的脚本将页面标题转换为类别 这是基于关键字,当匹配时,会添加一定的分数,即某些单词的值为10,有些仅为1.这会累积到每个类别的总分中.
[{15: [32, 'massages']}, {45: [12, 'hair-salon']}, {23,:[3, 'automotive service']}]
Run Code Online (Sandbox Code Playgroud)
索引是类别id,第一个值是得分第二个值类别.
在某些情况下,这超过了10个类别匹配.
我怎样才能将其过滤到前60-75%
即显然,按摩和美发沙龙是最重要的,因为它们远远超过汽车服务.但是,我们如何使用这种情报进行编程?
我以为stddev可以帮忙吗?
编辑
我试图过滤掉低得分项目,例如
data = [{15: [32, 'massages']}, {45: [1, 'hair-salon']}, {23:[1, 'automotive service']}]]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,按摩是唯一得分高的项目
data = [{15: [4, 'massages']}, {45: [2, 'hair-salon']}, {23:[1, 'automotive service']}]]
Run Code Online (Sandbox Code Playgroud)
Stil按摩
data = [{15: [10, 'massages']}, {45: [50, 'hair-salon']}, {23:[5, 'automotive service']}]]
Run Code Online (Sandbox Code Playgroud)
现在发廊(因为它远远高于其他人)
所以我不需要取第一个(N)对象,更多的是,第一个对象比其他数字高x,作为标准偏差的百分比或形式.
所以50比10和5高得多
10比3或2高很多
然而,9,8和6大致相同
这是一个使用的解决方案 heapq.nlargest()
import heapq
data = [{15: [32, 'massages']}, {45: [12, 'hair-salon']}, {23:[3, 'automotive service']}]
N = int(len(data) * 0.6 + 1)
print heapq.nlargest(N, data, key = lambda x: next(x.itervalues())[0])
Run Code Online (Sandbox Code Playgroud)
这打印:
[{15: [32, 'massages']}, {45: [12, 'hair-salon']}]
Run Code Online (Sandbox Code Playgroud)
编辑:如果你想要消除" 低得分项目 ",那么你需要通过" 低得分 " 来准确定义你的意思.
这里有一些代码完全随意定义"低分":如果分数低于最大值一个标准差,则分数很低:
import math
data = [{15: [32, 'massages']}, {45: [1, 'hair-salon']}, {23:[3, 'automotive service']}]
scores = [score for d in data for cat,(score,name) in d.iteritems()]
score_mean = sum(scores) / float(len(scores))
score_stdev = math.sqrt(sum(abs(s - score_mean)**2 for s in scores) / float(len(scores)))
print [d for d in data if next(d.itervalues())[0] > (max(scores) - score_stdev)]
Run Code Online (Sandbox Code Playgroud)
这打印:
[{15: [32, 'massages']}]
Run Code Online (Sandbox Code Playgroud)