45
39

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-10-05

はじめに

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

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

レビューデータ

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

graph2.png

つまり,レビューを投稿した人(レビュア)とレビューの投稿先(商品)をそれぞれ頂点とし,
レビュー関係を枝で表す.レビュー自体は文章でも星何個でも良いが,
そのレビューがポジティブなのかネガティブなのか判断できる必要がある.
今回は,レビューは 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 アルゴリズムを実装した.
また,この種類のスパムレビュアー発見アルゴリズムの評価用人工データ も公開している.
人工データの使い方はスパムレビュア発見アルゴリズムの評価用データセットにまとめてある.
スパムレビュー対策に取り組んでいる人の参考になればと思う.

45
39
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
39

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?