ランサーズ(Lancers)エンジニアブログ > 機械学習 > サンプルデータを使ってリアルタイムレコメンデーションを作る – 1. はじめに –

サンプルデータを使ってリアルタイムレコメンデーションを作る – 1. はじめに –

s.t|2017年11月17日
機械学習

サンプルデータを使ってリアルタイムレコメンデーションを作る – 1. はじめに –

  1. はじめに
  2. 類似度計算
    • TF-IDF
    • 次元圧縮
    • コサイン類似度
    • バイナリデータ
  3. Webアプリケーションとしての実装
    • Endpoint設計
    • flask × gunicorn

当連載ではPython3とscikit-learnを使って実装を進めます。Python3のインストール方法についてはこちらを参考にしてください。
scikit-learnのインストール方法については公式サイトをご参照ください。

Lancers社では仕事詳細ページ下部にそのページの仕事と類似する仕事をレコメンドとして表示しています。
このレコメンドシステムを開発するにあたって得たノウハウを当連載にて共有します。

2017-11-17 12 05 20

参考資料

これらの参考資料を読みこなせば、機械学習を使ったリアルタイムレコメンデーションを作ることができるようになります。

レコメンドとは

レコメンドのパターンは「情報推薦システム入門 -理論と実践-」によると、大きく次の3つに分類されます。
– 協調型推薦
このアイテムを買った人はこのアイテムも買っています、というアプローチ
– 内容ベース型推薦
アイテムの特徴を利用してアイテムを推薦するアプローチ
– 知識ベース型推薦
賃貸物件の検索サイトなどでよく使われる手法で、条件を絞っていき、希望のアイテムを見つけるアプローチ

当連載では、内容ベース型推薦を使ったレコメンドを実装していきます。内容ベース型推薦では、アイテムの特徴が類似しているものをレコメンドします。アイテムの特徴として、タイトルと本文を利用します。

レコメンドのパターンについてまとめました。

データセット

機械学習において、学習に使うデータをデータセットと呼びます。当連載ではデータセットとして下記サンプルデータを使って実装を進めていきます。
こちらのサンプルデータは、ランサーズ社で一般公開されている仕事データの一部を分かち書きにして、名詞だけを抽出したものです。仕事データのタイトルと本文を連結した上で分かち書きしています。
本文よりもタイトルに出てくる単語を重要視するといったことも考えられますが、誰もがタイトルを上手く付けられるとは限らないので、タイトルと本文に出て来る単語は平等に扱います。

分かち書きの手法についてはこちらを参考にしてください。

サンプルデータは以下のようなJSON形式でデータを保持しています。idは0からの連番を割り当てています。bodyはタイトルと本文を連結して分かち書きにしたものです。

{id1: 'body1', id2: 'body2', id3: 'body3',...}

json形式のファイルをzipで圧縮しています。
サンプルデータ

特徴エンジニアリング

機会学習させるためのデータに何を選ぶか、選んだデータをどのように加工するかなどを考えることを特徴エンジニアリングと呼びます。機械学習で高い精度の結果を得るためには、特徴エンジニアリングが何よりも重要になります。
学習モデルを作るにあたり、何がそのアイテムを特徴付けているかを人間が考える必要があります。
当連載では各仕事データのタイトルと本文の単語を特徴として使用するので、アイテムを特徴付けるわけではない、不要な単語(特徴)をできる限り取り除く必要があります。
例えば、以下のような文言はランサーズ社の仕事データ内によく出現するにも関わらず、その仕事データを特徴付ける訳ではないので、取り除く必要があります。

宜しく
よろしく
お願いいたします
お願い致します
お願いします
お願いします
ご迷惑をおかけしますが
この度はご協力頂き
ありがとうございます
ありがとうございました
有難うございます
有難うございました
いつもお世話になっております

また、下図仕事データの青枠で囲んだ部分のような定型文もランサーズ社の仕事データ内に機械的に出現するだけで、その仕事データを特徴付ける単語ではないので、取り除く必要があります。
文章を特徴付ける単語は、ロゴ, 制作, サイトといったものになります。

aowaku

サンプルデータは、主な不要単語を取り除いた上で分かち書きしています。

2.類似度計算へ続く

Posted by Shigeomi Takada(takada.shigeomi@lancers.co.jp)