学習済み分散表現を用いた文書分類に挑戦(一部再学習も)

はじめに

2018年9月のテキストアナリティクスシンポジウムに行った際に、学習済みの分散表現で事前学習したモデルを使って分類してうまくいく事例が紹介されていました。
全てのタスクにおいてうまくいくとは思えませんが、試すコストはあまりかからないので試してみます。

2017年のテキストアナリティクスシンポジウムにおいても、メルカリやGunosyでは分散表現を用いた手法が一番精度が高いと言われていましたし、今年の会ではNLP系の学会でも分散表現はデファクトスタンダードになっているという話も伺いました。
2013~14年はLDAを使った研究が多かった気がしますが、徐々にシフトしていっているんですね。

これまで(Word2Vecを用いて蒙古タンメン中本の口コミ評価を予測してみる)は4000件程度の蒙古タンメン中本の口コミの情報を元に分散表現を手に入れていましたが、学習済みの分散表現を用いたアプローチも有効かもしれないと思い、試してみようと思います。

分類タスク

某グルメ口コミサイトの蒙古タンメン中本の口コミのテキストから、3.5点以上の評価かどうかを予測するタスクを扱います。
本当は、ポケモン図鑑の説明文から水やら炎やらのタイプを予測するとかをしたいのですが、あいにく手元にデータがないので、以前集めた蒙古タンメン中本の口コミを使います。(実は後日、ポケモン図鑑のデータを集めたのですが、平仮名にまみれたデータな上に、データ数も800件しかなかったので、どのみち厳しかったです。)

学習済み分散表現

Word2Vecなどで大量の文書をもとに学習させた分散表現のことを指します。
大規模コーパスで分散表現を手に入れる際は、数十GBにも相当するテキストデータを数時間かけて推定するので、学習済みのモデルは非常にありがたいです。(4年前に会社のPCで計算した際は、12時間くらいかかったこともありました。)

無料で提供してくださっている分散表現については、すでにこちらのブログで紹介されています。そこで紹介されているものに少し付け足すと、日本語の分散表現に関しては以下のようなものがあります。

  • 白ヤギコーポレーションのモデル:Gensim
  • 東北大学 乾・岡崎研究室のモデル:Gensim
  • Facebookの学習済みFastTextモデル:Gensim
  • NWJC から取得した単語の分散表現データ (nwjc2vec):Gensim
  • NNLM embedding trained on Google News:TensorFlow

そこで、今回は各種学習済み分散表現と蒙古タンメン中本コーパスで求めた分散表現の文書分類の性能バトルをしてみたいと思います。
ただ、分散表現ではなく、単語の頻度をもとに特徴量を作ったものが一番精度が高いのですが、分散表現同士の比較でもってどの学習済み分散表現が中本の口コミ分類に役に立ちそうなのかを明らかにしようと思います。(本来は分析という観点から即でボツですが、見苦しくも比較していきます。)

前処理

前処理は以下の通りで、テキストデータを分かち書きして、数値や低頻度・高頻度語を除外しています。

処理を施すとこのようなデータになります。

特徴量は、scikit-learnのCountVectorizerやTfidfVectorizer、分散表現の合計・平均・TF-IDFを求めたものを用意します。

蒙古タンメン中本の口コミ4000件から作成した分散表現:Gensim

まず、以前のブログで紹介した蒙古タンメン中本の分散表現ですが、以下のように推定しています。

Pipelineを用いてExtraTreesClassifierによる学習をします。特徴量は先程あげた、テキストベースのCountVectorizerやTfidfVectorizer、分散表現の合計・平均・TF-IDFで、評価指標はAUCのクロスバリデーションスコアとします。

汗に関してコンテキストの似ている単語を抽出しています。

結果は、以下の通りで、分散表現を使わない方がAUCが高いです。ただ、w2v_tfidf(分散表現のTF-IDFを特徴量にしたもの)が分散表現の中でAUCが高いようです。今回はこの60.5%をベースラインに比較していこうと思います。

白ヤギコーポレーションのモデル:Gensim

こちらのリンク、「word2vecの学習済み日本語モデルを公開します」から、ダウンロードしてそのまま以下のコードでモデルを扱えます。

汗の関連語を抽出していますが、中国の歴史の何かですか?可汗とかいう単語は聞いたことあるかも。

まずは白ヤギさんの分散表現をそのまま使って予測してみます。(コードは先程のものとほぼ重複するので省略しています。)
残念ながら、ベースラインの60.5%には至りませんでした。

hogehoge.modelというフルモデル形式の場合は、再学習が可能です。詳しくはこちら(models.word2vec – Word2vec embeddings model)に書かれています。

今回は、白ヤギさんの分散表現に対して、追加で蒙古タンメン中本のテキストを食わせて再学習させます。

ベースラインの60.5%よりも下回り、さきほどの白ヤギさんのもともとの分散表現よりも下回りました。

再学習してもかえって精度が下がったりすることから、簡単に精度が出るわけではなさそうです。まぁ、理想はその適用領域での大量のテキストデータがあることで、Wikipediaを元に作成した分散表現に強く依存しても駄目なのだろうと思われます。

東北大学 乾・岡崎研究室のモデル:Gensim

