More Related Content
Similar to Hivemallで類似ニュース記事を抽出してみる (20)
Hivemallで類似ニュース記事を抽出してみる
- 3. 自己紹介
■氏名 : 野崎幹男
■所属 : 株式会社 mediba システム本部 システム開発1部コミュニケーション開発 G
■担当業務 : バックエンドエンジニア
■趣味 : フットサル / サッカー観戦 / 登山
- 4. 企業概要
■会社名 : 株式会社 mediba
■会社設立年月 : 2000年12月6日
■本社 : 渋谷
■従業員数 : 415名(※2017年1月現在)
■業務内容 :
- KDDIグループの一員
- モバイルデバイス向けのメディア事業など
- Mission「ヒトに"HAPPY"を」
- 6. 担当サービス
■au Webポータル (https://auone.jp)
● auスマートフォンのデフォルトホームページ
● 2017/04にリニューアル
● ポータルサイト
○ ポータル
○ ニュース
○ 天気
○ 占い
○ 乗り換え
○ ..etc
● 技術要素
○ PHP, Golang, Node etc..
○ AWS, オンプレ etc..
○ MySQL, Elasticsearch, memcached etc..
○ Lambda, Docker etc..
- 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
- 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. [補足]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. [補足]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. ● 記事データ投入
○ 適当なニュース記事を 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
- 17. ● 以下2つを計算
○ 記事数
■ tf-idf用
○ DL(document length)
■ 文書Nの総単語数
■ すべての文書の平均 DL
■ BM25用
処理概要2
記事データ
投入
前処理
記事数など取得
スコア計算
https://hivemall.incubator.apache.org/userguide/misc/tokenizer.html#japanese-tokenizerl
tfidf.dig
- 22. ◎ : hivemall onTDで類似記事を得ることが出来た!
△ : 結果の評価を得るには記事数が少なかった
◎ : Elasticsearchクラスタの構築, 運用が不要
◎ : Neologdの利用が簡単
?:tokenize_ja() の返り値に品詞が含まれない・・?
? : パラメータのチューニングがElasiticsearchより簡単にできそう?
まとめ
- 23. これからやりたいこと
● 機能開発
○ ユーザベースのニュース記事レコメンド
■ Matrix Factorization / Factorization Machine ?
○ ニュース記事のラベリング
■ word2vec / fastText ?
○ ユーザのクラスタリング
■ k-means など
● ユーザ分析
○ 行動分析
○ ABC分析
⇛などなど沢山あるが、人手が足りていません・・