乃木坂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. 学習データについて
収集した記事について
使用した記事数は以下の通りです。
ブログの収集方法はこちらの記事の通りです。
前処理
- 括弧などの記号やURLなどの除去
- neologdで紹介されている前処理
- 名詞、動詞、形容詞のみを使用する
上の処理を順番に実施しました。詳細はコードで確認できます。
ただこちらにも書いていますが、良い方法である自信はありません。
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次元へ次元削減したものです。
- 各グループ毎と番組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)
今後の課題
今後は以下の点を検証したいと思っています。
学習した単語分散表現を応用
学習データの追加
他の学習方法との比較
*1:先日話題になっていたMLタスクの論文・コードがまとめられたサイトpaperswithcodeでは「179 papers with code」が登録されていました。
*2:日本語の分散表現を学習している記事がいくつかあり、その辺も安心感があったのでこちらを採用しました。