1

わかりました-私にはジレンマがあります。これまでのところ、私のスクリプトはページタイトルをカテゴリに変換します。これはキーワードに基づいており、一致する場合は特定のスコアが追加されます。つまり、一部の単語は10の値を保持し、一部は1のみになります。これは各カテゴリの合計スコアに累積されます。

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

インデックスはカテゴリIDであり、最初の値はスコア、2番目の値はカテゴリです。

場合によっては、これは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']}]

編集: 「低得点アイテム」を排除したい場合は、「低得点」の意味を正確に定義する必要があります。

以下は、「低いスコアリング」の完全に恣意的な定義を取るコードの一部です: スコアが最大値より 1 標準偏差以上低い場合、スコアは低いです:

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

(スコアが最も高い2つのアイテム)

于 2012-06-15T00:34:26.573 に答える