ランサーズ(Lancers)エンジニアブログ > Python > Lancers社におけるスパムメッセージに対する取り組み

Lancers社におけるスパムメッセージに対する取り組み

s.t|2017年12月25日
Python

ランサーズ社では今年の4月頃から毎週金曜日に自分の好きなテーマの開発ができる20%ルールというものを設けました。6月頃から20%ルールの中で機械学習の取り組みが本格化し始め、外部サービスを使って提供していたレコメンドシステムを内製化することを目標として社内から有志が集まりました。毎月利用費を支払っているので、それが0円になれば成果として見えやすいという理由でレコメンドシステムの内製化をテーマとしました。

機械学習の知識が全くない状態からスタートし、徐々に勉強していく中で、レコメンドシステムが形になっていきました。利用していた外部のレコメンドシステムの契約期間が1年の自動更新だったので、更新しないことをその会社に伝えることで退路を断ち、自分たちのモチベーションをより高めました。

特に大きな問題に直面することもなく、8月にレコメンドシステムをリリースしました。
サンプルデータを使ってリアルタイムレコメンデーションを作る
内製化したことで、レコメンドシステムの毎月の維持費を90%削減することができました。その上、仕事への提案率を150%増加させることもできました。
様々な箇所へレコメンドシステムを応用するプロジェクトも計画されており、内製化したことは良いことづくめでした。

レコメンドシステムが上手く稼働したので、機械学習の取り組みは20%ルールの枠を超え、当社のメインプロジェクトへと格上げされました。機械学習を使った次に取り組むべきテーマは何だということになり、今年に入ってから大幅に増加していたスパムメッセージの検知が候補に上がりました。

Lancersプラットフォームでは、ランサーとクライアントがやり取りするためのメッセージ機能を提供しています。このメッセージ機能は誰でも利用できるため、マルチ商法の勧誘に悪用されることが多々あります。
スパムを送信する人は、Sleipnirのような自動化ツールを使って大量のスパムメッセージを定期的に送信するので、正常なやり取りがスパムメッセージの中に埋もれてしまう問題が起こりつつありました。

レコメンドシステムをリリースする中で培った機械学習の知識を使って、スパムメッセージを検知できるようにするプロジェクトが今年の9月から本格的に開始しました。

まずは、スパムメッセージの特徴を掴むところから調査を開始しました。当社にはユーザからの問い合わせ等に対応する専門のチームが存在します。スパムメッセージを見つけ次第、削除するなどの対応を行なっているのもそのチームになるので、そのチームのメンバーに協力を要請し、わからないことは何でも聞ける状況を確保しました。

スパムメッセージを当社のプラットフォーム上で送信することで、スパマーの人たちにとってどういう形でメリットがあるのか、どうやって送信しているのか、どうすれば送信をやめるのか、なぜ送信し続けるのか、などを調査しました。

マルチ商法のような勧誘は、騙されて知らず知らずのうちに加担していた、というケースが大半だろうという先入観があったのですが、調査の中で分かってきたことは、自ら進んで応募しているケースも無きにしも非ず、ということでした。
そのため、ユーザにスパムメッセージを見せないようにするということが、結果として、スパムメッセージを減らすことに繋がるであろう、という仮説を立てました。

次に、スパムメッセージをどうすれば検知できるかということを調査しました。これは機械学習の知識が役に立つ所で、メッセージの本文をTFIDFでベクトル化し、LSAで次元圧縮し、Passive Aggressiveで学習させています。色々試しましたが、速度と精度のバランスがこの組み合わせが最もよかったです。
スパムメッセージ検知システムを作るにあたり、参考になった論文ベスト3です。
1. 不均衡データにおける偽陽性率を考慮したスパム判別器のオンライン学習
2. ビヘイビアベースマルウェア検知におけるオンライン機械学習アルゴリズムの比較評価
3. フィルタ通過スパムメールの特徴と低減法の検討

機械学習を使ったスパムメッセージの検知が上手くいくことがわかったので、次にどのようにランサーズ社のプラットフォームに組み込むかを検討しました。基本的にはマイクロサービスとして検知システムを組み込むということを方針としました。
当社では、ランサーズプラットフォームのフロントエンド、バックエンド、メッセージ機能、インフラの担当者がそれぞれ分かれています。なので、今回のように横断的に機能を拡張するケースでは、プロジェクトリーダー的な役割が必要でした。
今回のケースでは、検知システムを開発する担当者がプロジェクトリーダーとなり、要件定義、仕様定義、検知システムの設計を行いました。
フロントエンド、バックエンド、メッセージ機能、インフラのそれぞれの要件・仕様をGithubのissueに記載することでコミュケーションを行いました。

検知システムの開発と並行してユーザからの問い合わせ等に対応する専門のチームのオペレーションの変更も検討しました。具体的には、検知したスパムメッセージを社内向け管理画面に表示することで非表示等のオペレーションを行えるようにしました。また、そのための人員リソースの調整等も行いました。

以上で検知システムリリースのための準備が整ったため、2017年12月半ばに検知システムをリリースしました。調査開始から約3ヶ月間でのリリースでした。
3ヶ月程度でリリースできたのは、当社が日頃から協力し合う文化を培っていることが大きかったと思います。また、違反検知システムは現場からの発案で、自発的に開始したプロジェクトになります。ランサーズ社は社員にチャレンジすることを推奨しており、チャレンジする人を周りが協力する文化があります。

自発的に物事に取り組みたい人はぜひランサーズ社のエンジニア職に応募してみてください。
https://www.lancers.co.jp/careers/

[2018-02-06 追記]
違反検知システムを「マルチ商法チェッカー」というサービス名で誰でも利用できるように公開しました。
https://check.lancers.jp/spam

Posted by 高田茂臣(takada.shigeomi@lancers.co.jp)