日本語 Wikipedia エンティティベクトルからダウンロードした学習済み分散表現を用います。ダウンロード後は普通に「gzip -d file.txt.gz」みたいにターミナル上で解凍します。以下のコードを実行すればすぐに使うことができます。
ただし、KeyedVectors形式のものは白ヤギさんのように再学習ができません。(Why use KeyedVectors instead of a full model?

汗の類似語に関しては、難しい単語が高めに出ているようです。

残念ながら、ベースラインの60.5%には至りませんでした。

Facebookの学習済みFastTextモデル:Gensim

FastTextはGoogleにいたTomas Mikolov氏がFacebookに転職されて作られた分散表現を求めるためのモデルです。Gensimでも呼び出せます。学習済みのものはこちらのGitHub(Pre-trained word vectors)にあるのですが、NEologdで形態素解析したものをベースに学習し公開されている方がいるとのことで、こちら(fastTextの学習済みモデルを公開しました)からダウンロードしたものを使わせていただきました。

何だこれはレベルの結果が返ってきました。中国の歴史上の人物か何かなんでしょうか。

若干ですがベースラインの60.5%よりも良い結果が得られましたが、 誤差の範囲な気がします。

NWJC から取得した単語の分散表現データ (nwjc2vec):Gensim

国立国語研究所の収集されたテキストデータを元に学習した分散表現が提供されています。ただし、利用するためには申請する必要があります。申請が受理されたらこちら(NWJC から取得した単語の分散表現データ (nwjc2vec) を頒布)からダウンロードして使えます。

汗の関連語ですが、うまく関連付けれているように思われます。少なくとも中国史ぽくはありません。しかしながら、顔文字まで学習していたとは。

ベースラインの60.5%よりも1%ポイントほど高い結果となりました。

NNLM embedding trained on Google News:TensorFlow

こちら(tensorflow-hubで超簡単にテキスト分類モデルが作成できる)で紹介されているように、GoogleがTensorFlowでGoogleニュースのテキストをもとに学習した分散表現が提供されています。

こちらのGitHub(NNLM embedding trained on Google News)から、Japaneseのnnlm-ja-dim50、nnlm-ja-dim50-with-normalizationなどが使えます。分散表現の説明についてはこちらのドキュメント(Token based text embedding trained on Japanese Google News 6B corpus.)にあります。

AUCが65%となっているものの、先程のsklearnでのクロスバリデーションのものとの比較ではないので、なんとも言えないですが、Googleニュースのデータだし結構精度が出そうな可能性を感じますね。
今後、TensorFlowでクロスバリデーションによるAUCスコアの出し方を調べてみて、順当に比較できるようにしたいです。(Kerasを使って計算している事例は見つけた。)

比較

今回の分類タスクはそもそも分散表現では精度が出なかったのですが、学習済み分散表現の中で序列を作るとすると、梵天が一番良く、FastTextが少しだけ良かったです。
TensorFlowをほぼ業務で使わないので、Googleニュースの分散表現を今回の比較対象にできなかったのですが、後日比較できるようにしたいと思います。

あと、今回の口コミの点数を当てるタスクよりも、分散表現にとって相性がいいタスクがあるかもしれないので、今回の結果で諦めることなく色々と試して行きたいです。

おわりに

様々なシンポジウムなどでスタンダードとなってきた分散表現ですが、学習済み分散表現をそのまま使って分類問題で役に立つのかを見てきました。残念ながら、口コミの評価予測タスクにおいては全然効果がなさそうでした。ただ、分散表現の中でもタスクによって相性の良い学習済み分散表現がありそうです。
先程も述べたように、理想は大量のテキストデータで学習した分散表現を求め、それを予測に使うことなので大量のテキストデータを集めて再チャレンジしたいです。どれくらいのテキストデータがあれば十分なのかの規模感もわからないので、実践あるのみなんですかね。

参考情報

Word Embeddingだけで文書分類する
tensorflow-hubで超簡単にテキスト分類モデルが作成できる
Error: ”Word2vec’ object has no attribute index2word
Word2vec Tutorial Online training / Resuming training
Word Embeddingモデル再訪
Googleの事前学習済みモデルを手軽に利用出来るTensorFlow Hub
ゼロから作るDeep Learning ❷ ―自然言語処理編

蒙古タンメン中本コーパスに対してのLDAの適用とトピック数の探索

モチベーション

前回の記事では、Webスクレイピングにより入手した、蒙古タンメン中本の口コミデータに関して、Word2Vecを適用した特徴量エンジニアリングの事例を紹介しました。
今回はせっかく興味深いデータがあるので、どのようなトピックがあるのかをLDAを適用したいと思います。加えて、これまで記事で扱ってきたLDAの事例では評価指標であるPerplexityやCoherenceを扱ってこなかったことから、トピック数がどれくらいであるべきなのか、考察も含めて行いたいと思います。以前扱った階層ディリクレ過程であれば、トピック数を事前に決める必要が無いのですが、今回は扱わないものとします。

環境

・MacBook Pro
・Python3.5
・R version 3.4.4

Gensimで行うLDA

今回もPythonのGensimライブラリを用いて行います。

  • パープレキシティ
    • テストデータに対して計算
    • 負の対数尤度で、低いほどよい。
      • パープレキシティが低いと、高い精度で予測できるよい確率モデルと見なされる。汎化能力を表す指標。
      • トピックの数をいくらでも増やせばパープレキシティは下がる傾向が出ている。
      • 教科書でのパープレキシティの事例に関しては、トピック数を増やせば低くなるという傾向が出ている。

以下のコードでパープレキシティを計算します。

実際に、中本コーパスで計算したトピック数に対してのパープレキシティは以下のように推移しました。

Ldaのモデル選択におけるperplexityの評価によると、
”複数のトピック数で比べて、Perplexityが最も低いものを選択する。」という手法は人間にとって有益なモデルを選択するのに全く役に立たない可能性がある。”と記されています。

『トピックモデルによる統計的潜在意味解析』には、”識別問題の特徴量として使う場合は識別問題の評価方法で決定すればよい”とあるので、目的によってはパープレキシティにこだわらなくても良いと思われます。

今回のケースだと、パープレキシティだけだと、決めかねてしまいますね。

  • コヒーレンス
    • トピックごとの単語間類似度の平均
    • トピック全体のコヒーレンスが高ければ、良い学習アルゴリズムとみなす。

以下のコードでコヒーレンスを計算します。

実際に推定してみたところ、トピック数が20を超えたあたりからコヒーレンスが下がる傾向があるので、
それ以上のトピック数は追い求めない方が良いのかもしれません。

Rでもやってみる

Rでトピック数を決める良い方法がないか調べてみたところ、ldatuningとかいうパッケージがあることがわかりました。複数の論文(Griffiths2004, CaoJuan2009, Arun2010,Deveaud2014)で扱われている手法を元に、適切なトピック数を探れるようです。このパッケージを紹介しているブログの事例では、90から140の範囲で最適なトピック数となることが示されています。詳しくはこちらを見てください。
Select number of topics for LDA model

以下のコードで実行しました。一部、驚異のアニヲタさんのコードを拝借しております。なお、ldaパッケージのlexicalize関数を用いることで、ldatuningに入力するデータを作成することができます。

これを見る限りは、60〜70個の辺りに落ち着くのでしょうか。

トピックの吐き出し

Rでの結果から、60個程度のトピックで推定し、各記事に割り当てが最大のトピックを付与して、トピック別の口コミ評価をみてみようと思います。

以下のコードではトピック別の口コミ評価のしやすさからtopicmodelsパッケージを用いた推定となっています。

口コミ評価の点数が上位のトピックはこんな感じです。

口コミ評価の点数が下位のトピックはこんな感じです。

中本は社会人2〜3年目で新規メディアの立ち上げのストレス解消で数回行きましたが、北極の赤さは異常だと思います。北極を食べたり、トッピングする余裕のある人、ましてや辛さを倍にするという時点で口コミ評価も高くなると考えるのは自然なのかもしれません。

参考情報

トピックモデル (機械学習プロフェッショナルシリーズ)
トピックモデルによる統計的潜在意味解析 (自然言語処理シリーズ)
models.ldamodel – Latent Dirichlet Allocation
Ldaのモデル選択におけるperplexityの評価
pythonでgensimを使ってトピックモデル(LDA)を行う
gensim0.8.6のチュートリアルをやってみた【コーパスとベクトル空間】
LDA 実装の比較
Jupyter notebookにMatplotlibでリアルタイムにチャートを書く
Inferring the number of topics for gensim’s LDA – perplexity, CM, AIC, and BIC
Select number of topics for LDA model
47の心得シリーズをトピックモデルで分類する。 – 驚異のアニヲタ社会復帰への道

Word2Vecを用いて蒙古タンメン中本の口コミ評価を予測してみる

はじめに

word2vecを用いた分類は以前からやってみたいと思っていたのですが、関心を持てるテキストデータがなかったのでなかなか手を出していませんでした。
ある時、ふとしたことから某グルメ系口コミサイトから蒙古タンメン中本の口コミと評価点を抽出して、その評価をword2vecでやってみるのは面白いだろうと思いついたので、さっそくやってみます。
こういう時にはじめて、データ分析だけでなくクローリング屋としても業務をやっていて良かったなと思うところですね。
コードは以前見つけて紹介した「分散表現を特徴量として文書分類するための方法について調べてみた」のものを再利用します。

目次

・目的
・データ収集
・形態素解析
・集計
・分散表現とは
・word2vecについて
・gensimのword2vecの引数
・word2vecによる文書分類の適用
・終わりに
・参考情報

目的

某グルメ系口コミサイトの口コミを収集し、個々人の口コミの内容から個々人の店に対する評価が高いか低いかを予測する。

データ収集

BeautifulSoupで収集しており、各店舗あわせて数千件ほど集めました。(実行コードはこちらでは紹介しません。)

このようなデータが手に入っている前提で以下の分析を進めていきます。

形態素解析

文書を形態素解析して、名詞のみを抽出するためのコードを用意します。

先ほどのデータフレームに対して以下のように実行すれば、名詞のみの分かち書きを行ったカラムが手に入ります。

集計

点数のヒストグラム

3.5点から4点の間が最も評価が多いようです。1点台をつける人はほとんどいないことがわかります。

単語数のヒストグラム

大体の口コミで100単語未満のようです。

単語数と点数の散布図

どうやら口コミにおいて500語を超える記述をしている人は評価が3点を下回ることはないようですが、文字数と点数でキレイに傾向が出ているわけではないですね。

形態素解析結果の集計、単語ランキング

名詞の抽出に関して非常に便利なMeCab Neologdを用いています。蒙古タンメンもきちんと捉えることができています。

味噌よりも北極の方が出現しているようです。北極は言わずもがな、極端に辛い罰ゲームレベルの一品。味噌タンメンは辛さが抑えめのラーメンで、知人の間では最もおいしいのがこのレベルだという合意があったりしますね。

分散表現とは

  • 単語の意味を低次元の密な実数値ベクトルで表現したもの。
  • 入力層から中間層への重み自体が各単語の分散表現となっている。
  • 2017年9月のテキストアナリティクスシンポジウムにてメルカリとGunosyが特徴量として分散表現を活用しており性能が出ているとの発言があった。

word2vecについて

単語の分散表現を作ることを目的としている。

  • CBOW(Continuous Bag-of-Words)
    注目している単語の前後N単語を文脈と呼び、その文脈をBag-of-Words表現として入力し、注目している単語を出力するというニューラルネットワークを学習する。入力層から隠れ層への結合は単語の位置を問わず同じとし、隠れ層の活性化関数をただの恒等関数としている。
  • Skip-gram
    文脈のBOWを突っ込むCBOWとは異なり、入力層に1単語だけを入れる。1単語を入力し、正解データとして他の単語を入れることを繰り返して学習し、ある単語の入力に対して、どの単語の出現確率が高いかどうかを計算する。正解確率が上がるようにニューラルネットワークの重みを調整する。深層学習で使われる自己符号化器と似たような構造とされている。

gensimのword2vecの引数

gensimのword2vecには数多くの引数が存在します。gensimのドキュメントに英語で書かれていますが、せっかくなのでこちらで紹介します。

  • sentences
    解析に使う1行1センテンスで書かれた文書。日本語の場合はLineSentenceフォーマットを使えばうまくいった。単語が空白文字で区切られていて、文章は改行で区切られていれば問題ない。
  • sg
    {1,0}の整数で訓練アルゴリズムを設定できる。 1を選べばskip-gramで、0ならばCBOWを使う。
  • size
    特徴ベクトルの次元を設定する。
  • window
    文書内における現在の単語と予測した単語の間の距離の最大値を設定する。言い換えると、文脈の最大単語数を設定する。
  • alpha
    学習率の初期値を設定する。
  • min_alpha
    訓練の過程で徐々に落ちていく学習率の最小値を設定する。
  • seed
    乱数を生成する際のシード番号を設定する。
  • min_count
    一定の頻度以下の単語を除外する際の値を設定する。
  • max_vocab_size
    語彙ベクトルを構築している際のメモリ制限を設定する。
  • sample
    (0, 1e-5)の範囲で、頻度語がランダムに削除される閾値を設定する。高速化と精度向上を狙っており、自然言語処理においても高頻度語はストップワードとして除去するなどの対応が取られている。
  • workers
    モデルを訓練するために多くのワーカースレッドを利用するかどうか設定する。(並列化関連)
  • hs
    {1,0}の整数で、1であれば階層的ソフトマックスがモデルの訓練で用いられ、0であり引数negativeがnon-zeroであればネガティヴサンプリングが設定できる。全部計算することが大変なので、階層的なグループに分けて各グループごとに学習するというのがモチベーション。
  • negative
    0よりも大きければネガティブサンプリングが用いられる。5〜20などを選び、どれだけノイズワードが描かれているかを識別する。0であればネガティブサンプリングが適用されない。ネガティブサンプリングは計算高速化を目的に出力層で正解ニューロン以外のニューロンを更新しないように学習する手法。
  • cbow_mean
    {1,0}の整数で、0であれば単語ベクトルの合計を用い、1であればCBOWが用いられた際の平均が用いられる。
  • hashfxn
    訓練の再現性のためにランダムに初期値のウエイト付けできる。
  • iter
    コーパスにおける繰り返し回数(エポック数)を設定できる。
  • trim_rule
    ある単語を語彙に含めるべきかどうかを識別する、語彙のトリミングルールを設定する。
  • sorted_vocab
    {1,0}の整数で、1であれば頻度の降順で語彙を並べ替える。
  • batch_words
    ワーカースレッドにわたすバッチの大きさを指定する。(並列化関連)
  • compute_loss
    Trueであれば損失関数の計算と蓄積を行う。
  • callbacks
    訓練時の特定の段階で実行する際に必要なコールバックのリストを指定できる。

word2vecによる文書分類の適用

口コミの点数が4点以上であれば1、そうでなければ0を取る変数を作成し、それをラベルとして文書分類を行います。
以前、紹介したブログ同様に、scikit-learnのExtraTreesClassifierを用いてCountVectorizerとTfidfVectorizerを特徴量としたものをベースラインとして、同様の手法に対してword2vecで作成した分散表現を特徴量として用いたものとを比較します。評価指標はクロスバリデーションスコア(5-folds)とします。

分類の前に、せっかくword2vecを使ったので、任意の単語に類似した単語を見てみます。

まずは初心者向けの味噌ラーメン

続いて、中級者向けの蒙古タンメン

そして、上級者向けの北極ラーメン

最後に、誰もが経験する翌日という単語。

どれも関連性の高いと思われる単語が抽出できているように思われます。

それでは分類モデルの学習を以下のコードで行います。
scikit-learnを使えば、データさえあれば非常に短いコードで書けてしまいます。

一応、ベースラインよりもword2vecを特徴量としたものの方がスコアが高いのですが、わずかです。TF-IDFベースで特徴量を作成したモデルは十分に性能が出ているようです。
word2vecを用いることによる旨味はそれほどなさそうですが、パラメータを試行錯誤していけばよくなるかもしれません。

終わりに

蒙古タンメン中本のテキストをWebスクレイピングし、その口コミ情報をコーパスとして口コミ評価の二値分類に挑戦しましたが、TF-IDFよりもわずかに優秀な特徴量になりうるという結果になりました。もっと劇的な向上を夢見ていたのですが、パラメータの試行錯誤を今後の宿題としようと思います。

参考情報

Chainer v2による実践深層学習
word2vecによる自然言語処理
models.word2vec – Deep learning with word2vec
Python で「老人と海」を word2vec する
Python3 – MeCabで日本語文字列の名詞出現数の出し方について
Transform a Counter object into a Pandas DataFrame

分散表現を特徴量として文書分類するための方法について調べてみた

以前、テキストアナリティクスシンポジウムに参加した際に登壇者が機械学習のタスクにおいて分散表現を特徴量に使ったと言っていて、実務で使えるようにしたいと思ったので、調べた手法について記します。

先行研究

海外のブログ(Text Classification With Word2Vec)では、以下の手順で文書分類のための特徴量としてWord2Vecが用いられていました。

  • STEP1:ロイターのコーパスをもとにWord2Vecを求める。(先行研究では100次元に圧縮しています。)
  • STEP2:テキストごとに属する単語に対して、STEP1で求めた100次元の分散表現の平均値をとる。あるいは、TF-IDFのスコアで重み付けしたものを作る。これで100次元の分散表現が各テキストごとに用意できる。
  • STEP3:STEP2で作った100次元の分散表現を用いて、テキストごとのラベルについてExtra Treesによる分類器を学習させる。

ざっとこんな感じのアプローチになっていました。”ベクトルの足し算が意味の足し算に対応する「加法構成性」”という考え方からのアプローチと言えるのでしょうか。

そのあと、ベースラインとの比較をしていましたが、結論としては、ラベル付きのトレーニングデータが非常に少ない場合において有利である傾向があったものの、SVMなどの既存手法より精度が出ているとは言えないような結果でした。

今回の事例におけるタスクではうまくいかなかったようですが、テキストアナリティクスシンポジウムにおいてはアツいとされていたので、自社のデータで適用するなどしておきたいです。

今回取り上げたブログやGithubにはPython2.X系のコードしかなかったため、3.X系で動くように一部変更するなどをしました。
以下で3系で動き、同様の結果が出ているものを載せています。

コード

コードの概要としては
・訓練データの作成
・モデルの定義
・モデルのベンチマーク
・結果の描写
です。

事前にテキストデータをダウンロードして手に入れておく必要がありますが、それに関してはターミナルで実行できるものなので、ここでは載せていません。参考文献のblog_stuff/classification_w2v/benchmarking.ipynbを参照ください。

このようにSVCに負けている結果が出ます。

比較の棒グラフはこんな感じ。

自社のテキストデータで是非とも試したい。

参考文献

岩波データサイエンス Vol.2
blog_stuff/classification_w2v/benchmarking.ipynb
分散表現(単語埋め込み)
Text Classification With Word2Vec

人工知能学会全国大会2017のWebマーケティングで参考になりそうな研究9選

はじめに

今更ではありますが、2017年5月に開かれた人工知能学会全国大会2017の公開資料の中から、私の本業であるWebマーケティングで役に立ちそうな研究を独断と偏見で9本ほど集めてみました。思っていたよりもWebマーケティングぽい領域が多かったので、社内での分析業務におけるアイデアに直結しそうな気がしています。

ちなみに、全ての資料はこちらにあります。

基本的に各研究ごとに
・目的と結果
・対象となるデータ
・手法の概要
・PDFのリンク
について記していきます。

紹介する研究

今回は以下の研究を紹介したいと思います。
「オンライン広告におけるスパース性と遅れコンバージョンを考慮した予測モデル」
「テキストマイニングを用いた転職サイトの会員離脱予測」
「インターネット広告におけるスパースなユーザー行動ベクトルからのユーザー特徴抽出モデル」
「ユーザーのページビュー系列からのコンバージョン予測」
「SNSにおけるユーザの行動のモチベーション要因の分析」
「状況に応じた楽曲推薦に向けたソーシャルデータ分析」
「テキストマイニングを用いた口コミ分析による点数評価の信頼性確認手法」
「不動産仲介マーケティングのためのユーザ行動予測」
「SUUMOでの不動産データ活用の取り組みと未来」

オンライン広告におけるスパース性と遅れコンバージョンを考慮した予測モデル

目的と結果

オンライン広告のCVR予測の精度向上を目的としている。
これまでの課題としては、
「質的変数による特徴量のスパース性」
「広告クリックからのCVまでの期間の長さ(期間が空いてからCVしたりするケースがあるので正例だったはずが負例と扱われる可能性がある)」
などがあった。提案手法により従来手法に比べ高い精度でCVR予測が可能であることが示された。

対象となるデータ

過去3週間分の広告配信データでテスト期間は7日間

手法の概要

  • 次元圧縮
    • Factorization Machine(FM)を用いて、従来のロジスティック回帰では考慮できていなかった交互作用をモデリングし、低次元のベクトル内積に分解して表現している。
  • 遅れCV問題の対応
    • 遅れてCVが発生する事象に関しては、指数分布を用いて遅れてCVする事象をモデリングするDelayed Feedback Modelを構築することで、本当は事後的にCVしそうなユーザーの推定を行っている。
  • 予測
    • これらの手法を合わせた、Delayed Feedback Factorization Machineを構築し、SGD(確率的勾配降下法)やAdaGradを用いてパラメータを推定している。

PDFのリンク

https://kaigi.org/jsai/webprogram/2017/pdf/110.pdf

テキストマイニングを用いた転職サイトの会員離脱予測

目的と結果

登録情報や履歴書のテキスト情報を用いて特徴量とし、転職サイトの登録会員の離脱予測を行っている。ブラックボックスでは無い形での結果の解釈ができ、予測精度も高いことが示された。

対象となるデータ

  • 2009年10月1日〜2016年9月28日までの履歴書、職務経歴書、自己PR書、希望条件
  • 離脱会員の定義は「登録して1ヶ月以内に一度も応募しない会員」としている。

手法の概要

  • STEP1:Pythonのmojimojiというライブラリを利用してカナを全角に、数字とアルファベットは半角に変換。
  • STEP2:MeCabを用いて名詞のみ抽出
  • STEP3:「職務」「経歴」「業務」「内容」などを不用語(stop word)とした。
  • STEP4:Grid Searchでパラメータチューニングしたランダムフォレストを用いて変数重要度(Feature Importance)を出し、重要度の上位90%を占める単語以外を削除
  • STEP5:登録情報のデータ(年齢、転職回数、住所)を数値データに変換
  • STEP6:選定した特徴量を用いて決定木アルゴリズムを適用

PDFのリンク

https://kaigi.org/jsai/webprogram/2017/pdf/949.pdf

インターネット広告におけるスパースなユーザー行動ベクトルからのユーザー特徴抽出モデル

目的と結果

広告のCTR予測を行う際の特徴量が非常にスパースであることから、ユーザーをクラスタリングして広告配信に効果的なユーザーを抽出することを目的としている。研究ではCVRの高いユーザー群の抽出を可能にしている。

対象となるデータ

  • 2016年6月1日〜2016年6月21日の間のクリックやコンバージョンのデータ(株式会社アイモバイルが提供)
  • クリック実績のある広告数、コンバージョン実績のある広告数、クリックされた広告番号、コンバージョンが発生した広告番号、ユーザー番号など

手法の概要

  • 高次元スパースデータを低次元に落とし込むために、オートエンコーダを用いている。
  • オートエンコーダにより得られた特徴量をもとにユーザーのクラスタリングを行っている。(オートエンコーダは入力された情報をなるべく欠損しないように、効率的に圧縮する構造を持たせたニューラルネットワークのこと。)
  • データにおけるゼロの成分を確率的に欠損とみなして計算処理を早めている。
  • 学習モデルはAdaGrad(学習率を学習に合わせて最適化する手法)
  • 訓練データ(特徴量の数がクリックで23339個、コンバージョンで5619個)にスパースデータ許容型オートエンコーダで500次元まで圧縮し、さらに通常のオートエンコーダで146次元まで圧縮している。
  • 次元圧縮して獲得したデータに対してk-means法でクラスタリングを行い、CVRなどを比較している。

PDFのリンク

https://kaigi.org/jsai/webprogram/2017/pdf/12.pdf

ユーザーのページビュー系列からのコンバージョン予測

目的と結果

Web広告において、ユーザーの閲覧履歴からコンバージョンを予測することを目的に、Recurrent Neural Network(RNN)を用いた結果、非時系列のSVMよりもわずかばかりかの精度向上が観察された。データ数が少ない場合はSVMに軍配があがる結果となっている。

対象となるデータ

2016年7月1日〜2016年10月31日の広告の接触履歴データなど(広告の業種別データやユーザーのページビュー数)を特徴量に用いて、2016年11月1日〜11月30日までの期間を予測対象とした。データは株式会社マイクロアドが提供している模様。

手法の概要

  • Long Short-Term Memory RNN(LSTM)
    • ソフトアテンションモデル
      • 可変長の系列に対して内積で重みを算出し、足し合わせることで一部から情報を取り出すモデル。途中の層まで複数業種のデータを用いることで、複数の業種などの情報を共有することができる。(最後の隠れ層には業種別の特徴量を用いている。)
      • 勾配の計算に関してはAdamを用いて、実装はKerasを用いている。活性化関数はTanh、ドロップアウトはGaussianDropout
        としている。
    • RNNで用いる特徴量としては、特定のWebページを640種類に分類して、1日のうちに各トピックにページビューがあったかなかったかを1-0の変数にするなどの前処理を行っている。

PDFのリンク

https://kaigi.org/jsai/webprogram/2017/pdf/765.pdf

SNSにおけるユーザの行動のモチベーション要因の分析

目的と結果

SNSユーザーのモチベーションの要因(一ヶ月先に投稿するかどうか)をユーザー同士の関係性(staticな関係)と、そのユーザーの周りのインタラクション(dynamicな関係)という観点から分析し、ユーザー同士の関係性とユーザー周りのインタラクションを同時に用いたモデルにおいて、それらがモチベーションの要因につながりうる傾向が観察された。

対象となるデータ

  • RoomClipという部屋の家具やインテリアの様子の写真を投稿するSNSのデータ
    • 気に入った写真に「いいね」を付けたり、コメントを送れる。
  • 2015年3月の一ヶ月間を学習期間とし、2015年4月の投稿の有無を予測対象とする。

手法の概要

  • ネットワーク特徴量
    • 各ユーザーに対して、
      • 中心性(次数中心性、媒介中心性、近接中心性)
      • クラスタ係数、PageRank、フォロー数とフォロワー数の比率、フォローしているユーザのアクティブ度
  • フィードバック特徴量
    • 特定期間中にユーザが周りのユーザから自身の投稿に対してもらった「いいね」「コメント」に対して
      • 反応の数
      • 反応を行ったユーザの数
      • 反応を行ったユーザのうち、相互フォロー関係にあるユーザからのものの割合
  • 予測器としてSVMを利用

PDFのリンク

https://kaigi.org/jsai/webprogram/2017/pdf/534.pdf

状況に応じた楽曲推薦に向けたソーシャルデータ分析

目的と結果

ユーザへの楽曲推薦システムの構築を目的に、楽曲とその再生時の状況の関係を収集したソーシャルデータより分析している。取得したデータのうちの7%ほどではあるが、ツィート情報から楽曲と再生時の状況との関係を抽出可能であるということが示された。

対象となるデータ

2016年8月10日〜2016年9月3日の間に投稿されたツィート(66879件)

手法の概要

  • ハッシュタグ#nowplaying付きのツィートを収集して、アーティスト名や楽曲名や楽曲再生時の状況(同一ユーザの5分前後の投稿内容)を収集
  • 取得したツィートからアーティスト名、楽曲名を除去して再生時の状況を取得
  • 取得したデータからデータベースを作成

PDFのリンク

https://kaigi.org/jsai/webprogram/2017/pdf/102.pdf

テキストマイニングを用いた口コミ分析による点数評価の信頼性確認手法

目的と結果

製品などの口コミの評価レビューに関する信頼性を確かめることを目的としている。レビューデータに対して感性評価を行い、さらにその結果に対して総合評価点数別に感性表現(Goodなど)の伴った表現の頻出ランキングを作成することで、点数が高い理由を把握しやすくなった。

対象となるデータ

ソニーの製品サイトにおける、ユーザの製品に対する評価とコメントのデータ(1406件)

手法の概要

  • テキストマイニングスタジオによる感性評価(ポジティブ、中立、ネガティブ)
  • 総合評価点数別(5段階)の「ポジティブ、中立、ネガティブ」の割合の調査
  • 総合評価4の口コミかつ中立な表現にフィルターをかけて、感性情報を有する単語と係り受け関係となった単語の頻度ランキングのTOP10を抽出

PDFのリンク

https://kaigi.org/jsai/webprogram/2017/pdf/1115.pdf

不動産仲介マーケティングのためのユーザ行動予測 Prediction of user behaviors for real estate brokerage marketing

目的と結果

不動産紹介業において、顧客の属性情報と来店初期の行動から、来店者が最終的に商品を購買するかどうかの予測モデル(不均衡データにおける予測タスク)を構築することでマーケティングの広告効果測定に適用することを目的としている。結果として、顧客の来店後30分間という短い時間における行動だけでも識別力のある予測が可能であることが示されている。

対象となるデータ

  • オンライン不動産賃貸仲介店舗iettyの顧客データベース
    • 希望物件の情報
      • 引っ越し希望日
      • 住みたいエリアの駅
      • 間取り
      • 広さ
      • 家賃
    • 顧客属性
      • 在住の地域
      • 性別
      • 年齢
    • 行動データ
      • 登録時
        • フォームの記入にかかった時間
        • フリーコメントの長さ
        • 利用デバイス
      • 登録後
        • 初回チャット発言までの経過時間
        • 初回物件評価までの経過時間

手法の概要

  • STEP1:顧客の属性および登録初期(30分以内)の行動から特徴量を作成し、2ヶ月以内に契約すれば正例、それ以外を負例とする。(正例は619件、負例は33212件)
  • STEP2:検証用データを無作為に20%取り置く
  • STEP3:残り80%のデータに対して負例に対する、ランダムアンダーサンプリングと、正例に対するSMOTE(Synthetic Minority Over-sampling Technique)を用いたオーバーサンプリングによりサンプル数を調整する。
  • STEP4:ランダムフォレストを用いて、無効な特徴量の取捨選択や離散化のレンジ調整する。
  • STEP5:全特徴量(83次元)を二値化して、RBFカーネル(Gaussian カーネル)のSVMを適用し、様々なCやγの組み合わせを試行して、二値分類を行う。
  • STEP6:評価を予測確率の平均とAUCの2種類で行う。

PDFのリンク

https://kaigi.org/jsai/webprogram/2017/pdf/466.pdf

SUUMOでの不動産データ活用の取り組みと未来

目的と結果

物件検索ユーザーが比較検討を行いやすくすることを目的に様々な取り組みをしている。

対象となるデータ

  • 不動産ポータルサイトSUUMOのデータ
    • 行動履歴(Webサイト、アプリ)
    • 物件情報(不動産情報)
    • 街情報(独自で収集)
    • アンケート

手法の概要

  • 実活用
    • 相場推定
    • 単純な加算平均ではなく、外れ値や時系列変動、データ量などを考慮して推定している。
    • リアルタイム物件レコメンド
    • ランキング学習により推定したモデルを利用し、リアルタイムに計算を行っている。個人ごとにパーソナライズしたランキングも用いている。
    • バンディットアルゴリズムによる配信施策の最適化
    • メールやプッシュ通知などで件名やデザイン、配信時間など様々な選択肢があり、その最適なパターンを見つけるために、バンディットアルゴリズムを適用している。
  • 実験段階
    • 間取り画像の分析
    • ユーザーの求めている間取りが何なのかを画像から抽出しようとしている。
    • ユーザーの検索行動、嗜好の推定
    • ユーザーの検索行動から、嗜好性を掴み取り、レコメンドする際の理由付けができるようにモデルを作ろうとしている。

PDFのリンク

https://kaigi.org/jsai/webprogram/2017/pdf/743.pdf

感想

  • 特徴量の削減のためにランダムフォレストを適用する流れ
  • 高次元スパースデータに対するニューラルネットワークの適用
  • CVの時系列予測のためにRNNの適用
  • SNS分析におけるネットワーク特徴量とフィードバック特徴量という概念
  • 口コミデータ分析の作法(点数別に感性表現の係り受けを見る)
    など勉強になりました。Kaggleと違って日本語なのが読みやすかったですね。

参考文献

初めてのディープラーニング –オープンソース”Caffe”による演習付き
SMOTE で不均衡データの分類

洋楽の歌詞データでDoc2vecを実行してみる

はじめに

仕事で記事間の類似度計算などがあったりするんですが、TF-IDFにしてCOS類似度を計算するなどの方法で行っているのが現状です。そろそろ他の手法にも移行したいので、それに変わる類似度計算の手段としてDoc2vecを試してみたいと思います。

データ

以前より収集している洋楽の歌詞データを用います。Billboardのランキングに登場した楽曲の歌詞データを961曲分集めたものとなります。英語なので、日本語のように形態素解析は不要ですが、ストップワードを除去するなどの処理を施したコーパスを用います。Rのtmパッケージによるストップワードの除去についてはBillboard100位以内の楽曲の歌詞情報にLDAを適用してみたをご覧ください。日本語でのDoc2Vecの適用は参考文献において紹介しています。

類似度計算

TaggedLineDocumentを用いて、doc2vecで扱えるオブジェクトを作成します。TaggedLineDocumentに指定するファイルは主にtxtファイルで、その満たすべき条件は「1行につき1文書」「単語がスペースで区切られている」などです。あとは、doc2vecを実行するだけです。パラメータなどの細かい指定については今後の宿題としたいです。

類似度の算出

早速、気になる楽曲に関して、類似度の高い楽曲を抽出してみたいと思います。

どうやら、Radioactiveという曲はkings of leonというグループも歌っているようですが、私はimagine dragonsの方の楽曲に関心がありますので、インデックスを409にして歌詞情報の近い楽曲を抽出します。

どうやら、toby keithのMade In Americaという楽曲が最も近いようです。類似度は35%程度ですが、全然単語が被っていないので本当に近いのか納得がいかないです。

次に、lady gagaのBorn This Wayに近い楽曲を出してみます。Dancing Queenという非常に懐かしい曲が選ばれていますが、類似度は49%と先ほどよりも高いです。queenやgirlやcanやrightなど共通の単語が含まれているので、先ほどの結果よりは近いのかなぁと思います。

正しく推定できているのか不安だったので、類似度が90%と非常に高かった、Just The Way You Areという楽曲の最も近い楽曲を見てみます。

調べたところ、同じ楽曲のカバー版のようです。近いものは、ちゃんと近いと見なせるようです。近いかどうかの基準をどの水準に置くのかは難しい判断ですね。

参考情報

models.doc2vec – Deep learning with paragraph2vec
Doc2Vecの仕組みとgensimを使った文書類似度算出チュートリアル
Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Billboard100位以内の楽曲の歌詞情報にLDAを適用してみた

目次

・はじめに
・データ収集
・Rによる分析
・LDAの結果
・参考文献

はじめに

前回の投稿でBillboardの週次洋楽ランキングデータをWebスクレイピングで取得し、楽曲の消費サイクルのような順位の挙動を確かめることができました。(某洋楽ヒットチャートの週次ランキングデータをBeautiful Soupで集めてみた)今回は、歌詞の情報を用いて順位データとつなぐことにより、どのような単語の入っている洋楽がBillboardにおいてTop10に入る傾向があるのかをLDAを行うことで確かめたいと思います。

データ収集

残念なことに、Billboardのサイトに歌詞の情報は載っていません。そこで、洋楽の歌詞が取り上げられている某サイトをPython(3系)でWebスクレイピングし、名寄せを頑張って順位データと歌詞データを繋ぎます。

幸いなことに某サイトのURLに規則性があったので、アーティスト名からなるURLを生成し、そのURLをWebスクレイピングして楽曲のリストを集め、今回のBillboardのランキングに入った楽曲のみに絞ります。

楽曲をランキングに含まれるもののみに絞ったら、歌詞詳細ページを取得します。

うまいこと歌詞情報を手に入れることができました。ざっと947曲です。

Rによる分析

ここから、Rにてテキストマイニングを行いたいと思います。まず、tmパッケージを用いて、不要語(stop word)を除去します。具体的にはtheとかyouとかを除外しています。

続いて、LDAを実行できるtopicmodelsパッケージで扱えるようにするために、テキストデータに以下の処理を施します。

あとは以下のコードでLDAを実行するだけです。トピック数はアドホックに20としています。研究者の方、いい加減ですみません。

LDAの結果

まずは推定されたトピックごとの上位10単語をみてみます。トピック1はラブソングとかでしょうか。トピック17にパリピっぽい単語が、トピック18にスラングが含まれていますね。

見ずらいので、行を一つにまとめて、トピックにidを割り振ります。

最後に、BillboardでTop10に入ったかどうかのデータを作っておき、そのデータと各歌詞を繋ぎ、各歌詞ごとに割りふられた確率が最大のトピックで集計をします。

BillboardのTop10ランクイン割合の高いトピックTop3
「one,ooh,call,cause,gettin,born,day,makes,came,stand」
「better,world,whoa,run,light,things,find,show,see,waiting」・・・明るい感じ?
「stop,just,hands,put,party,crazy,live,lights,play,see」・・・パリピぽい

BillboardのTop10ランクイン割合の低いトピックTop3
「wanna,want,take,rock,see,kiss,come,make,body,tonight」・・・欲求系?
「feel,heart,life,away,just,break,real,enough,every,find」・・・癒し系?
「hey,said,old,every,woo,left,told,nothing,daddy,sweet」

あまり洋楽を聴かないので、得られたトピックの解釈が中々できないのがもどかしいです。ただ、スラングの歌詞を含む歌詞はそんなにランクイン割合が悪いわけではなさそうですね。洋楽をもっと聴いて、前処理などもう少し工夫してリベンジしたいですね。

参考文献

トピックモデルによる統計的潜在意味解析 (自然言語処理シリーズ)

Pythonクローリング&スクレイピング -データ収集・解析のための実践開発ガイド-

モダンなRによるテキスト解析topicmodels: An R Package for Fitting Topic Models

言語処理学会第23回年次大会〜Webマーケティングで使えそうな発表資料まとめ〜

行きたいけど行けなかった言語処理学会第23回年次大会の発表内容がPDFで見れるということで、発表内容の中でWebマーケティングなどの仕事で役に立つかもしれない12件の研究を独断と偏見でまとめています。

プログラムはこちらのリンクから見れます。
言語処理学会第23回年次大会(NLP2017) プログラム

今回取り上げるのは以下の12件です。

・Wikipediaのカテゴリ構造を特徴ベクトルに用いたRandom Forestによるショートメッセージ分類
・NMFを用いた為替ドル円レートの変動要因分析とAdaboostを用いた予測システム
・Are Deep Learning Methods Better for Twitter Sentiment Analysis?
・化粧品レビューサイトにおけるクチコミの有用性判定
・機械学習を用いたQAサイト質問文のカテゴリの類推
・不満調査データセットの素性ベクトル化
・検索エンジンを用いた記載欠落箇所の補完
・生コーパスからの単語難易度関連指標の予測
・常識から外れた雑談応答の検出
・店舗レビューには何が書かれているか?–調査及びその自動分類–
・トップダウン型共起グラフを用いたブログからの観光地の行動分析
・社内データに基づくイノベータ人財のピックアップ

Wikipediaのカテゴリ構造を特徴ベクトルに用いたRandom Forestによるショートメッセージ分類

http://www.anlp.jp/proceedings/annual_meeting/2017/pdf_dir/P16-4.pdf

Wikipediaのカテゴリ構造を学習させたナイーブベイズにより特徴ベクトルを生成し、それをTweetに付与して、ランダムフォレストを用いてメッセージ分類をしているようです。直接Tweetのデータを使わないでWikipediaのデータを活用するところにトリックがあるようです。ビジネスにおいて関心のある対象ユーザーのTweetのモニタリングや対象ユーザーの特定に使えるかもしれません。

NMFを用いた為替ドル円レートの変動要因分析とAdaboostを用いた予測システム

http://www.anlp.jp/proceedings/annual_meeting/2017/pdf_dir/P15-5.pdf

『金融経済月報』や『日本経済展望』のテキストデータに対して、PCAとNMFの2つの手法を用いて特徴抽出を行い、Adaboostを用いて為替レートの予測を行っているようです。為替レートを予測せずとも、テキストデータを用いた市場動向の予測などの参考になるかもしれません。

Are Deep Learning Methods Better for Twitter Sentiment Analysis?

http://www.anlp.jp/proceedings/annual_meeting/2017/pdf_dir/C5-1.pdf

Tweetの感情分析で深層学習を用いて、SVMなどと比較している研究のようです。Conclusionを見る限りは、SVMよりも精度が高いとは言えず(ネットワーク構造やデータセットの大きさに依存する)、少ないデータセットなどではSVMの方が依然として精度が高いようです。

化粧品レビューサイトにおけるクチコミの有用性判定

http://www.anlp.jp/proceedings/annual_meeting/2017/pdf_dir/C5-4.pdf

@cosmeにおける、Likeの数をクチコミの有用度と定義して、クチコミデータに対してTF-IDFやLDAを用いて構造解析や意味解析などで特徴を抽出し、その特徴を説明変数とした回帰モデル(SVR)を構築しています。構築した回帰モデルを用い、クチコミのLikeの数を推定することを目的としています。

ここでの知見が直接に自社のコンテンツなどのナレッジになるわけではないですが、LDAやSVM(SVR)を駆使しているなど、分析手法の参考にはなると思います。

機械学習を用いたQAサイト質問文のカテゴリの類推

http://www.anlp.jp/proceedings/annual_meeting/2017/pdf_dir/P9-6.pdf

深層学習(Stacked Denoising Autoencoders(SdA) と Deep Belief Network(DBN))を用いて質問文に適したカテゴリを類推する研究です。従来手法のMLPやSVMと比べても精度が高かったようです。ユーザーの欲しい商品や、働きたい職場、住みたい場所などに関しても類推できるとマーケティングなどでの活用もできるかもしれません。

不満調査データセットの素性ベクトル化

http://www.anlp.jp/proceedings/annual_meeting/2017/pdf_dir/P9-2.pdf

不満に関するデータにタグ付けされた情報やJUMANの付属辞書から得られた意味情報も素性とすることで、不満の検索のしやすさを高める研究のようです。不満のテキストデータから特徴量に変えるまでのプロセスが記されているのが参考になりそうです。研究自体は、形態素解析の精度などにより、まだ課題があるようです。

検索エンジンを用いた記載欠落箇所の補完

http://www.anlp.jp/proceedings/annual_meeting/2017/pdf_dir/P16-5.pdf
「検索エンジンを用いて記載欠落箇所に適切な情報を埋める研究」とあり、コンテンツマーケティングなどの際に、作成した記事に説明不足な箇所を見つけることができるので、コンテンツの質を担保する上で役に立つかもしれません。

生コーパスからの単語難易度関連指標の予測

http://www.anlp.jp/proceedings/annual_meeting/2017/pdf_dir/E5-3.pdf

「均衡コーパスや深いアノテーションを施した言語資源に頼らないことで他言語への適用が容易な単語難易度関連指標の予測手法を提案」
「単語難易度関連指標の予測精度はLDAの各トピックからの単語出現確率を基にした素性を用いることで、従来のようにコーパスからの単語頻度を素性を用いる場合と比べ大幅に向上」
「word2vecのような単語のベクトル表現より、LDAの各トピックからの単語出現確率の方が予測精度の向上に有効」
とあり、文章のリーダビリティをよりカジュアルに計算することが可能になるようです。文章のリーダビリティとWebサイトの直帰率やスクロール率などとの関係を研究してみたいですね。

常識から外れた雑談応答の検出

http://www.anlp.jp/proceedings/annual_meeting/2017/pdf_dir/P15-3.pdf

「Word2Vecモデルの学習においては、匿名掲示板である「おーぷん2ちゃんねる」から取得した人気記事7959記事を用いている。」と2ちゃんねるの表現から非常識語を見つけるという試みです。自社でUGCを運営している場合は役に立ちそうな研究です。

店舗レビューには何が書かれているか?–調査及びその自動分類–

http://www.anlp.jp/proceedings/annual_meeting/2017/pdf_dir/W-3.pdf

「店舗レビュー1,510件(5,266文)に対して人手でアノテーションを行い、このデータに基づいてトピックおよびその評価極性を分類するモデルを構築」と、恐ろしい数の文書を人出で分類したそうです。これもユーザーアンケートなどの研究に使えそうです。

トップダウン型共起グラフを用いたブログからの観光地の行動分析

http://www.anlp.jp/proceedings/annual_meeting/2017/pdf_dir/P20-3.pdf

「寄り道をする観光地を指定すると、その特徴を可視化する手法の開発を目的」とされています。マーケターであれば、関心のある商材を指定すると、その商材に関する特徴を可視化できるのではないでしょうか。テキストマイニングで言うところの共起グラフによる分析となります。

提案されている手法のステップは以下の通りで、自分の関心のある市場のデータを使えば同様のことができると思われます。
(1) 商材を指定しブログ記事集を取得する。
(2) 単語対の共起スコアを同時に出現した記事数をベースとして算出する。具体的には最低出現数を4回として単語を限定し、Jaccard 係数で共起スコアを算出する。
(3) 単語を頂点、共起スコアの得られた単語対を辺として共起グラフを生成する。
(4) 分析目的に応じて注目する頂点を指定する。
(5) 指定した頂点から1または2の距離で到達可能、かつ共起スコアが一定範囲内という辺および頂点を一定数を限度に残す。

社内データに基づくイノベータ人財のピックアップ

http://www.anlp.jp/proceedings/annual_meeting/2017/pdf_dir/P12-1.pdf

番外ではありますが、面白そうな取り組みなので紹介します。
社員プロフィールや業務報告(日報)や適性検査や360度調査やアンケートなどのデータをもとに、9種類の指標を定め、一部の指標のスコアリングを単語ベースで行うに際して、スコアリング用の単語を定めるためにWord2Vecを用いています。これからピープルアナリティクスを目指す企業には参考になる情報だと思います。

GensimのHDP(Hierarchical Dirichlet Process)をクラシック音楽情報に対して試してみる

HDP(Hierarchical Dirichlet Process)いわゆる階層ディリクレ過程を実行できるモデルがPythonのGensimライブラリにあるという情報から、あまり実行例も見当たらないので、チャレンジしてみました。

HDP(Hierarchical Dirichlet Process)

HDP(Hierarchical Dirichlet Process)は文書集合全体のトピック数と文書ごとのトピック数の推定を行うことができる手法で、中華料理店フランチャイズという仕組みを用いています。通常のLDAなどでは、分析者が任意のトピック数を決める必要がありましたが、与えられたデータからその数を推定するため、その必要がないというのがHDPを使うことの利点であると思われます。

実行までの流れ

ざっくりですが、
・コーパスの準備・文書の分かち書き(名詞のみ)
・HDPの実行
という流れです。

ちなみに実行環境は
MacBook Pro
OS X Yosemite 10.10.5
2.6 GHz Intel Core i5
メモリ8GBです。

コーパスの準備

今回は、以前手に入れた某辞典サイトのクラシック音楽情報1800件のテキストデータ(1行に1件分の文字列が入っているデータで16MBくらい)があるので、それをコーパスとして使います。参考情報として挙げているブログの助けを借りて、文書単位でMeCabにより形態素解析で分かち書きした結果から、意味を持ちやすい品詞として、「名詞」に該当するもののみを結果として返す以下のPythonスクリプトを用いました。結果はtmep.txtとして出力されます。もっと良いやり方があると思いますが、目的は達成できると思います。ちなみに、MeCab Neologd(ネオログディー)という、固有名詞などに強いシステム辞書を活用してみたかったので、その利用を前提として書いています。MeCab Neologd(ネオログディー)のインストール関連の情報は参考情報にありますので、チャレンジしてみてください。(OSXかUbuntuの方が進めやすいと思います。)

こちらのスクリプトをターミナルで実行します。(解析するディレクトリ下で実施しています。)

HDPの実行

以下のPythonスクリプトで実行しています。

HDPの結果について

topic_detail.csvの結果を見たところ、トピックの数が150個もあって、「本当にトピックの数を自動で決めれているのかなぁ」と不安に思ったのですが、実際に各文書に割り当てられているトピックの数は、先ほど出力したtopic_for_corpus.csvで見ると60個でした。そのため、今回、HDPに従って決まったトピック数は60ということになります。さらに不安に思ったので、Stack Over Flowで調べていたんですが、トピックは150個出るけど確率が割り振られていないはずと回答されていました。( Hierarchical Dirichlet Process Gensim topic number independent of corpus size

出現頻度の高い上位10のトピックは以下の通りです。

加えて、トピックごとに文書に割り当てられた数を集計してみましたが、topic0が圧倒的に多く、コーパスの特性上、含まれやすい情報がここに集まっているのではないかと思います。幅広いテーマを抽出できるかと期待していたのですが、やたらと個別具体的な「トゥーランドット」や「ワーグナー」や「カルメン」などがトピックの上位単語に上がってきています。実行方法を間違えているかもしれないし、パラメータチューニングなどをもっと頑張れば、幅広いトピックを得ることができるかもしれないので、今後の課題としたいです。

スクリーンショット 2016-04-10 18.23.37

参考情報

・トピックモデルについて
machine_learning_python/topic.md at master · poiuiop/machine_learning_python · GitHub

・HDP関連
 models.hdpmodel – Hierarchical Dirichlet Process
Online Variational Inference for the Hierarchical Dirichlet Process

・MeCab関連
mecab-ipadic-NEologd : Neologism dictionary for MeCab
形態素解析器 MeCab の新語・固有表現辞書 mecab-ipadic-NEologd のご紹介
テキストマイニングの前処理。名詞抽出、ストップワード除去、珍しい単語の除去

・Python関連
データ分析をやりたいエンジニアにおすすめ!Pythonの入門スライド13選

Word2Vecでクラシックの楽曲情報をコーパスとして類似度を出してみる

あの手この手を使って手に入れた、およそ1800曲に及ぶクラシック音楽の楽曲情報(テキスト)をもとに
、PythonのGensimライブラリーのWord2Vecを使って、任意の単語に関する類似単語を出力してみたいと思います。

まずは、手に入れたコーパスを作業フォルダに置いて、MeCabによる分かち書きを行います。
(最後の引数-bは、処理する文書のサイズが大きい際に調整します。)

後はGensimパッケージを読み込んで、

Word2Vecを計算させるだけです。

(引数のsizeは特徴ベクトルの次元数です。)

早速、トランペットについて、所与のコーパスにおける類似単語を見てみたいと思います。(類似度が最も高い単語の上位10位の結果を返しています。)

惜しいですね。
願わくば、コルネットが一番目に来てほしかったです。オケの編成上、どうしてもトロンボーンが一緒の文書で出やすいのだと思います。

続いては、ピアノです。こちらもオルガン・チェンバロは非常に近い楽器だと思うのですが、一番目がヴァイオリンというのはデータ上仕方がないのかもしれません。

続いて、ヴァイオリンですが、ヴィオラ・チェロは良いと思うのですが、ピアノやチェンバロなどが上位に来ています。

続いて、クレッシェンドですが、似たような意味はあまり観察されていません。ただし、「クライマックス」・「アルペッジョ」などと似たようなシチュエーションで登場しそうな表現な気がします。

最後に、アレグロですが、こちらは速さの序列に関しては守られていないようです。やはりコーパス次第ですかね。
プレスト > アレグレット > モデラート > アンダンテ > アダージョ > ラルゴ
この序列が守られるようなWord2Vecの実践例などがあると面白いですが。

仕事でWord2Vecを使うシーンがあるとしたら、広告文のアイデアを助けたり、語彙力の弱い人の補助的なツールとして使えるかもしれませんが、実用レベルはまだまだ遠い気がします。

おまけ

左手に関しては、最も類似した単語が「右手」という結果になっています。

参考文献

models.word2vec – Deep learning with word2vec

岩波データサイエンス Vol.2 岩波データサイエンス刊行委員会 編