myaun’s blog

乃木坂46・欅坂46・けやき坂46のブログから単語分散表現を学習

1. はじめに

特定ドメインのテキストから単語分散表現を学習することに興味があったので実験しました。

今回実施した内容

  • 乃木坂46欅坂46けやき坂46のブログを収集してテキストへ前処理をする
  • fastTextにより収集したブログのテキストから単語分散表現を学習する
  • 学習した単語分散表現による類似単語の検索や2次元空間へのプロットの結果を確認する

2. 単語分散表現とは

単語分散表現は、文書から学習される単語の意味を表すベクトルです。 学習されたベクトルが「“King” – “Man” + “Woman” = “Queen”」のような足し算、引き算ができることで話題になりました。 この話題になったミコロフの論文が発表されたのは2013年でした。そこから早6年、学術領域でその方法論や応用が盛んに議論されております。*1

fastText

今回採用したfastTextは、Facebookにより提案された分散表現の学習手法の1つです。 こちらの手法は、Subword modelというモデルを組み込むことにより、出現単語の文脈のみでな字面の類似性を考慮することを可能とします。 *2

以下の記事の解説がとても分かりやすいです。

3. Fasttextによる学習

実装コード

言語: Python
使用ライブラリ: Mecab, gensim, neologdnなど
GitHubリポジトリ: github.com

3-1. 学習データについて

収集した記事について

使用した記事数は以下の通りです。

ブログの収集方法はこちらの記事の通りです。

qiita.com

前処理

上の処理を順番に実施しました。詳細はコードで確認できます。
ただこちらにも書いていますが、良い方法である自信はありません。

3-2. 学習方法

gensimを使って以下のよう学習しました。

# learn fasttext

from gensim.models import FastText

model = FastText(size=100, sg=1, workers=4, window=10, min_count=10)
model.build_vocab(sentences)
model.train(sentences, total_examples=model.corpus_count, epochs=model.epochs)

パラメータはかなり適当です。

3-3. 学習した単語分散表現の確認

類似単語の検索

学習した分散表現が類似する単語を探索すると、下のような結果になりました。

model.wv.most_similar("てち")
---
[('友梨奈', 0.7058396935462952),
 ('平手友梨奈', 0.6936807036399841),
 ('平手', 0.6837375164031982),
 ('波布茶', 0.6804182529449463),
 ('ゆう', 0.6743236780166626),
 ('ネル', 0.6728752255439758),
 ('鈴本', 0.6586591005325317),
 ('理佐', 0.645741879940033),
 ('まなか', 0.6427689790725708),
 ('あかね', 0.6317785978317261)]

model.wv.most_similar("キャプテン")
---
[('キャプ', 0.7702136039733887),
 ('暫定', 0.6804853677749634),
 ('就任', 0.6307018399238586),
 ('正式', 0.6078504323959351),
 ('れいか', 0.6019401550292969),
 ('桜井', 0.557970404624939),
 ('大役', 0.5572315454483032),
 ('任命', 0.5523629188537598),
 ('責任感', 0.5509008169174194),
 ('頼り', 0.5480058193206787)]

model.wv.most_similar("佐々木久美")
---
[('佐々木希', 0.7091835737228394),
 ('加藤史帆', 0.6711205244064331),
 ('東村', 0.644331693649292),
 ('佐々木', 0.6436366438865662),
 ('柿崎芽実', 0.6401069760322571),
 ('東村芽依', 0.639634907245636),
 ('佐々木美玲', 0.6213143467903137),
 ('久美', 0.6100345849990845),
 ('きくちゃん', 0.5945029258728027),
 ('柿崎', 0.5900822281837463)]
  • 「てち」は「平手友梨奈」の愛称であり、「平手」や「友梨奈」と共に上位に含まれている。
  • 「キャプテン」のことを乃木坂メンバは同義後として「キャプ」と呼ぶこともある。また、乃木坂46のキャプテンである桜井玲香を表す「桜井」「れいか」が含まれている。一方で、欅坂46, けやき坂46のキャプテンは含まれていなかった。
  • 「佐々木久美」の愛称「久美」「きくちゃん」が含まれいる。「佐々木希」は字面の類似性に引っ張られたと思われる。

メンバおよび番組MCを2次元空間へプロット

以下の図は、各人物名の分散表現をTSNEにより2次元へ次元削減したものです。

f:id:myaun:20190204182535p:plain

  • 各グループ毎と番組MCにうまく分離されており、分散表現がそれぞれの所属グループの情報を含んでいることが確認できる。
    • また、乃木坂46の1, 2, 3期やけやき坂の1, 2期もうまく分かれている

4. 終わりに

確認方法は、人物名など特定の単語のみでしたが、それなりにうまく学習できたかなという風に考えています。

ただ、やっていていこれでいいのかなと思うところもいくつかありました。

気になった点

  • 前処理について

    • 上述のように学習前のテキストへ前処理を行いましたが、やり方は自信が無いです。調査不足ではありますが、日本語の分散表現の学習で前処理がどの程度必要なのかが分かりませんでした。いくつかの記事では日本語Wikipediaから学習するとき、分かち書きだけしたもので学習してたようでしたが、それはWikipediaがある程度綺麗な文書だからなのか?など、結構疑問がありました。
  • 学習時のパラメータについて

    • これらは評価指標を定義して、ある程度実験的に探索する必要があるとは思いますが、今回のような特定ドメインに対して実施するときのコツとかあれば知りたい。
    • 次元数と考慮するサブワードの範囲が最も重要であるとFasttextのドキュメントに書かれていました。
      • fasttext.cc
      • The most important parameters of the model are its dimension and the range of size for the subwords. The dimension (dim) controls the size of the vectors, the larger they are the more information they can capture but requires more data to be learned. But, if they are too large, they are harder and slower to train. By default, we use 100 dimensions, but any value in the 100-300 range is as popular. The subwords are all the substrings contained in a word between the minimum size (minn) and the maximal size (maxn)

今後の課題

今後は以下の点を検証したいと思っています。

  • 学習した単語分散表現を応用

    • 学習した分散表現を用いてツイートやブログ記事の特徴量を表現して、分類やクラスタリングなどの応用タスクの実験をしたいと思っています。できれば良い感じの定量評価方法を定義できるものにしたいなと考えています。
  • 学習データの追加

    • 今回使ったブログ記事の数ってデータ量的にどうなんですかね。少なそうかもですが、特定ドメインのための分散表現としては十分だったりするかもと思ったりもしたので検証したいです。
    • 同じドメインのツイートデータ等は収集可能なのですが、ブログに比べて少しノイジーな感じがするので、一緒に学習しても大丈夫か試してみたいです。
  • 他の学習方法との比較

    • 記事が長くなりすぎるのが嫌だったので(定量的な比較もできないし)、本記事では行いませんでしたがword2vec(cbow, skip-gram)やGloveなど代表的な方法と比較してみたかったです。
    • また、以下の記事でも紹介されているSCDV(Sparse Composite Document Vectors)も試したいと思っています。上述の応用の精度向上に貢献しそうな気がします。文書ベクトルの算出に「ソフトクラスタリングに基づく単語のトピック」と「TFIDFにおけるIDF値」を考慮することがメインコンセプト?
    • qiita.com

*1:先日話題になっていたMLタスクの論文・コードがまとめられたサイトpaperswithcodeでは「179 papers with code」が登録されていました。

*2:日本語の分散表現を学習している記事がいくつかあり、その辺も安心感があったのでこちらを採用しました。