1

好的 - 我有一个难题。到目前为止,我的脚本将页面标题转换为类别。这是基于关键字的,当有匹配时,会添加一定的分数,即有些单词的值是 10,有些只有 1。这会累积到每个类别的总分中。

[{15: [32, 'massages']}, {45: [12, 'hair-salon']}, {23,:[3, 'automotive service']}]

索引是类别 id,第一个值是分数,第二个值是类别。

在某些情况下,这跨越了 10 多个类别匹配。

如何将其过滤到仅前 60-75%

即显然按摩和美发沙龙是最多的,因为它们远远高于汽车服务。但是我们使用的这种智能如何被编程呢?

我在想 stddev 可以提供帮助吗?

编辑

我正在尝试过滤掉低分项目,例如

data = [{15: [32, 'massages']}, {45: [1, 'hair-salon']}, {23:[1, 'automotive service']}]]

按摩是本例中唯一的高分项目

data = [{15: [4, 'massages']}, {45: [2, 'hair-salon']}, {23:[1, 'automotive service']}]]

斯蒂尔按摩

data = [{15: [10, 'massages']}, {45: [50, 'hair-salon']}, {23:[5, 'automotive service']}]]

现在美发沙龙(因为它远高于其他)

所以我不需要将第一个(N)个对象,更何况,第一个比其他数字高 x 的对象作为标准偏差的百分比或形式。

所以 50 远高于 10 和 5

10 远高于 3 或 2

但是 9、8 和 6 大体相同

4

2 回答 2

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])

这打印:

[{15: [32, 'massages']}, {45: [12, 'hair-salon']}]

编辑:如果您想消除“低分项目”,那么您需要准确定义“低分”的含义。

下面是一些代码,它对“低分”有一个完全任意的定义:如果分数比最大值低一个以上的标准差,那么分数就是低的:

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)]

这打印:

[{15: [32, 'massages']}]
于 2012-06-15T00:57:25.777 回答
2
yourdata = [{15: [32, 'massages']}, {45: [12, 'hair-salon']}, {23:[3, 'automotive service']}]

# transfer your data into a more usable format
data = [(score,cat,name) for dat in yourdata for cat,(score,name) in dat.iteritems()]

# sort on descending score
data.sort(reverse=True)

# throw away the low-scoring items
data = data[:int(len(data)*0.6 + 1)]

返回

[(32, 15, 'massages'), (12, 45, 'hair-salon')]

(得分最高的两项)

于 2012-06-15T00:34:26.573 回答