エンジニアの西場(@m_nishba)です。自然言語処理を使ったリコメンドや文書分類、ユーザー分析を行っています。最近、開発中のリコメンデーションのアルゴリズムについて紹介します。普通にMeCabを使う。文字ベースとMeCabの組合せを使う。Positive/Negative数が等しくなるようにサンプリングを行う。Factorizationにbiasを導入する。最後にモチベーション弊社では様々な形態の医療系コンテンツ(テキスト、動画、画像)を扱っています。様々なコンテンツを同時にリコメンデーションをしたいと考えています。そこで協調フィルタリングを使用しようと思っているのですが、アイテム・コールド・スタート問題を解決する必要があります。ユーザーからの評価が少なく、リコメンドするためのデータが十分に蓄積されていないことをコールド・スタートと呼びます)弊社ではニュース記事等の配信も行っており、全く評価されていない(クリックされていない)アイテムをリコメンドする必要があります。このようなアイテム・コールド・スタート問題に対応するために、内容ベース・フィルタリングとのハイブリッドにしたいのですが、短い文書に対応する必要があります。いうのもニュース記事等は十分な文章量がありますが、動画コンテンツの場合、テキストはタイトルのみ場合もあるからです。Recommendationを実装して実データで試してみようと思います。(論文の内容は後述します。詳細に入る前にリコメンドアルゴリズム作成時の問題点とアプローチをまとめます。協調フィルタリングと内容ベースフィルタリングの組合せ内容ベースで使用できるテキストが短い。word2vecを使った方法やword2vec+TFIDFを使った方法より非常に良さそうな結果になりました。本題に入る前にテキストに対してCNNを使う方法を紹介したいと思います。2014)に従っています。(弊社の工夫は後述する日本語のTokenizeのみです。)この論文はタイトルの通りCNNを使って文書分類を行っています。モデルはシンプルで下記の図のようになります。流れで処理しています。layerでdropoutを使っています。sizeを複数使用し、n-gramのような処理を実現しています。channelとして、ランダムに初期化されたembeddingとwikipedia等を使って学習したword2vec等のembeddingを同時に使用することも提案されています。論文では様々なデータ・セットに対して他のアルゴリズムと比較しています。reviewsのデータ・セットを使って、そのreviewがpositive/negativeかどうか分類する問題で、論文の結果を再現します。ソースコードはここにあります(が、検証用でぐちゃぐちゃです)。embeddingを使用せず、word-embeddingをrandomに初期化し、分類問題と同時に学習するCNN-randモデルを実装し、検証しました。結果は下記のようになり、論文の76.1を概ね再現できています。弊社では医療関連のニュースの配信を行っており、配信するニュースに強く関連するタグを付けて、リコメンドに活かしています。現状、それらのタグは人手で付けており、それを自動化できるか検証します。今回はニュースのタイトルから「地域」タグがつくかどうかの2値問題を考えます。一般にニュース記事に関連する地域の特定は、ニュース配信サービス等では重要な課題となっています。(実際は都道府県等のタグを付けたいのですが、これは他の業務への布石なので簡単なケースにしています。上で紹介したCNNでの手法を使用するために日本語をトークンに分割する必要があります。ここに英語と違って日本語の自然言語処理の難しさがあります。普通にMeCabを使う。今回は地域ニュースかどうかなので、医療専門用語の重要性も低いので医療系のユーザー辞書を使わずにmecab-ipadic-NEologdをそのまま使います。文字ベースとMeCabの組合せを使う。工夫した方法でトークン化したいと思います。今後は文字ベースでの自然言語処理を進めていたいと考えています。いうのは「肺癌」「胃癌」という単語は状況によっては非常に似ている分散表現を得たいです。これらを学習させるには医療系のテキストが大量に必要になります。癌なら多く手に入りますが、希少疾患だと大量のテキストを得るのは難しいです。そもそも癌という文字が含まれているので、文字ベースのほうが効率的に分散表現が得られるのではないかと考えられます。そこで下記のようなルールでトークン化を行います。連続するカタカナ・アルファベット・数字に対してのみMeCabで単語に分割する漢字・ひらがなは一文字ごとに分割する例えば下記のように分割することになります。炎,検証結果(詳細なデータは出すことができません。)0:地域タグがついていない1:地域タグが付いているとして分類問題を解いています。27551のrecallがかなり悪いですね。逆にprecisionが下がっています。実際は地域タグが付いていないのに、地域タグ付きだと分類してしまった例は下記のようなものがあります。東京都千代田区、インフル予防接種、高校生まで無料化この中で明らかにおかしいの4番、5番、6番ですね。他は地名や施設名が含まれていますし、3番のタイトルも"病院内"となっており、特定の病院を指しているので、地域性が高い可能性があります。教師ラベルは擬似的に作ったということもありノイズが多そうです。(このモデルを使って教師データの作り直しをそのうちしようかと思います)コンテンツのリコメンド本題のコンテンツのリコメンドを考えます。動画やニュース記事等を一緒にリコメンドしたいのですが、問題が2つあります。公開期限付きのものや情報鮮度が大事なのもが多く基本的にはアイテム・コールド・スタート問題になります。動画の原稿はなく、使えるテキストはタイトル(短い文章)しかありません。そこで、コンテンツ・ベース・フィルタリングと協調フィルタリングのハイブリッドを考えます。Factorizationにより、ユーザーとアイテムの潜在ファクターを求め、CNNを使ってアイテムの潜在ファクターをテキストから再現するように学習します。Factorizationの潜在ファクターを求めることができます。詳細は論文を見てほしいのですが、最小化する数式を紹介します。CNNのパラメータです。これは同時に解くことが困難で、ユーザーの潜在ファクター、アイテムの潜在ファクター、CNNと順に学習させることを収束するまで繰り返します。feedbackのデータです。ユーザー数、アイテム数も論文内で実験に使われていたデータよりも多いです。そこでアルゴリズムを少し変更します。論文では潜在ファクターの最適化の際、近似解を逆行列を通して計算していました。これは状況によっては非常に時間がかかります。ImplicitFeedbackなので、MovieLensのようなレーティングされたデータのように"評価されたペアのみを考える"ことができません。(SGD)を使用します。Positive/Negative数が等しくなるようにサンプリングを行う。学習時にクリックされたデータ(positive)と同じデータ数のクリックされていないデータ(negative)を使用します。negativeデータはepochごとにサンプリングしなおします。Datasetsのように確信度を導入してもいいのですが、今回SGDを使っているのデータ数調整で同様な効果を得ることにしました。Factorizationにbiasを導入する。Factorization時にbiasを導入します。それぞれユーザーとアイテムのバイアスを表すスカラー値です。この導入はパフォーマンスに大きな影響がありました。いうのもニュース記事等は時期や公開時間等のタイミングによってアクセス数が大きく異なります。それは同じようなタイトルの記事でも全然違うアクセス数になるということです。大きくなり、逆に少ないと小さくなります。同じようなタイトルでこのようなことが生じるとCNNの学習が進まなくなります。大小まで判断つかないからです。最小にするように学習させます。文字ベースと単語ベースの組み合わせ最初の文書分類のときに紹介した方法を使います。この方法により未知の単語へ少しは対応できるようになります。短い文章の中に未知の単語が含まれると致命的になります。"子宮動脈塞栓術"という単語が始めて出てきたとしても、文字ベースだとそれなりの分散表現を得ることができます。計算することができます。同じような傾向の人がクリックするかどうか(協調フィルタリング)と同じような文字がふくまれているかどうか(CNN)といった情報を持ったベクトルになります。より、ユーザーがアイテムを好むかどうかのスコアが得られます。予測することができれば、新しいアイテムをリコメンドすることができます。その方法はまた別の機会に紹介したいと思います。上記の方法で学習されたCNNを使い、短い文章をベクトル化し、文章の似ている度合いを計算してみます。類似度はコサイン類似度を使いました。ターゲットとする文章は訓練時に使用していない文章を使用しています。word2vecを使った方法、word2vec+TFIDFを使った方法より非常に良さそうな結果になりました。後発薬241品目を承認、降圧剤アイミクスに20社========================================================================これらの記事は肺癌に関連している同じユーザーに読まれているといった特徴があります。CNNを組み合わせることにより、”肺癌に関連している”記事を選ぶことができます。いったコンテンツが豊富にあり、分析によってビジネスを加速することができます。特徴として、ビジネスに直結しているメインサービスにアルゴリズムの導入ができる。アルゴリズムのABテストをビジネスサイドが受け入れてくれる動画等に対する長期的なアルゴリズム開発にも挑戦できる。外部API等では実現できない面白い課題に専念できる。(外部APIでできる問題は外部APIを使います。)新卒・中途関係なく、自分が担当する案件のメイン開発者になれる。いったところがあります。興味のある方は応募フォームまたは@m_nishibaまでご連絡ください。あけましておめでとうございます。月別アーカイブ注目記事はてなブログをはじめよう!m3techさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。