結託したスパムレビュアを発見するアルゴリズム

Posted: , Modified:   Python DataMining Algorithm Qiita

本稿は Qiita 投稿記事 のバックアップです.

はじめに

オンラインショッピングやレストランレビューサイトにおいて, 結託してレビュー結果が不当に高くまたは低くなるようにダミーレビューを投稿する スパムレビュアーを発見したい.

今回は,2013年に AAAI Conference on Weblogs and Social Media という国際会議で発表された,Fraud Eagle アルゴリズムを実装した.

レビューデータ

Fraud Eagle では下の図のようなレビューグラフを考える.

つまり,レビューを投稿した人(レビュア)とレビューの投稿先(商品)をそれぞれ頂点とし, レビュー関係を枝で表す.レビュー自体は文章でも星何個でも良いが, そのレビューがポジティブなのかネガティブなのか判断できる必要がある. 今回は,レビューは 0 から 1 までの間の数値を取ることにし,0.5 以上ならばポジティブ, そうでなければネガティブと判断することにした.

使い方

今回作成した rgmining-fraud-eagle は PyPI からインストールできる.

pip install --upgrade rgmining-fraud-eagle

fraud_eagle というパッケージがインストールされるので, その中からReviewGraph クラスのインスタンスを作成する. なお,Fraud Eagle は 0 より大きく 0.5 未満ののパラメータを一つとる. パラメータはデータセットによって最適値が変わるが,今回は中央 0.25 を設定してみる.

import fraud_eagle as feagle

graph = feagle.ReviewGraph(0.25)

次に,グラフにレビュア,商品,そしてレビューを追加する. 上記図の通りのグラフを作成する場合,

reviewers = [graph.new_reviewer("reviewer-{0}".format(i)) for i in range(2)]
products = [graph.new_product("product-{0}".format(i)) for i in range(3)]
graph.add_review(reviewers[0], products[0], 0.2)
graph.add_review(reviewers[0], products[1], 0.9)
graph.add_review(reviewers[0], products[2], 0.6)
graph.add_review(reviewers[1], products[0], 0.1)
graph.add_review(reviewers[1], products[1], 0.7)

となる.レビュアと商品は ReviewGraphnew_reviewer, new_product メソッドを使って作成する. レビューは add_review メソッドで追加する.

グラフを作成し終わったら,ReviewGraphupdate メソッドを,更新が収束するまで実行する. Fraud Eagle は Loopy belief propagation というアルゴリズムを使っており, update の呼び出し一回で 1ループに対応させている. update メソッドは,最大修正量を返すので,十分小さくなったところで終了する.

print("Start iterations.")
max_iteration = 10000
for i in range(max_iteration):

   # Run one iteration.
   diff = graph.update()
   print("Iteration %d ends. (diff=%s)", i + 1, diff)

   # 最大修正量が 10^-5 ならば収束したと思う
   if diff < 10**-5:
       break

最後に,解析結果を取得する. new_reviewer メソッドが返したレビュアには anomalous_score という属性がある. この属性は 0 から 1 の値を取り,そのレビュアがどの程度特異(スパマー)かを表している.

for r in graph.reviewers:
    print(r.name, r.anomalous_score)

また,new_product メソッドが返した商品オブジェクトには summary という属性がある. この値は,その商品に付けられたレビュースコアのレビュアの anomalous_score による重み付き平均を返す.(anomalous_score が大きいレビュアのレビューはあまり考慮しない平均値)

for p in graph.products:
    print(p.name, p.summary)

まとめ

結託したスパムレビュアーを発見する Fraud Eagle アルゴリズムを実装した. また,この種類のスパムレビュアー発見アルゴリズムの評価用人工データ も公開している. 人工データの使い方はスパムレビュア発見アルゴリズムの評価用データセットにまとめてある. スパムレビュー対策に取り組んでいる人の参考になればと思う.