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

ヤフー株式会社
吉田一星
2011/6/21

Hadoopとは何かを解説し、実際にHadoopを使って大規模データを対象にしたテキストマイニングを行います。テキストマイニングを行うサンプルプログラムの作成を通じて、Hadoopの使い方や、どのように活用できるのかを解説します

ビッグデータ時代の救世主「Hadoop」とは

 「Apache Hadoop」は今、最も注目を集めている技術の1つです。Hadoopとは、大量のデータを手軽に複数のマシンに分散して処理できるオープンソースのプラットフォームです。

 Hadoopを活用している企業は年々増え続けていて、不可欠な技術になりつつあるといえるでしょう。

http://hadoop.apache.org/

Welcome to Apache Hadoop! via kwout

 本連載では、Hadoopとは何か、Hadoopがどう活用できるのかということを、「テキストマイニング」に焦点を当てて解説していきたいと思います。

重い処理を複数のマシンに分散させる

 複数のマシンに処理を分散させるには、プロセス同士の通信、監視、障害時の対応などを考えなければならず、プログラマにとってハードルが高いものです。しかし、Hadoopはそういった面倒くさい処理を一手に引き受けてくれ、プログラマは、やりたい処理だけに集中できます。

 例えば、Hadoopを使うと、1台で数日かかっていたような重い処理を、複数のマシンに分散させることで、数時間で終わらせる、といったことも可能になります。

Hadoopを構成する「MapReduce」「HDFS」

 Hadoopは、大きく分けてMapReduceHDFSで構成されています。

 MapReduceとは、Hadoopで処理を記述するプログラミングモデルで、シンプルながら、さまざまな処理に柔軟に対応できます。

 HDFSは、MapReduceで処理するデータを扱う分散ストレージで、複数のマシンを1つのストレージとして、扱えます。

 一部のマシンが故障しても、データが失われないように設計されていて、データ量に応じてスケールアウトすることが可能です。

 では、MapReduceについて、例を挙げて詳しく説明していきます。

分散処理のためのプログラミングモデル「MapReduce」

 MapReduceは、「Map」「Shuffle」「Reduce」の3つのフェイズに分かれます。ユーザーは、Mapフェイズ、Reduceフェイズで繰り返し呼び出される、map関数、reduce関数に行いたい処理を記述します。Shuffleフェイズは内部で自動的に行われます。

 例えば、あるテキストの中で出現する単語をカウントする処理を考えてみましょう。「THE END OF MONEY IS THE END OF LOVE」というテキストがあったとすると、各単語の出現数は、以下になります。

 これをMapReduceで処理してみます。

Key、Valueのペアを作る「Map」

 Mapは、「THE END OF MONEY IS THE END OF LOVE」というテキストを入力として読み込みます。そして、それぞれの単語に「1」という値を割り当てます。

 MapReduceのデータは、KeyとValueのペアで表されます。Key、Valueのペアを<Key,Value>と表せば、Map処理は、入力テキストから次のような<Key,Value>を作り出すことです。

同じKeyを持つペアを束ねる「Shuffle」

 Mapの出力をキー順にソートし、同じKeyを持つペアを束ねるのがShuffleです。キー順にソートすることにより、同じKeyを持つペア同士が隣り合います。そして、隣り合った同じKeyを持つペアは、束ねられます。

 Shuffleは、MapからReduceにデータを渡す際に自動的に行われます。

  • 入力
  • キー順にソート
  • 同じKeyを束ねる

Shuffleの結果を入力として処理を行う「Reduce」

 Shuffleの結果を入力として処理を行います。WordCountでは、同じKeyのValueを足し合わせます。

  • 入力
  • Reduce後

 このように各単語の出現数がカウントされて出力されるわけです。

 次ページでは、Hadoopの活用方法を具体的に見ていき、テキストマイニングについて解説します。

Hadoopは、どのような場面で活用できるのか?

 Hadoopの強みは、MapReduceを使って、数時間以上かかるようなバッチ処理を複数マシンに分散して、高速化できることです。つまり、1台だと少なくとも数時間以上かかるような、大量のデータを読み込んで解析する処理、大量の計算が必要な処理に向いているということになります。

 例えば、Yahoo! JAPANでは、検索をする際のクエリなどのログ解析にHadoopを使用しています。

 検索ログを解析することで、検索クエリに関連するワードを表示する「関連検索ワード」や、検索窓に一部の文字を入力するだけでキーワードが補完される「キーワード入力補助」、検索クエリに関連するYahoo! JAPANのサービスの情報を表示する「ショートカット」の表示制御などの機能を実現しています。

 また、解析した結果を基に「Yahoo!検索ランキング」というサービスを提供していて、検索総数ランキングや急上昇ワードランキングなどを実現しています。

 レコメンデーションの計算にもHadoopを使用しています。例えば、Yahoo!オークションのおすすめアイテムを表示する機能などに活用されています。

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

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

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

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

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

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

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

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

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

 前処理では、文字列を単語に切り分けたり、単語列に文としての構造を付与したり、構造を意味に結び付けたりする必要がありますが、これらの処理は、「自然言語処理」と呼ばれる分野の知識が必要になります。

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

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

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

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

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

