いろいろやってみるにっき

なんとか自分の会社を立ち上げるところまで漕ぎ着けた、てきとーに生きている奴の日記

関連記事を探すときは、読んだ記事と同じカテゴリをクリックしてください。

記事のカテゴリは記事タイトル下に表示されています。カテゴリ一覧はサイドバーにあります。


はてなハイクのスパム投稿排除方式案

はてなに≪ほぼ放置≫されているはてなハイク

トップ画面を見るとスパムエントリばかりで、一般エントリが飛び飛びに見える程度のこともある。

スパム除けだと思うけど、メール投稿に気付いたらどうするんですかね?

(中略)

今回のreCAPTCHA追加で、さらにスパマーのチャレンジ精神を掻き立てて、ほとんど効果無かったら笑える。

以前も書いた通り、WebエントリだけにしかreCAPTCHAは効かないので、メールエントリに気付いたスパマーは投稿し放題。

f:id:shigeo-t:20151110025207p:plain

62個も一気にエントリしたら、そりゃトップ画面はスパムだらけですよ。上のやつなんて全く同内容。この例だけではないけど、ハイクへのスパムの場合、多くはスパム投稿者に実利がありそうな内容ではないけど、 一般の利用者にとっては邪魔で仕方ない。

ある時点の注目キーワードを見るとこんな感じ。NCAANFLに興味があったとしても、注目キーワードに上がるほど同じ内容を短時間にエントリされても邪魔である。

f:id:shigeo-t:20151110025642p:plain

 あと、WebエントリのほうでもreCAPTCHAが出てくるまでエントリを続けて、引っ掛かったら別アカウントに変えているようだ。

f:id:shigeo-t:20151110030139p:plain

そんな状態の時のユーザー一覧。ハイクユーザの場合、デフォルトアイコンのままの人は少ないのだが、一覧がデフォルトユーザが大勢を占めているということは、ほとんどスパムエントリということになる。

f:id:shigeo-t:20151110030303p:plain

といったわけで、これが現状。reCAPTCHAはオレの予想どおり、永続的な効果は無かった。 

 

ここからがスパム投稿排除方式案の提案。4つのフェーズに分けてスパム投稿を排除する。

  1. トレーニング
  2. メール投稿への実装
  3. Web投稿への実装
  4. APIへの組み込み

実施内容だが、Supervised LearningでBoostingやSupport Vector Machine(SVM)あたりの手法を使う。まず、それぞれの用語を簡単に説明する。もっといいページもあるのだが、今回はWikipediaで統一しておく。もっといいページはぐぐれば出てくる。

  教師あり学習 - Wikipedia

教師あり学習(きょうしありがくしゅう, 英: Supervised learning)とは、機械学習の手法の一つである。事前に与えられたデータをいわば「例題(=先生からの助言)」とみなして、それをガイドに学習(=データへの何らかのフィッティング)を行うところからこの名がある。

  ブースティング - Wikipedia

ブースティング(英: Boosting)とは、教師あり学習を実行するための機械学習メタアルゴリズムの一種。ブースティングは、Michael Kearns の提示した「一連の弱い学習機をまとめることで強い学習機を生成できるか?」という疑問に基づいている。

  サポートベクターマシン - Wikipedia

サポートベクターマシン(英: support vector machine, SVM)は、教師あり学習を用いるパターン認識モデルの一つである。分類や回帰へ適用できる。

Supervised Learningを使う理由は単純で、すでにスパムエントリが山ほどされているため。学習器に与える例題を作ることは、作業量は多いが難易度は低い。それに、単純にブラックリスト方式なんてやったら、あっという間にブラックリストが陳腐化するか、ブラックリスト作成工数が積み上がる。URLは短縮URLに変えれば文字列は変わっちゃうし。こんなものは機械学習に任せておくに限る。

 

BoostingやSVMあたりのアルゴリズムは、Azure Machine Learningなどに搭載されている。わざわざ自前で作るまでもない。有償だが使った方が早い。コストを考えて自前で作るなら、しばらくAzure Machine LearningやSoftLayer IBM Watsonなどで学習実績を積んだ後でいい。

最終的にどのアルゴリズムにするかは、処理速度と学習データの(つまりスパムエントリの)特徴に合わせることになると思うが、面白い論文を見つけた。学士論文いわゆる卒論である。

  SPAM メールの判別に適した機械学習

複数のアルゴリズムの比較を英文SPAMメール、日本語SPAMメールで判別実験を行った結果である。一つの参考事例となる。

 

Supervised Learningを使うとして、スパム判定に3つポイントを提案する。

  1. アカウントは無視する
  2. タイトルは無視する
  3. 日本語は後回しにする

1点目だが、スパマーは複数のアカウント(はてなid)を使い回している。使えなくなったアカウントはどんどん捨てていくだろうことを考えれば、アカウントは見ても仕方ない。もっとも、こんなに簡単にスパム用はてなidを取得できているということは、使っているメールアドレスも山ほど取得できているか、Gmailみたいに「.」の打ち場所で複数アカウントを使い分けているか。後者が通るなら、はてなのid取得プロセスを見直す必要がある。

2点目は上にスクリーンショットを貼ったおはようの例を見ても明らか。独自タイトルのエントリが多いが、既存タイトルも浸食されている。タイトルは無視すべき。

3点目だが、上に紹介した卒論でも明らかに現れているが、日本語の場合、英語よりも処理が難しい。分かち書きの英文に対して、単語分割と活用(五段活用とかサ行変格活用とか)の判断が必要な日本語。形態素解析から面倒。現在、本文はほぼ英文とURLだけのスパムなので、日本語があってもその部分は無視していい。スパマー側がURL以外を日本語にすればスパム扱いから外れることを学習したら、日本語対応をすればいい。 

自然言語処理の基礎

自然言語処理の基礎

 

 

あと、スパム判定したあとの対応だが、エントリさせずにリジェクトしてしまうと、DoS状態になるほどアップしてくる可能性がある。そのため、タイトルを外してエントリ完了にしてしまえばいい。idページに行く。英語で問い合わせが来ても、スパムだからと触れずにidページにエントリされているとだけ返しておけば、スパマーもやる気無くすはず。あと機械学習は100%にはならないので、誤検出対策としても完全にリジェクトはしないほうがいい。

 

トレーニングできたら、まずは連発が止まらないメールエントリから実施し、Webエントリ、APIの順に適用していけば、かつてのはてなハイクのようなトップ画面に戻るはず。明日のポッキーの日のように、「20xx/〇/〇 〇:〇:〇を取るお題」などのようなものはスパム扱いにならないように、誤学習や過学習は排除してね。

http://www.flickr.com/photos/15811481@N08/6779941252

photo by RHiNO NEAL

 

あと参考になるものをいくつか貼っておく。

 
こんなのも書いた。


言語処理のための機械学習入門 (自然言語処理シリーズ)

言語処理のための機械学習入門 (自然言語処理シリーズ)

 
実践 機械学習システム

実践 機械学習システム