いまさら聞けないHadoopとテキストマイニング入門



このように、大量のデータを解析し、有用な情報を生み出すことでサービスに活用することは、Hadoopの十八番であり、醍醐味(だいごみ)といえると思います。

そうした処理は、データマイニングなどと呼ばれますが、その中でも、Webページ(の本文)など、人間が書いた構造化されていないテキストを解析する「テキストマイニング」に焦点を当てて解説していきたいと思います。

未構造化テキストを解析する「テキストマイニング」


テキストマイニングとは、大量のテキストから、有用な情報や知識を発見することです。

例えば、数十件程度のテキストなら、人間の目で見て何らかの傾向が分かるかもしれませんが、100万件となると人間がすべて見るのは不可能です。しかし、テキストマイニングを使えば、コンピュータが大量のテキストからパターンや、関連、傾向などを分析し、それをさまざまな形で活用できます。

例えば、Yahoo!ブログ検索で、「キーワードの評判」という機能があります。

これは、検索したキーワードについて、評判や評価の表現をしていると思われる記事を抽出して解析し、キーワードがポジティブな評判が多いか、ネガティブな評判が多いかを表示しています。これは、テキストマイニングの典型的な例と言えるでしょう。

この例のようにWebからは大量のテキストデータが入手できるので、特にWebを対象としたテキストマイニングの重要性は増してきています。


構造化されていないテキストを構造化する「前処理」


データマイニングとは違い、テキストマイニングでは、人間が書いた構造化されていないテキストを対象としています。そのため、テキストマイニングでは、テキストを構造化された中間表現に変換する前処理が必要です。

前処理では、

文字列を単語に切り分ける、

単語列に文としての構造を付与する、

構造を意味に結び付けること

等が必要になる。

これらの処理は、「自然言語処理」と呼ばれる分野の知識が必要になります。

これらはsubstr, strsplit, sapplyなどが必要になるな。

前処理の中でも最もよく行われる形態素解析について見ていきましょう。

日本語の文字列を単語ごとに切り分ける「形態素解析」



日本語の文字列を単語ごとに切り分ける処理のことを形態素解析と言います。日本語は英語のように単語間に区切りがないので、品詞ごとに区切ることになります。

例えば、「男の中の男だね」という文は以下のような品詞に区切られます。

品詞とは、名詞や動詞など単語の機能のこと。

形態素解析を行うソフトウェアは、Mecab」などオープンソースのものがたくさん存在し、Yahoo!JAPANでもWeb APIとして提供しています。

ベクトル化


形態素解析で、文字列を単語ごとに切り分けられましたが、この単語列をテキストマイニングで扱いやすいように構造化する必要があります。そこで、テキストをベクトルで表することを考えてみます。

ベクトル化できれば、例えば簡単にベクトル同士の近さを計算でき、テキストマイニングで扱いやすくなります。それぞれの単語がそのテキストでどの程度重要かを重み付けし、ベクトルで表してみましょう。

例えば、名詞の単語を抽出し、その単語のテキストでの頻度をベクトル化してみます。「男の中の男の中でも特に男臭い男は男の中の男の中の男となる」というテキストは、以下のようにベクトル化されます。

(男, 中) = (6, 4)



このようなベクトル化の方法は、「bag-of-words」と呼ばれます。単語の順番や、文の構造は無視して、単語の種類だけでテキストを表現するのが特徴です。

マイニング処理


前処理で、テキストを構造化された中間表現に変換できたので、いよいよマイニング処理に入ります。

マイニング処理では、相関関係を調べたり、繰り返し現れるパターンを発見したり、何らかの情報を抽出したり、目的によってさまざまな処理を行います。例えば、先ほどのYahoo!ブログ検索の「キーワードの評判」の例では、テキストから「かっこいい」「大嫌い」など、評判や評価に関する表現を抽出します。

このようにマイニング処理にもさまざまな種類がありますが、本連載ではその中でも「テキスト分類」を取り上げ、解説していきます。