AI

自然言語処理の基礎|言葉を数値にする

AI

ニューラルネットワークが受け取れるのは数値だけで、文章はそのまま入力できません。言葉を数値に変える手順を、形態素解析から分散表現まで順に整理します。

こんにちは、zawato(@zawato7)です!

本記事はディープラーニング入門ロードマップの第22回です。文章をネットワークに流し込むための前処理を見ていきます。

この記事でわかること
  • 形態素解析とN-gramによる文章の分割
  • Bag of WordsとTF-IDFの違い
  • 分散表現とword2vec、エンベディング層

 

 

まず文章を単語に分割する

自然言語処理の第一歩は、文章を単語に切り分けることです。英語は空白で区切られていますが、日本語には区切りがありません。そこで使うのが形態素解析で、辞書をもとに単語へ分割し、品詞・原形・活用形も取り出せます。

N-gramという切り方もあります。連続するN個の文字(または単語)を機械的に切り出す方法で、Nが2なら2-gramです。辞書にない語も拾えるのが利点です。

 

 

Bag of WordsとTF-IDFで文書をベクトルにする

単語に分けたら、次は出現回数を数えて数値にします。Bag of Words(BoW)は、文書中で各単語が何回出たかを数えてベクトルにする手法です。単語を袋に入れた扱いで、語順は失われます。

ただし回数だけでは「する」「こと」のような常出語が上位に来ます。そこで重要度を測るのがTF-IDFです。

要素意味
TFその文書内での単語の出現頻度
IDFその単語が出現する文書の割合の逆数

2つを掛け合わせると「その文書によく出て、他の文書には出ない語」が高くなります。文書ごとに計算されるため、同じ単語でも文書が変われば値も変わります。

 

 

分散表現なら単語同士の近さを測れる

分散表現(単語埋め込み)は、1単語を50〜300次元程度の実数ベクトルで表す方法です。対になるのがワンホットベクトルで、語彙の数だけ次元を用意し該当語だけを1にします。語彙が数万語ならゼロだらけの数万次元になり、単語同士の関係も表せません。

分散表現はこれを低い次元に押し込め、意味の近い単語が近くに来るよう学習します。近さの指標はコサイン類似度で、向きが同じなら1、真逆なら-1です。高次元データを圧縮する発想は主成分分析による次元圧縮と共通します。

分散表現を得る代表的な手法がword2vecで、学習方法は2種類あります。

  • CBOW:周囲の単語から中央の単語を予測するように学習する
  • skip-gram:中央の単語から周囲の単語を予測するように学習する

予測結果ではなく、副産物として得られる単語ベクトルのほうが目的です。発展形には、未知語のベクトルも作れるfastText、文脈でベクトルが変わるELMoがあります。

 

 

エンベディング層はベクトルごと学習する

単語ベクトルを外部で用意せず、解きたいタスクの学習の中で獲得する方法もあります。それがエンベディング層で、ネットワークの入り口に置き、単語番号に対応するベクトルを返します。

初期値は乱数です。あとは通常のニューラルネットワークと同じで、誤差が小さくなる方向に更新すれば、タスクに適した単語ベクトルが出来上がります。学習済みの分散表現を初期値に持ち込むこともでき、これは転移学習と重なります。

 

 

まとめ

  • 文章はそのまま扱えないため、形態素解析やN-gramで細かい単位に分割する
  • Bag of Wordsは出現回数を数えるだけ。TF-IDFはTFとIDFの積で、その文書に固有の語を高く評価する
  • 分散表現は単語を50〜300次元のベクトルにする方法。word2vec(CBOW・skip-gram)で学習し、コサイン類似度で意味の近さを測れる
  • エンベディング層を置けば、単語ベクトル自体を学習の中で獲得できる

 

 

よくある質問

Q. Bag of WordsとTF-IDFはどちらを使えばよいですか?
A. 文書の特徴をつかみたいならTF-IDFです。Bag of Wordsの数え方に重み付けを加えたものだからです。ただし語順を捨てる点は共通します。

Q. ワンホットベクトルは使われないのですか?
A. 単語の指定には使われますが、意味の表現としては使われません。語彙数と同じ次元が必要でメモリ効率が悪く、どの単語同士も等距離になり近さを測れないからです。

Q. CBOWとskip-gramの覚え方はありますか?
A. 予測の向きで区別します。CBOWは「周り→中央」、skip-gramは「中央→周り」です。得られる単語ベクトルが目的である点は同じです。

Q. word2vecとエンベディング層はどう使い分けますか?
A. word2vecは大量の文章から汎用的な単語ベクトルを先に作る方法、エンベディング層はタスクの学習の中で獲得する方法です。データが少ないときは学習済みベクトルを初期値にする併用も使われます。

 

 

コメント