Gunosyデータ分析ブログ

Gunosyで働くデータエンジニアが知見を共有するブログです。

新卒入社して半年が経ちました vol.3 〜アプリ健全化〜

はじめに

こんにちは、GTL Media ML チームの谷口(2020新卒)です。本記事では、現在私が関わっているプロジェクトの一つである「扇情的な記事の判定」についてお話しします。

現在当社では、中長期的な成長を見込んで、アプリで提供するニュース記事リストの健全化を進めるという方針をとっています(詳しくは東洋経済ONLINEでの当社インタビュー記事をご参照ください)。そして、その方針に沿った複数の施策が行われています。私はその一つである、扇情的な記事を自動で判定してリスト生成に活用するという試みに携わっています。

toyokeizai.net

実際にどのようなことを行ったか

1. 扇情的な記事とはなんなのか、その定義を決める

この施策は、 扇情的な記事とは一体何なのか ということを検討するところから始まりました。実際に記事を分析しながら扇情的な記事の分類を定義していきます。ここで難しいのは、「何を扇情的だと感じるか」は人によって異なるということです。過程として、複数人で同じ記事に対して「扇情的かそうでないか」を評価し、意見が食い違ったところに対して議論を深め、ということを繰り返していきました。

このさなか、「これで定義は完成だ」と安心しては、テストラベリングにて「やっぱり判定がぶれそう/定義が曖昧すぎる」と落胆する、という流れを幾度となく味わいました。例えば、「肌の露出が多い画像を含む記事はアウト」という一見疑いようのない基準を定義したのちに、 「あれ、名画に含まれる裸はセーフなのでは?」、「下着の特集はどうなる?」 といった迷いに直面しました。また他の例として、「中傷を含む記事はアウト」と定義したのちに、 「作品への批判はセーフだけど演者に対する文句はどうなる?」、「中傷とまではいかないけど感じの悪い書き振りだったら?」 という迷いが生まれるということもありました。このような問題は本当にきりがありません。8回の議論、そしてのべ約5500記事に対するテストラベリングの末、最終的に定義・分類が一枚の文書にまとめられました。このガイドラインが完成したときは感無量の極みでした。以下に定義の一部を引用します。

f:id:MCtaniguchi:20201027173335p:plain

f:id:MCtaniguchi:20201027173356p:plain

2. その定義に沿って人手判定を行い正解データを作成する

上記で定義されたガイドラインにしたがい、実際の記事に対して人手判定を行い正解データを作成します。具体的には、スプレッドシートに羅列された記事の中身を見て、「扇情的かそうでないか」・「扇情的であるなら分類/細分類はどれか」というラベルを付与していく作業です。この作業で必要なのはとにかく 「根気」と「集中力」 に尽きます。このラベル付与は3人で行われ、およそ1000記事分の正解データが完成しました。

f:id:MCtaniguchi:20201027174005p:plain:w200

3. 手法を開発し、正解データを用いて評価する

次に、各記事に対して扇情的であるかどうかを自動で判定する手法を開発していきます。

初手として、ワードマッチングを主としたルールベースの手法を選択しました。ワードマッチングは、判定理由がわかりやすく解釈性の高いアルゴリズムであるため、後々の改善も容易になると考えたからです。主にこちらで決めたワード群が多く含まれていたらアウト判定をくだします。以前より当社で制定されていたNGワードリストに加え、新たに私たちでNGワードを追加する形となりました。新規NGワードは実際に記事を見ながら抜き差しして検討しました。 「あるワードが効きそう!」と思って追加しても逆に全体で見ると性能が下がる こともあり、あちらが立てばこちらが立たずという状況を繰り返しながらワード群を決定しました。

ただ、現時点で制定されたワード群によるルールもまだ完全とはいえません。セクション2で作成した正解データで評価すると、まだまだ誤判定される記事は多いというのが現状です。手法が一度アプリに適用されたあともまだまだ改善していく必要があります。

以下に現在の手法で利用されているワードのほんの一部を紹介します。

- アダルトワード
  - 美ボディ
  - バスト
- 中傷に関するワード
  - 批判殺到
  - 炎上
  - 厳しい声

4. 手法を実装する

以上の手法をアプリのコードに適用します。バックグラウンドで扇情的な記事判定の元となるスコアリングを行う部分はPython、そのスコアなどを用いて記事リストを生成しユーザーに提供するAPIはgolangで書かれています。golangは入社して初めて触れたのでまだ慣れていませんが、徐々に学んでいきたいと思います。

最後に

新卒目線という意味でも有意義で、かつ社会性を重視したものでやりがいもあり、良いプロジェクトだなと感じています。要件定義・手法開発・コード実装などと多くの要素が含まれており、一つのプロジェクトからとても多くのことが学べました。分析するモードと実装するモードで脳みそを切り替えないといけないのが大変でした。健全化施策に取り組んでいると、私たちも「健全な社会のためにがんばろう」という意欲がわいてきます。