http://developer.yahoo.co.jp/webapi/jlp/ma/v1/parse.html

Yahoo!デベロッパーネットワーク – テキスト解析 – 日本語形態素解析 via kwout

ベクトル化

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

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

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

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

マイニング処理

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

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

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

テキストを自動的に分類する「テキスト分類」

 テキスト分類は、テキストを何らかのカテゴリに自動的に分類する処理です。例えば、新聞記事を内容に応じて、「政治」「経済」「社会」「スポーツ」などのカテゴリに分類します。

 テキスト分類は、さまざまな処理に応用されています。例えば、メールのスパムフィルタリング処理は、メールを「スパム」「スパムでない」の2つのカテゴリに分類する、テキスト分類処理です。

 他にも、テキストの言語判定、テキストがアダルトかそうでないかのフィルタリング、テキストの著者判定、テキストの著者の属性推定などがあります。テキストの著者の属性推定は、テキストの著者の性別、年齢、地域、職業などを推定する処理です。

 テキスト分類には、機械学習の手法を用いることが多いのですが、詳しい処理内容については次回以降に解説することにします。

 次ページでは、本稿の最後にHadoopのセットアップ方法について簡単に解説します。

Hadoopを使うためのセットアップ

 手元のマシンで手軽に試してみたいという用途ならば、セットアップ済みのVMwareのイメージが公開されていて便利ですので、こちらの使用方法を解説します。

 ただ、本格的に使用するには、複数台のUNIX環境のサーバを用意することをお勧めします。

 UNIX環境をお持ちの方は、Hadoopのオフィシャルページなどを見てセットアップしてください。オフィシャルページの日本語訳もあります。

 また、「Cloudera’s Distribution for Hadoop」を利用すると、apt-getyumなどのコマンドでインストールができ、より簡単にセットアップすできます。Web上にCloudera’s Distribution for Hadoopのセットアップ方法の日本語記事が多数見つかりますので、そちらを参照してください。

https://ccp.cloudera.com/display/DOC/Documentation

Documentation – Cloudera Support via kwout

 サーバを用意できないという方は、「Amazon Elastic MapReduce」というサービスの使用がおすすめです。これは、Amazonの仮想サーバでHadoopの処理を行えるサービスで、Hadoopのセットアップの手間がほとんど要りません。100台を1時間程度使用しても、大体1000円程度で使えます。

http://aws.amazon.com/jp/elasticmapreduce/

Amazon Elastic MapReduce via kwout

 まずは、手元のVMWare上で小さいデータでテストして、Amazon Elastic MapReduceで、大規模なデータを解析するという使い方がよいでしょう。

Windows用のHadoop VMをセットアップ

 Windows環境を対象に、Yahoo!から配布されている「Hadoop 0.20.S Virtual Machine」をセットアップする手順を説明します。

Yahoo! Cloud Virtual Machine Appliance - Yahoo! Hadoop Blog

  1. VMWare Player」をインストール
  2. Hadoop 0.20.S Virtual Machine」をダウンロード
  3. ダウンロードしたファイルを解凍し、hadoop-appliance-0.20.S.vmxをダブルクリック
  4. 「移動しました」「コピーしました」という選択画面が現れるので,「コピーしました」を選択

 起動すると、以下のようにHadoop VMに関する情報が表示されます。

 VirtualMachineには、rootとhadoop-userというアカウントが設定されていて、パスワードは、それぞれroot、hadoopです。hadoop-userでログインしてください。

 なお、起動画面の、「IP Address of this Virtual Machine: 」と表示されているアドレスにPuTTYなどのSSHクライアント経由で接続すると、より便利です。

 すでにHadoopは起動された状態ですので、円周率を計算するサンプルを実行してみます。セキュリティ対応のHadoopなので、kinitでパスワードを入力してから実行します。パスワードは、hadoopYahoo1234です。

 実行すると以下のような円周率が計算されると思います。

 なお、Cloudera’s Distribution for HadoopでもVMWare用のイメージが公開されています。

次回は、テキストマイニングプログラミング開始!

 今回は、Hadoopとテキストマイニングの概要と、Hadoopのセットアップ方法について解説しましたが、いかがでしたでしょうか。

 次回はいよいよ、テキストマイニングのMapReduceプログラムの作成に入っていきたいと思いますので、お楽しみに。