はじめに
こんにちは。Webサービス開発グループの2019年度新入社員の中村です。
大学・大学院では、深層学習を用いて動画から人間の行動認識をする研究を行っていました。今回は機械学習をビジネスに活かす方法として、レコメンドに挑戦してみました。
なぜレコメンドが重要なのか
それぞれのユーザーの趣味・嗜好に合わせた情報を届けることは、収益につなげるために重要な技術になってきます。
しかし、人間が大量のレコメンド対象に対して、適切なレコメンドを作成することには限界があります。
そこで、今回は簡単な機械学習(統計学)を用いて、簡易的なレコメンドエンジンを作成し、結果をサイトとして公開します。
完成したサイトはこちらです。
今回の目的
Wikipedia文章を元データにして、文書特徴量を生成し、「日本の女優」の簡易レコメンドエンジンを開発します。
「日本の女優」を題材にしている理由は、好きな女優に似ている女優を好きになるだろうという仮定が成り立つことと、OJT業務の中で@nifty グラビアのサービスに少し触れたため、この題材になりました。
抽出するカテゴリを変更する(例えば男性俳優)ことで、手法は変更せずに別の題材でレコメンドエンジンを作成することも可能です。
手法
内容ベースのレコメンドエンジンを実装します。
今回は以下の記事を参考に、Wikipediaの文章からTF-IDFを算出し、コサイン類似度を計算することで似ている女優をレコメンドします。
(それぞれの手法の細かい説明は割愛します。ただしTF-IDFに関して、単語の出現頻度のみの計算になっているため、正確にはTF特徴量になっています。)
https://postd.cc/simple-similar-products-recommendation-engine-in-python/
https://qiita.com/haminiku/items/f5008a57a870e0188f63
手順
まず、Wikipediaの文章を抽出します。
Wikipediaのクロールは禁止されているため、今回はWiki Extractorというツールを使用して、「日本の女優」カテゴリに含まれる人物の文章をWikipediaのダンプデータから取り出します。
Wiki Extractorのダウンロード
Wiki Extractorのスクリプトを以下からダウンロードします。(ver2.75)
https://github.com/attardi/wikiextractor
Wikipediaダンプデータのダウンロード
日本語Wikipediaのダンプデータを下記から入手します。
https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2
カテゴリを指定するcategories.filterには、「日本の女優」とだけ書いて同階層に保存しておきます。
1 2 |
python WikiExtractor.py jawiki-latest-pages-articles.xml.bz2 --json --processes 4 --output output_data --links --sections --lists --keep_tables --filter_disambig_pages --filter_category categories.filter cat ./output_data/AA/wiki* > ja_josei_model.json |
上手く取り出せると、以下のようなJSONデータが取得できます。
1 2 3 4 5 6 7 8 |
{"id": "70708", "url": "https://ja.wikipedia.org/wiki?curid=70708", "title": "片岡涼乃", "text": "片岡涼乃 片岡 涼乃(かたおか さやの、1994年6月11日 - )は、東京都世田谷区出身の女優・タレント。 所属事務所はセントラルグループ・セントラル子供タレント、レプロエンタテインメント・J-CLASS部門(2003年以降)を経て、現在はフリーで活動している模様。 "} {"id": "79237", "url": "https://ja.wikipedia.org/wiki?curid=79237", "title": "秋桜子", "text": "秋桜子 秋桜子(こすもすこ、Cosmosco、年齢非公表)は、日本の女優、モデル。本名は非公開。北海道出身。所属事務所はティー・アーティスト。趣味は散歩、カラオケ、ショッピング。 1991年、17歳の時、写真家・荒木経惟の札幌でのトークショーを観覧した際、荒木に声をかけられ写真のモデルを務めることになる。撮影旅行中、コスモスを手にした写真が印象的だったことから「秋桜子」と名付けられ、以来芸名とする。1998年に、ロンドン留学から戻ってきた際のヌード撮影を機に、それまでの写真をまとめ、写真集『秋桜子』を発表した。現在は、主に女優として映画やテレビドラマを中心に活動している。 『秋桜子』荒木経惟撮影(1998年10月20日、小学館) "} {"id": "124402", "url": "https://ja.wikipedia.org/wiki?curid=124402", "title": "藤吉久美子", "text": "藤吉久美子 藤吉 久美子(ふじよし くみこ、1961年8月5日 - )は、日本の女優、ナレーター。戸籍名:坪倉 久美子(旧姓:藤吉)。血液型はAB型。劇団青年座映画放送所属。夫は太川陽介。4人兄妹(兄1人、妹1人、弟1人)の長女。 1961年8月5日、福岡県久留米市大善寺町出身。久留米市立大善寺小学校卒業、福岡女学院中等部卒業、福岡女学院高等学校卒業、大阪芸術大学芸術学部舞台芸術学科中退。 実家は産婦人科医院。福岡女学院高等学校時代にモダンダンスに魅了され、大阪芸術大学芸術学部舞台芸術学科に進学、大学では、舞踏を専攻する。のち演劇を志して劇団☆新感線に入団するも、大学在学中に、NHK「連続テレビ小説」の公募に応じ、568人の応募者の中からヒロインに選ばれる。1982年10月から半年間放送された連続テレビ小説『よーいドン』で、波乱万丈な人生を生き抜く健気なヒロインを演じた。朝ドラのヒロインに選ばれた事もあり、大学は中退し、劇団☆新感線も退団した。 1985年、テレビドラマ『しのぶ』に出演、『おやじのヒゲ2』(1987年)では、一転してコミカルな役柄を演じた。その後も数々の作品に出演を。殊にTBSの昼ドラ『温泉へ行こう』(1999年 - 2005年)では、持ち前のバイプレーヤーぶりを発揮し、第1 - 第5シリーズに出演している。 2004年4月2日から2008年3月28日まで、TBSの情報番組『はなまるマーケット』に金曜レギュラーとして出演。同番組でのコーナー「今ドキ!」(2004年4月 - 2005年3月)、「ふじよし洋品店」(2005年4月 - 2006年3月)、「ふじよし洋品店デラックス」(2006年4月 - 12月)を担当した。 私生活では、雑誌「フライデー」(講談社、1987年5月8日号)で、「よーいドン」で共演した歌舞伎役者の坂東正之助(現・四代目河原崎権十郎)との抱擁現場をスクープされ、翌年、正之助と結婚。しかし1992年、価値観の相違、梨園になじめないことなどを理由に離婚。1995年、タレントで俳優の太川陽介と再婚。おしどり夫婦として知られ、夫婦での仕事も多い。 2001年、39歳で出産。いわゆる高齢出産の年齢であり、藤吉にとっては初産であることも考慮し帝王切開で男児を出産した。 食育に造詣が深く、2004年に開催された「第1回・食を考える国民フォーラム」ではパネリストとして参加。「正しい食生活を子供に身につけさせるのは親の責任」と、独自の食への考えを語った。藤吉自身はタイ料理が好物。タイ好きが高じて本を上梓したほどである。しかし太川は辛い料理が大嫌いだという。また、ワインにもはまっているという。 2017年12月14日、大阪・朝日放送の50歳代既婚男性プロデューサーとのダブル不倫疑惑を報じられ、謝罪会見を行った。 他多数 "} {"id": "134321", "url": "https://ja.wikipedia.org/wiki?curid=134321", "title": "小林麻美", "text": "小林麻美 小林 麻美(こばやし あさみ、1953年11月29日 - )は、日本のモデル・元歌手・元女優。本名、田邉 稔子(たなべ としこ)。旧姓、小林。 東京都大田区大森出身。普連土学園中学校・高等学校卒業。夫は田辺エージェンシー社長の田邊昭知。 生家は大森新地近くにあり、父親は国鉄の信号機などを設計する技術者、母は美容師で共働きであった。7歳違いの姉がいる。15歳の時、骨髄炎から急性肝炎を併発して1年間入院療養をする。高校一年の時、少女雑誌のモデルにスカウトされ、2、3回その仕事をこなした後、1970年、ライオン歯磨のコマーシャルガールに選ばれる。しかしこの時、テレビコマーシャルの撮影でスキーを行った時に複雑骨折してしまい、長期休業。小林をあてにしてのれん分けまでしたその事務所は、1ヶ月で消滅してしまう。 1972年、18歳の時、東芝レコードから「初恋のメロディー」で歌手デビュー。同期に麻丘めぐみ、五十嵐じゅんら。「初恋のメロディー」はオリコン18位を記録したが、当時のアイドルに多く求められた、明るく無邪気に笑顔を見せる天真爛漫さとは対極にあるような、殆ど笑顔を見せずにうつむき加減、猫背で気だるそうに歌う小林の姿は異質にも映り、暗い印象を持たれた。1976年までに年に1枚程度のシングルをリリースするが売り上げは伸びず、アイドル歌手としては不向きとみた事務所の方針で歌手活動は自然消滅となる。 小林の名が浸透したのは1970年代後半、資生堂、パルコなどのCMに起用されてから。特に1977年のパルコCM「淫靡と退廃」で、細い体や暗さが受け入れられた。 その後に所属した主な芸能事務所は、田辺エージェンシー。 1984年に8年ぶりに歌手として、海外のカバー曲「雨音はショパンの調べ」をリリースし、大ヒット曲となった。だが当時、歌番組で歌ったことは一度も無かった。但し小林本人はラジオ番組で「私自身は全く断ってないのよ。テレビで歌いたかったのに」と主張したことがある。 公称167cmと長身で華奢と言えるほど細い身体、ゆるくウェーブのかかったワンレングスの長い髪、溌剌と話さず物静かで寡黙、陰のある表情が印象的で、そのアンニュイな雰囲気が都会的と言われて人気を得た。 都会的でファッショナブルな女優という認知であったため、『真夜中の招待状』ではタイトルシーンを含めて計27回、一分の隙もないコーディネートで登場している。 1991年、所属していた事務所の社長の田邊昭知と結婚、家庭に入るため芸能活動から引退した。 2016年7月20日発売のファッション誌「Kunel」9月号(マガジンハウス)の表紙を突如飾り、同誌で新連載「伝説のおしゃれミューズ」をスタートさせる事となり、25年ぶりに芸能界へ復帰することとなった。 ! !! 発売日 !!width=\"60%\" タイトル<br>収録曲 !! 規格品番 ! 1st </div> ! 2nd </div> ! 3rd </div> ! 4th </div> ! 5th </div> ! 6th </div> "} {"id": "134637", "url": "https://ja.wikipedia.org/wiki?curid=134637", "title": "RIKACO", "text": "RIKACO RIKACO(りかこ、本名:吉川 莉加子、1966年3月30日 - )は、日本のタレントである。 横浜市生まれ、東京都立日比谷高等学校(定時制)中退。身長169cm。血液型はA型。元夫は俳優の渡部篤郎。旧芸名は村上 里佳子。村上 理佳子(読み同じ)。旧所属事務所は田辺エージェンシー、スカイコーポレーション、オフィスまとば、個人事務所ハンズアップ。現在の所属事務所はLDH JAPAN。 "} {"id": "135056", "url": "https://ja.wikipedia.org/wiki?curid=135056", "title": "金子美保", "text": "金子美保 金子 美保(かねこ みほ、 1981年3月16日 - )は、日本の元タレント・モデル。現在はスポーツインストラクター。 "} ︙ (以下、データが続く) |
文章を用意できたら、TF-IDF特徴量とそれぞれの類似度を計算します。
計算結果をすべて保持してしまうと4GB程度のデータになってしまうため、今回はTop10のみを保存するように処理します。
Pythonのライブラリを使用するため、以下のコードを使用する場合は必要なライブラリをインストールしてください。
1 |
pip install tfidf_japanese tqdm |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#!/usr/bin/env python # -*- coding: utf-8 -*- import json import tqdm import itertools from tfidf_japanese import TFIDF json_data = [] with open("ja_josei_model.json", "r", encoding="utf-8") as f: line = f.readline() while line: json_data.append(json.loads(line)) line = f.readline() #TF特徴量を計算 model_dict = {target["title"].replace("*","") : TFIDF.gen(target["text"].replace("*","")) for target in tqdm.tqdm(json_data)} model_dict_sim = {} #類似度を計算 for name1, name2 in tqdm.tqdm(itertools.combinations(model_dict, 2), total=int(len(model_dict) * (len(model_dict) - 1) / 2)): if name1 not in model_dict_sim: model_dict_sim[name1] = {} if name2 not in model_dict_sim: model_dict_sim[name2] = {} if name1 in model_dict_sim[name2]: continue if name2 in model_dict_sim[name1]: continue sim = TFIDF.similarity(model_dict[name1], model_dict[name2]) model_dict_sim[name1][name2] = sim model_dict_sim[name2][name1] = sim #上位10位だけにする for target in tqdm.tqdm(model_dict_sim): model_dict_sim[target] = dict(sorted(model_dict_sim[target].items(), key=lambda x: -x[1])[0:10]) #上位10位だけになったものを保存 with open("similarity_josei_model_all_top10.json", "w", encoding="utf-8") as f: json.dump(model_dict_sim, f, ensure_ascii=False, indent=4) |
計算が終わると、女優名と類似した女優名・相似度のJSONデータが得られます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ "松田聖子": { "安室奈美恵": 0.5240537783387, "中森明菜": 0.5073149325158474, "浅香唯": 0.46345655723413354, "中島美嘉": 0.46054133262975333, "浜崎あゆみ": 0.4564808457041304, "Miwa": 0.44201097581640025, "大塚愛": 0.4411512257294017, "中山美穂": 0.43394014185670615, "華原朋美": 0.42425831377011913, "今井美樹": 0.3925959742624024 }, … } |
これを簡単に検索できるようにフロントエンドを作成します。
今回は json/女優名.json として計算済みのデータを用意しておき、パラメータに応じてjQueryで読み込むような構成にします。
CSSフレームワークにUIKitを使用して、デザイン面はUIKitにおまかせします。
完成
完成したサイトは以下からアクセス可能です。
http://test-nakamuraibuki.s3-website-ap-northeast-1.amazonaws.com/
検索画面ではオートコンプリートを使えるようにし、結果画面ではWikipediaに飛べるようにしたり、人名をクリックするとその人に類似した女優を表示するようにするなど、UXにも少しこだわりました。
精度については、Wikipediaの文章量が少ないとそれほど関連性のない人も浮上してきてしまうなど、まだまだ改善の余地ありのように思います。(文量を考慮したアルゴリズムであるOkapi BM25などで改善するかもしれません。)
感想
今回はコンテンツベースのレコメンドエンジンを開発してみました。
題材にした「女優」の場合には、その人物のプロフィールだけではなく、見た目を加味したり、実際のユーザーはどういう傾向があるのかというデータがあると、さらに精度を高めていくことが可能になると考えられます。
最近ではAmazon Personalizeなどで機械学習サービスを使う機会がどんどん増えると思いますが、簡単にでも手法の仕組みを知っていると、さらに適切に運用できる可能性が高まると思います。
最後に、ニフティではエンジニアを募集しています。
データサイエンスに興味がある人、一緒に働いてみたい人は、ぜひ採用情報をご確認ください。