【テキスト分析】Word2vecのための前処理入門

こんにちは、キスモインターン生の杉森です。

今回はテキスト分析において必要不可欠な前処理と最も有名な技術の1つであるWord2vecについてご紹介します。

テキスト分析を取り巻く環境

まずはじめに、テキスト分析を取り巻く環境について簡単に説明します。
近年の情報技術の発展に伴い、ニュースがインターネットを通じて配信され、私たちもTwitterFacebookなどのソーシャルメディアを通して様々な情報を発信できるようになりました。これらの情報の総量は日々増加しており、莫大な量のテキストデータがオンライン上に存在しています。
このような背景のもと、オンライン上の莫大な量のテキストデータから様々な情報を抜き出すことで、今までは得ることができなかった情報や知見を得ることができると期待されています。

テキスト分析の簡単な例として、キスモの技術ブログの記事でよく使われている単語を表現するワードクラウドを構築しました。
AICNNPythonなどキスモの事業と関連のある単語が見て取れますし、役員の大越が参加している世界的なデータ分析コンペティションであるKaggleという単語を見ることができます。
このように、頻出単語を調べるという非常にシンプルなテキスト分析でも、キスモという企業の特徴をつかむことができます。

f:id:mishimanatsuki:20180717094859p:plain

前処理

では、早速テキスト分析において非常に重要なプロセスである前処理について説明します。

形態素解析

テキスト分析を実行するためには、私たちが普段使っている自然言語で構成されているテキストを、コンピュータが扱いやすい形式に変換する必要があります。そのための第一歩として、文章を単語で区切ったリストに変換する必要があります。
英語の場合は、単語がスペースで区切られているため簡単にリストに変換することができますが、日本語のテキストは英語のように単語の区切りが存在しないため、テキストから単語を特定する形態素解析という処理を行う必要があります。

  • 英語:”I live in Nagoya” -> [“I”, “live”, “in”, “Nagoya”] スペースで単語の分割可能
  • 日本語:”私は名古屋に住んでいます” -> どうやって分割するのか?

形態素解析を行うためのライブラリは複数ありますが、本稿ではMecabを利用し、その辞書にはデフォルトの辞書ではなく、NEologdと呼ばれる辞書を利用します。

NEologdを使うメリットは、通常の辞書よりも固有名詞を抜き出せるという点が挙げられます。実際に、NEologdのGithubを参考にデフォルト辞書との違いを比較してみます。

「10日放送の「中居正広のミになる図書館」(テレビ朝日系)で、SMAP中居正広が〜」という文章に対して、形態素解析を行うと、以下のような結果が得られます。

デフォルトの辞書 f:id:mishimanatsuki:20180717094834p:plain

NEolod f:id:mishimanatsuki:20180717094841p:plain

デフォルト辞書では番組名や個人名等が分割されてしまっていますが、NEologdを利用した場合では、番組名や個人名を固有名詞として抽出できていることが確認できます。

日本語の文章では文法上の問題で、助詞(「は」、「の」、「が」など)などの一部の品詞が頻繁に出現します。そのため、これらの品詞を無視して、文章の意味を構成している単語に注目できるようにするために、「名詞」、「動詞」、「形容詞」などのような重要な意味を有する品詞以外は削除するのが一般的です。

ストップワード

また、ストップワードと呼ばれる単語を取り除く処理が重要になります。
英語の場合のストップワードはa, theなどのような必然的に出現回数が多くなる単語などが該当します。英語などの主要な言語については、NLTK(Natural Language Toolkit)が提供しているストップワードリストを利用するのが一般的です。

しかし、NLTKは日本語のストップワードリストを提供していないため、デファクトスタンダードと言える日本語のストップワードが存在しないという問題があります。そのため、日本語の場合は自身でストップワードリストの用意をする必要があります。日本語のストップワードの具体例としては、「する」、「れる」、「ある」などのほとんど意味をなさないにも関わらず、文章中に頻繁に出現する単語が挙げられます。

ここまでの処理を実行することで、文章を単語で区切られたリストに変換することができます。ですが、このままではコンピュータが演算を行うことができないため、リストに含まれている各単語をone-hotベクトルと呼ばれる形式に変換します。

one-hotベクトル

単語にユニークなインデックスを与え、単語をそのインデックスの要素が1それ以外の要素を0とするベクトルに変換します。このベクトルの次元数は出現する単語の種類数になります。 f:id:mishimanatsuki:20180717094849p:plain

このように、日本語のテキスト分析は英語などの言語のテキスト分析と比べると前処理が少し複雑になっていますが、この一連の前処理を行うことで英語などの言語と同様に、後述するWord2vecなどを利用したテキスト分析を行うことができるようになります。

Word2vec

ここからは、Word2vecについてご紹介します。
Word2vecとは文章中の単語を任意の次元のベクトルに変換し、単語同士の演算や単語の類似度の導出を可能にします。(Word2vecを実装する際には、Pythonのライブラリgensimを利用するのがおすすめです。)

単語同士の演算で最も有名なものは、以下の式で表されます。

「王」 - 「男性」 + 「女性」 = 「女王」

これは、「王」のベクトルから「男性」のベクトルを引き、「女性」のベクトルを足し合わせたベクトルと最も近いベクトルを持つ単語が「女王」であるというものです。

このように、Word2vecを利用することで今までにはできなかった様々な分析が可能になります。

Word2vec:単語のベクトル化

Word2vecでは、文章中の単語とその周辺単語に注目をして、NN(ニューラルネットワーク)の学習を行います。このNNの重み行列として単語ベクトルが学習されます。 f:id:mishimanatsuki:20180717094904p:plain

次にWord2vecの2種類のアルゴリズムを紹介します。
ここでは、注目している単語を単語:X、その周辺単語を単語:A~Dとします。また、ベクトルの次元は次元:n、出現する単語の種類数を個数:mとします。

CBoW

周辺の単語を入力として、各単語の出現確率が出力になります。ターゲットとなっている単語の出現確率が最大となるように学習を行います。 f:id:mishimanatsuki:20180717094818p:plain

Skip-gram

ターゲットとなっている単語が入力データで、各単語の出現確率が出力になります。周辺の単語の出現確率の和が最大となるように学習を行います。 f:id:mishimanatsuki:20180717094855p:plain

Skip-gramを利用する場合を例として、Word2vecの原理について詳しく見ていきましょう。
Skip-gramの場合、入力はone-hotベクトルで表現された一つの単語のみ、つまり、m次元のベクトルとなります。出力も同様にm次元のベクトルであり、one-hotベクトルにおいて周辺単語が相当する要素の確率の和が最大になるように学習を行います。

次は、NNの重み行列に注目したいと思います。この重み行列の大きさはn×mであり、各行成分が各単語のベクトルに相当します。これは、入力が一つの要素の値が1で、それ以外の要素の値が0である、m次元のベクトルであることに基づいています。

f:id:mishimanatsuki:20180717094843p:plain

最後に

今回の記事でご紹介したように、テキスト分析は比較的簡単に実装することができます。
この記事を通して、テキスト分析に興味を持っている方々や、これからやってみようと思っている方々に、テキスト分析の基本的な知識を学んでいただき、実際に挑戦していただければ幸いです。

ここまで読んでいただきありがとうございます!

参考

NEologd
https://github.com/neologd/mecab-ipadic-neologd/
gensim
https://radimrehurek.com/gensim/