Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Hivemallで類似ニュース記事を抽出してみる

612 views

Published on

第4回 Apache Hivemall Meetup
での発表資料
https://techplay.jp/event/663945

Published in: Data & Analytics
  • Be the first to comment

  • Be the first to like this

Hivemallで類似ニュース記事を抽出してみる

  1. 1. Hivemallで 類似ニュース記事を抽出してみる 株式会社mediba 野崎幹男 2018/04/17(火) 第4回 Apache Hivemall Meetup
  2. 2. アジェンダ ❖ はじめに ➢ 自己紹介 ➢ 会社の説明など ❖ 類似ニュース記事の抽出 ❖ まとめ
  3. 3. 自己紹介 ■氏名 : 野崎幹男 ■所属 : 株式会社 mediba システム本部 システム開発1部コミュニケーション開発 G ■担当業務 : バックエンドエンジニア ■趣味 : フットサル / サッカー観戦 / 登山
  4. 4. 企業概要 ■会社名 : 株式会社 mediba ■会社設立年月 : 2000年12月6日 ■本社 : 渋谷 ■従業員数 : 415名(※2017年1月現在) ■業務内容 : - KDDIグループの一員 - モバイルデバイス向けのメディア事業など - Mission「ヒトに"HAPPY"を」
  5. 5. medibaのサービスの紹介
  6. 6. 担当サービス ■au Webポータル (https://auone.jp) ● auスマートフォンのデフォルトホームページ ● 2017/04にリニューアル ● ポータルサイト ○ ポータル ○ ニュース ○ 天気 ○ 占い ○ 乗り換え ○ ..etc ● 技術要素 ○ PHP, Golang, Node etc.. ○ AWS, オンプレ etc.. ○ MySQL, Elasticsearch, memcached etc.. ○ Lambda, Docker etc..
  7. 7. medibaとTreasure Dataの関わり ■ トレジャーデータサービス by IDCFを利用 ■ 複数サービスのアクセスログなどを収集している ■ 別部署PRJのプライベートDMP構築のため ■ これまで : とりあえずデータ収集 (した or している) ■ これから: データの分析・活用(していきたい) サービスA サービスB サービスC
  8. 8. ● 2017/04にリニューアル時にTDへのデータ収集開始 ● 2017/04〜にて、簡単な集計を実施 ○ Digdag / Redash / PostgreSQL ● 2017/12〜 Hivemall on TDを個人的に触ってみる ○ これがHivemallとの出会い ○ minhashを使ってユーザレコメンドしてみる ○ 弊社の技術ブログにまとめた (※1) ○ 油井さんの目に留まり、本日の発表に至る・・・ 担当サービスとTreasure Dataの関わり ※1 https://ceblog.mediba.jp/post/170605665442/treasure-data%E3%81%AEhivemall%E3%81%A7%E9%A1%9E%E4%BC%BC%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%AC%E3%82%B3%E3%83%A1% E3%83%B3%E3%83%89%E3%82%92%E8%A9%A6%E3%81%99
  9. 9. アジェンダ ❖ はじめに ➢ 自己紹介 ➢ 会社の説明など ❖ 類似ニュース記事の抽出 ❖ まとめ
  10. 10. 発表内容 ■ 発表ネタどうしよう・・ ● Hivemallほとんど使っていないし、、分析業務しているわけでもない し、、 ● でも、ドキュメント見ると NLP系の関数があるぞ・・ ■ 関連記事(リリース済み) ● ある記事に対してコンテンツベースで類似した記事を表示 ● ElasticsearchのMLTQuery(More Like This Query)を利用 ● ElasticsearchクラスタはEC2でクラスタ構築 ↓ 関連記事抽出をHivemall on TDのみで実現出来るか試して みる・・!
  11. 11. [補足]MLT(More Like This)Queryについて ■処理概要 ● index時 ○ タイトルや本文のfieldにsimilarityを設定しておく (※1) ○ アルゴリズムが選べる ■ BM25 (ES5系以降でデフォルト) ■ Classic(TF/IDF) (ES2系でデフォルト) ※1 https://www.elastic.co/guide/en/elasticsearch/reference/6.2/similarity.html#similarity index時 query時
  12. 12. [補足]MLT(More Like This)Queryについて ■処理概要 ● query時 ○ 記事表示時にMLT Queryを投げる ■ 単語長, 文書長などに関するパラメータが設定できる ○ score順に記事IDのリストが返却される ※1 https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-mlt-query.html index時 query時
  13. 13. [補足]tf-idfとBM25について ● tf-idf ○ tf (term frequency) : 単語出現頻度 ■ ある単語Tiの文書Dj中の重み ■ TF (i,j) = (文書Djにおける単語Tiの出現回数) / 文書Djの総単語数 ■ 文書中において出現頻度の高い単語は重要 ○ idf(inverse Document Frequeyncy) : 逆文書頻度 ■ n : 単語Tiが出現する文書数 / N: 文書の総数 ■ IDF(i) = log(N/n) ■ 多くの文書において出現頻度の高い単語は重要ではない ● BM25 ○ DL(j) = 文書Djの総単語数 / NDL(j) = DL(j) / (すべての文書の平均 DL) ○ CW(i,j) = [ TF(i,j) * IDF(i) * (K1 + 1) ] / [ K1 * (1 - b + (b * NDL(j)) + TF(i,j) ] ○ tf-idf プラス より短い文書において出現回数が大きいものが重要 http://sonickun.hatenablog.com/entry/2014/11/12/122806 https://ja.wikipedia.org/wiki/Tf-idf https://en.wikipedia.org/wiki/Okapi_BM25
  14. 14. ● 記事データ投入 ○ 適当なニュース記事を 1000件 タイトルと本文 ○ embulkでTDに投入 ● 油井さんのtf-idfサンプルを利用させていただきました ○ https://github.com/treasure-data/workflow-examples /tree/master/machine-learning/tf-idf ● 前処理 ○ タグ/改行削除 ○ 1文字の単語削除 ○ アルファベット2文字削除 ○ 形態素解析 (関数 : tokenize_ja() ) ■ kuromoji / neologd ■ 特定の品詞のみ利用 処理概要1 記事データ 投入 前処理 記事数など取得 スコア計算 https://hivemall.incubator.apache.org/userguide/misc/tokenizer.html#japanese-tokenizerl
  15. 15. 処理概要1 記事データ 投入 前処理 記事数など取得 スコア計算 query/explode_japanese.sql tfidf.dig
  16. 16. 処理概要1 記事データ 投入 前処理 記事数など取得 スコア計算
  17. 17. ● 以下2つを計算 ○ 記事数 ■ tf-idf用 ○ DL(document length) ■ 文書Nの総単語数 ■ すべての文書の平均 DL ■ BM25用 処理概要2 記事データ 投入 前処理 記事数など取得 スコア計算 https://hivemall.incubator.apache.org/userguide/misc/tokenizer.html#japanese-tokenizerl tfidf.dig
  18. 18. スコア(tfidf/BM25)を計算 ● tfidfは以下の関数を利用 ○ tf(), tfidf() ● BM25は定義を利用 ○ CW(i,j) = [ TF(i,j) * IDF(i) * (K1 + 1) ] / [ K1 * (1 - b + (b * NDL(j)) + TF(i,j) ] ○ K=1, b=0.25 処理概要3 記事データ 投入 前処理 記事数など取得 スコア計算 tf-idf BM25
  19. 19. 類似記事を抽出してみる・・ 結果 ⇢ 同じパターン tf-idf BM25
  20. 20. 類似記事を抽出してみる・・ 結果 ⇢ 異なるパターン tf-idf BM25
  21. 21. アジェンダ ❖ はじめに ➢ 自己紹介 ➢ 会社の説明など ❖ 類似ニュース記事の抽出 ❖ まとめ
  22. 22. ◎ : hivemall onTDで類似記事を得ることが出来た! △ : 結果の評価を得るには記事数が少なかった ◎ : Elasticsearchクラスタの構築, 運用が不要 ◎ : Neologdの利用が簡単 ?:tokenize_ja() の返り値に品詞が含まれない・・? ? : パラメータのチューニングがElasiticsearchより簡単にできそう? まとめ
  23. 23. これからやりたいこと ● 機能開発 ○ ユーザベースのニュース記事レコメンド ■ Matrix Factorization / Factorization Machine ? ○ ニュース記事のラベリング ■ word2vec / fastText ? ○ ユーザのクラスタリング ■ k-means など ● ユーザ分析 ○ 行動分析 ○ ABC分析 ⇛などなど沢山あるが、人手が足りていません・・
  24. 24. http://www.mediba.jp/recruit/career/joblist.html#engineer なので、分析・機械学習などしたいエンジニアの方 絶賛募集しています!
  25. 25. ご清聴 ありがとう ございました!

×