今さら聞けない Hadoop 勉強会   第2回
      アルゴリズム編


             セントラルソフト株式会社
           システム1部 システム開発課
                    奥山 洋平

1
本勉強会の目的




2
本セミナーの目的
   Hadoop に関連する技術や培ったノウハウを、勉強会に参加された方
    と
    共有する                    SlideShare で公開
                                   「今さら聞けないhadoop セントラ
                                     ルソフト」で見つかります
   スケジュール
       第1回 Hadoop 基礎(1月19日開催)
           HDFS と MapReduce の概念
           ロールプレイ
       第2回 アルゴリズム(本日2月28日開催)
           k-means アルゴリズム
           TF-IDF アルゴリズム
       第3回 「MapReduce 実装テクニック」を予定(3月予定)
           ワードカウント
           k-means
           TF-IDF
       第4回 「理論・エコシステム編」を予定(4月予定)
           HDFS
           HBase
           Hive
    3
本日の目的
   2つのアルゴリズムを通してアルゴリズムからジョブ
    フローにする流れを知ってもらう

         今回   アルゴリズム


              ジョブフロー

         次回予定
          MapReduce プログラム

    4
目次
       k-means アルゴリズム
           アルゴリズムからジョブフローへ


       TF-IDF アルゴリズム
           アルゴリズムからジョブフローへ


       まとめと次回の予定




    5
k-means アルゴリズム
k-means アルゴリズムとは
   レコードの集合を k 個のよく似た特徴を持つ集合
    (クラスタ)に分割(クラスタリング)するアルゴリ
    ズム

   k = 2 の例   クラスタ    レコード




    7
クラスタリングの活用例
       機械学習
           手書き文字認識
                                 この数字は
                                  「9」

                 この数字は
                   何?
                                  9のクラス
                         7のクラス    タ
                         タ




       特徴抽出
           「7」と「9」の分類に必要な特徴は?

    8
k-means アルゴリズム概要
       k-menas アルゴリズムは「クラスタの割り当て」と
        「クラスタの重心を求める」という処理を繰り返し、
        最適な重心を求めるアルゴリズム




    9
k-means アルゴリズムの手順(1)
1.       初期化
        各レコードに対して、ランダムにクラスタを割り当てる


2.       割り当てたクラスタの重心を求める

3.       各レコードを、各クラスタの重心に一番近いクラスタ
         に
         割り当て直す

4.       クラスタの割り当て変化がある
                              終了
         2 の処理
         クラスタの割り当てに変化が無い
         10
         予め決めた回数クラスタの割り当てを行った
k-means アルゴリズムの手順(2)
k=3
           3. クラスタの再割り当て
           1. 初期化(ランダムにクラスタを割り当てる)
           2. クラスタの重心を求める
            ⇒ クラスタの割り当てが変化したので
              クラスタの割り当てが変化しなかったので
               2 の処理へ
               処理終了




11
アルゴリズムからジョブフローへ




12
ジョブフローを作る際に意識すること
    MapReduce は分散処理なので、複雑な処理はでき
     ない
        複雑な処理は複数回の MapReduce で実現する
        本勉強会の説明では1回の MapReduce を1ジョブとす
         る
        1ジョブの処理はシンプルにする       複雑な処理

                               ジョブ
                                2
         複雑な             ジョブ         ジョブ
          処理              1           4
                               ジョブ
                                3


    13
k-means アルゴリズム
1.       初期化
        各レコードに対して、ランダムにクラスタを割り当てる


2.       割り当てたクラスタの重心を求める

3.       各レコードを、各クラスタの重心に一番近いクラスタ
         に
         割り当て直す

4.       クラスタの割り当て変化がある
                              終了
         2 の処理
         クラスタの割り当てに変化が無い
         14
         予め決めた回数クラスタの割り当てを行った
処理の流れ
処理1:初期化
処理2:割り当てたクラスタの重心を求める
処理3:各レコードを、各クラスタの重心に一番近いクラ
  スタに    割り当て直す
                  レコー
                  ド集合
                              :入力

                              :出力
開始    処理1   処理2   処理3   終了
                              :フロー

                              :終了時
入力                      出力     処理3の
      処理1   処理2   処理3          結果が
ファイ                     ファイ
       結果    結果    結果
 ル                       ル     最終出力

15
MapReduce にできるか検討
    それぞれの処理が1回の MapReduce で実現できそ
     うか
     検討し、必要に応じて複数回のジョブで処理を実現
     する




    16
MapReduce の簡単な復習
    MapReduce は以下の3つのフェーズで構成される
        入力データの加工を行う「Map」
        データの整理と分配を行う「Shuffle & Sort」
            同じ key に対する value は一纏めにし、key 順にソートした
             データを Reduce を行うノードが受け取る
        まとめられたデータに対して処理を行う「Reduce」


    それぞれのフェーズの入出力は key と value のペア




    17
処理1概要
    処理
        各レコードに対して、ランダムにクラスタを割り当てる


    入力(クラスタリングするデータファイル)
        key     : 入力ファイルの形式による
        value   : 1レコード


    出力(ランダムにクラスタを割り当てられたレコー
     ド)
        key     : 割り当てられたクラスタ番号
        value   : 1レコード

    18
処理1検討

     <入力形式によって異なるkey , 1レコード>

                    入力

                                乱数
              処理1

       1回の MapReduce で実現できそう
     <ランダムに割り当てたクラスタ , 1レコード>


                    出力




19
処理2概要
    処理
        割り当てられたクラスタの重心を求める


    入力(ランダムにクラスタを割り当てられたレコー
     ド)
        key     : クラスタ番号
        value   : 1レコード


    出力(クラスタの重心)
        key     : クラスタ番号
        value   : クラスタの重心の位置

    20
処理2検討

     <クラスタ1, A><クラスタ2, B>
                        <クラスタ1, C>

                         Map 出力


     Shuffle & Sort で同じクラスタは一纏まりになり、
                     Shuffle & Sort
       その纏まりでクラスタの重心が計算できる

      <クラスタ1, [A , C]> <クラスタ2, [B]>
        1回の MapReduce で実現できそう

                         Reduce 入力




21
処理3概要
    処理
        各レコードを、一番近いクラスタに割り当て直す

    入力1(クラスタの重心)
        key          : クラスタ番号
        value   : クラスタの重心の位置
    入力2(クラスタリングするデータファイル)
        key          : <要検討>
        value   : 1レコード


    出力(クラスタを割り当て直したレコード)
        key          : 割り当てたクラスタ
        value   : 1レコード

    22
処理3検討
    問題となりそうなところ
        2つの形式のデータの入力はどうする?

        クラスタの重心のデータはすべての Reduce を行うノー
         ドに
         配布する必要があるがどうする?
            すべてに配布しないと各レコードがどのクラスタに近いのか
             比較できない
               実現方法を知っていれば1回の MapReduce で
                知らなければ MapReduce の回数を増やす


             次回、1回の MapReduce で実現する方法を解説
                          予定

    23
その他次回解説を行う問題
    <要検討>にしてあった部分

    処理3の終了後、条件によって処理を終了するか、
     処理2の処理に戻るか分岐する問題



    MapReduce の実装レベルの内容は次回行う(予
     定)




    24
TF-IDF アルゴリズム




25
TF-IDF アルゴリズムとは
    文書中の単語に関する重み付けのアルゴリズム
        その単語がその文書でどれくらい特徴的であるかを
         単語ごと文書ごとに数値化(tfidf 値)
            出てくる文書が少なく、特定の文書での出現回数が多い単語ほ
             ど
             その文書での数値が大きい
            キーワード抽出や Web 検索へ応用できる


    例:ある文書中の tfidf 値
                             “Hadoop”   : 0.3
                  文書         “HDFS”     : 0.6
                             “MapReduce”        : 0.5


    26                             …
tfidf 値の意味(1)
    異なる文書の同じ単語の場合
        単語の tfidf 値が高い文書ほど、その単語を特徴として持
         つ文書
                 その単語がよく表れる文書                   文書のキーワード
             検索


             文書A              文書B                    文書C




         “Hadoop” : 0.3    “Hadoop” : 0.5         “Hadoop” : 0.2


                   “Hadoop” の検索結果は上位から      文書B , A , C

    27
tfidf 値の意味(2)
   一つの文書内の単語の場合
        特定の文書中で tfidf 値が高い単語が、その文書を特徴付け
         る
               文書のインデックス作成             文書のキーワード検索
             の高速化
                         tfidf 値            インデックス
                     “Hadoop”   : 0.3
                     “HDFS”     : 0.6         “HDFS”
             文書A
                     “Java”     : 0.2         “MapReduce”
                     “MapReduce”        : 0.5 “Hadoop”
                     “Ruby”             : 0.1
                           …




    28
TF-IDF アルゴリズム(tfidf 値の求め方)(1)
    tfidf 値は、単語の出現頻度(tf : term frequency)と
     逆文書頻度(idf : inverse document frequency)の積で求め
     られる
         tfidf   単語の出現頻度 * 逆文書頻度

    単語の出現頻度(tf)は以下の式で求められる
                      文書中の単語の出現回 数
         単語の出現頻度
                       文書中の単語の総数
    逆文書頻度(idf)は以下の式で求められる(この式は
     ジップの法則に由来する)
                             文書数
         逆文書頻度     log10
                         単語が出現した文書数

    29
TF-IDF アルゴリズム(tfidf 値の求め方)(2)
             文書1                     文書2                    文書3

      A          tf:0.5
                 0.2385           単語の出現頻度 * 逆文書頻度
      A                      文書中の単語の出現回数 / 文書中の単語の総数
                                       0.5 * 0.477
     idf:0.477                                    2/4
                           log10(文書数/単語が出現した文書数)
                 tf:0.25               log10(3 / 1)
                                        tf:0.33
      B          0.044             B単語ごとに共通の値
                                        0.05808
     idf:0.176
      C          tf:0.25
                                 C     tf:0.33          C    tf:0.25
     idf:0       0                     0                     0


                                 D     tf:0.33          D    tf:0.5
                                       0.05808               0.088
     idf:0.17                                           D
     6                                                       tf:0.25
                                                        E    0.11925
     idf:0.47
30   7
アルゴリズムからジョブフローへ




31
k-means アルゴリズムとの違い
    k-means はアルゴリズムの中でフローが決まってい
     た

    TF-IDF は計算式だけでフローが無いので、どのよう
     な順番で処理を行うのか考えなければならない




    32
ジョブフローを作る際に意識すること(再掲)
    MapReduce は分散処理なので、複雑な処理はでき
     ない
        複雑な処理は複数回の MapReduce で実現する
        ここでは1回の MapReduce を1ジョブとする
        1ジョブの処理はシンプルにする
                               複雑な処理

                                ジョブ
                                 2
         複雑な             ジョブ           ジョブ
          処理              1             4
                                ジョブ
                                 3


    33
MapReduce の簡単な復習(再掲)
    MapReduce は以下の3つのフェーズで構成される
        入力データの加工を行う「Map」
        データの整理と分配を行う「Shuffle & Sort」
            同じ key に対する value は一纏めにし、key 順にソートした
             データを Reduce を行うノードが受け取る
        まとめられたデータに対して処理を行う「Reduce」


    それぞれのフェーズの入出力は key と value のペア




    34
アルゴリズムからジョブフローへの流れ
1.    大まかな処理に分ける
2.    処理の入出力を考える
3.    データを Reduce からの参照のされ方で分ける
     1.   全ての Reduce
     2.   全てではないが複数の Reduce
     3.   一つの Reduce
4.    処理ごとに簡単な MapReduce で実現できるか検討
      し、
      必要に応じてジョブを増やす



 35
1.大まかな処理に分ける
    必要なものを考え、大まかな処理に分ける

                     文書中の単語の出現回数を求める


                     文書中の単語の総数を求める
              式に代入
    tfidf 値   して計算
                        文書数を求める

                      単語が出現した文書数を求め
                            る

文書中の単語の出現回 数             文書数
             * log10
 文書中の単語の総数           単語が出現した文書数

    36
2.処理の入出力を考える(1)
     どのような key と value のペアを出力するか考える

     「式に代入して計算」の処理の場合
                              Hadoop    : 0.3
            文書A               HDFS      : 0.6
                              MapReduce : 0.5




                                    …
   key は
文書名と単語のペ
                                                value は
     ア
                                                 tfidf 値

           文書 A の Hadoop      の     値: 0.3
           文書 A の HDFS        の     値: 0.6
           文書 A の MapReduce   の     値: 0.5
     37
2.処理の入出力を考える(2)
    同様にして考えると以下の表のようになる


               処理            key     value
            式に代入して計算       文書名/単語    tfidf 値


         文書中の単語の出現回数を求める   文書名/単語    出現回数
          文書中の単語の総数を求める     文書名     単語の総数
             文書数を求める       <要検討>     文書数
         単語が出現した文書数を求める     単語      出現した文書
                                       数




    38
2.処理の入出力を考える(3)
    入力ファイルから文書名を取得する必要があるので、
     今回の入力ファイルは説明を簡単にするため以下の
     フォーマットを用いる

                    入力ファイル

         タイトル名1@バイトオフセット     文章
         タイトル名1@バイトオフセット     文章
         タイトル名1@バイトオフセット     文章
         タイトル名1@バイトオフセット     文章
         タイトル名2@バイトオフセット     文章
         タイトル名2@バイトオフセット     文章
         タイトル名2@バイトオフセット     文章
                …




    39
3.データを Reduce からの参照のされ方で分ける(1)
  「式に代入して計算」の処理の入力を考える
                     全体で共通の値

  以下は計算式と必要な値を求める処理の出力
各文書で共通の値 全て異なる値
                                        各単語で共通の
                                           値
         文書中の単語の出現回 数             文書数
                      * log10
          文書中の単語の総数           単語が出現した文書数

                処理           key     value
         文書中の単語の出現回数を求める   文書名/単語    出現回数
          文書中の単語の総数を求める     文書名     単語の総数
             文書数を求める       <要検討>     文書数
         単語が出現した文書数を求める     単語      出現した文書
                                       数

    40
3.データを Reduce からの参照のされ方で分ける(2)
    全体で共通の値
        k-means のクラスタの中心データの配布と同じ方法を使
         う

    部分的に共通の値
        ジョブ(MapReduce)を追加して全て異なる値と一緒に
         扱う
            全体で共通の値と同じ手法を使わない理由は次回




    41
ここまでで構築した処理の流れ

       文書数を求め            式に代入
          る              して計算


 入力    文書中の単語の                    出力
ファイ   出現回数を求める                   ファイル
  ル              値をまとめ   値をまとめ    (tfidf
                   る1      る2     値)
      単語が出現した
      文書数を求める


      文書中の単語の
       総数を求める


 42
4.簡単な MapReduce で実現できるか検討




43
「文書数を求める」検討
    入力ファイルから簡単な MapReduce で文書数を求
     めることはできない

    先に「文書のリスト作成」のジョブを作成してから
     だと、ワードカウントと同様にして文書数が求めら
     れる
                         文書数を求める
     文書数を求め       文書名の
       る                      文書名を数える
                 リスト作成




    44
「文書中の単語の出現回数を求める」検討
    入力から文書名と単語のペアを key にすれば、
     ワードカウントと同様にして文書中の単語の出現回
     数が求められる




    45
「単語が出現した文書数を求める」検討
    入力ファイルから簡単な MapReduce で単語が出現
     した文書数を求めることはできない

    先に「文書で出現した単語のリスト」を作成しして
     からだと、ワードカウントと同様にして単語が出現
     した文書数が求められる
                   単語が出現した文書数を求める
     単語が出現し
     た文書数を求                  リストから
                文書で出現した
       める                   単語が出現した
                 単語のリスト
                            文書数を求める




    46
「文書中の単語の総数を求める」検討
    文書名を key にすれば、ワードカウントと同様にし
     て
     文書中の単語の総数が求められる




    47
ジョブフロー

         文書数を求める
       文書名の     文書名を数                式に代入
       リスト作成     える                  して計算


        文書中の単語の                               出力
 入力     出現回数を求める
ファイ                                          ファイル
 ル                           値をまとめ   値をまとめ    (tfidf
        単語が出現した文書数を求める        る1      る2      値)

       文書で出現し       リストから
         た         単語が出現した
       単語のリスト      文書数を求める


       文書中の単語の
        総数を求める




  48
まとめと次回の予定




49
まとめ
    アルゴリズムからジョブフローにする手順
     1.        大まかな処理に分ける
     2.        処理の入出力を考える
     3.        データを Reduce からの参照のされ方で分ける
          1.    全ての Reduce
          2.    全てではないが複数の Reduce
          3.    一つの Reduce
     4.        処理ごとに簡単な MapReduce で実現できるか検討し、
               必要に応じてジョブを増やす




    50
次回の予定
   MapReduce プログラミング基礎とプログラミングテ
    クニック
        ワードカウント
        k-means
        TF-IDF




    51

今さら聞けないHadoop勉強会第2回 セントラルソフト株式会社(20120228)

  • 1.
    今さら聞けない Hadoop 勉強会 第2回 アルゴリズム編 セントラルソフト株式会社 システム1部 システム開発課 奥山 洋平 1
  • 2.
  • 3.
    本セミナーの目的  Hadoop に関連する技術や培ったノウハウを、勉強会に参加された方 と 共有する SlideShare で公開 「今さら聞けないhadoop セントラ ルソフト」で見つかります  スケジュール  第1回 Hadoop 基礎(1月19日開催)  HDFS と MapReduce の概念  ロールプレイ  第2回 アルゴリズム(本日2月28日開催)  k-means アルゴリズム  TF-IDF アルゴリズム  第3回 「MapReduce 実装テクニック」を予定(3月予定)  ワードカウント  k-means  TF-IDF  第4回 「理論・エコシステム編」を予定(4月予定)  HDFS  HBase  Hive 3
  • 4.
    本日の目的  2つのアルゴリズムを通してアルゴリズムからジョブ フローにする流れを知ってもらう 今回 アルゴリズム ジョブフロー 次回予定 MapReduce プログラム 4
  • 5.
    目次  k-means アルゴリズム  アルゴリズムからジョブフローへ  TF-IDF アルゴリズム  アルゴリズムからジョブフローへ  まとめと次回の予定 5
  • 6.
  • 7.
    k-means アルゴリズムとは  レコードの集合を k 個のよく似た特徴を持つ集合 (クラスタ)に分割(クラスタリング)するアルゴリ ズム  k = 2 の例 クラスタ レコード 7
  • 8.
    クラスタリングの活用例  機械学習  手書き文字認識 この数字は 「9」 この数字は 何? 9のクラス 7のクラス タ タ  特徴抽出  「7」と「9」の分類に必要な特徴は? 8
  • 9.
    k-means アルゴリズム概要  k-menas アルゴリズムは「クラスタの割り当て」と 「クラスタの重心を求める」という処理を繰り返し、 最適な重心を求めるアルゴリズム 9
  • 10.
    k-means アルゴリズムの手順(1) 1. 初期化  各レコードに対して、ランダムにクラスタを割り当てる 2. 割り当てたクラスタの重心を求める 3. 各レコードを、各クラスタの重心に一番近いクラスタ に 割り当て直す 4. クラスタの割り当て変化がある 終了 2 の処理 クラスタの割り当てに変化が無い 10 予め決めた回数クラスタの割り当てを行った
  • 11.
    k-means アルゴリズムの手順(2) k=3 3. クラスタの再割り当て 1. 初期化(ランダムにクラスタを割り当てる) 2. クラスタの重心を求める ⇒ クラスタの割り当てが変化したので クラスタの割り当てが変化しなかったので 2 の処理へ 処理終了 11
  • 12.
  • 13.
    ジョブフローを作る際に意識すること  MapReduce は分散処理なので、複雑な処理はでき ない  複雑な処理は複数回の MapReduce で実現する  本勉強会の説明では1回の MapReduce を1ジョブとす る  1ジョブの処理はシンプルにする 複雑な処理 ジョブ 2 複雑な ジョブ ジョブ 処理 1 4 ジョブ 3 13
  • 14.
    k-means アルゴリズム 1. 初期化  各レコードに対して、ランダムにクラスタを割り当てる 2. 割り当てたクラスタの重心を求める 3. 各レコードを、各クラスタの重心に一番近いクラスタ に 割り当て直す 4. クラスタの割り当て変化がある 終了 2 の処理 クラスタの割り当てに変化が無い 14 予め決めた回数クラスタの割り当てを行った
  • 15.
    処理の流れ 処理1:初期化 処理2:割り当てたクラスタの重心を求める 処理3:各レコードを、各クラスタの重心に一番近いクラ スタに 割り当て直す レコー ド集合 :入力 :出力 開始 処理1 処理2 処理3 終了 :フロー :終了時 入力 出力 処理3の 処理1 処理2 処理3 結果が ファイ ファイ 結果 結果 結果 ル ル 最終出力 15
  • 16.
    MapReduce にできるか検討  それぞれの処理が1回の MapReduce で実現できそ うか 検討し、必要に応じて複数回のジョブで処理を実現 する 16
  • 17.
    MapReduce の簡単な復習  MapReduce は以下の3つのフェーズで構成される  入力データの加工を行う「Map」  データの整理と分配を行う「Shuffle & Sort」  同じ key に対する value は一纏めにし、key 順にソートした データを Reduce を行うノードが受け取る  まとめられたデータに対して処理を行う「Reduce」  それぞれのフェーズの入出力は key と value のペア 17
  • 18.
    処理1概要  処理  各レコードに対して、ランダムにクラスタを割り当てる  入力(クラスタリングするデータファイル)  key : 入力ファイルの形式による  value : 1レコード  出力(ランダムにクラスタを割り当てられたレコー ド)  key : 割り当てられたクラスタ番号  value : 1レコード 18
  • 19.
    処理1検討 <入力形式によって異なるkey , 1レコード> 入力 乱数 処理1 1回の MapReduce で実現できそう <ランダムに割り当てたクラスタ , 1レコード> 出力 19
  • 20.
    処理2概要  処理  割り当てられたクラスタの重心を求める  入力(ランダムにクラスタを割り当てられたレコー ド)  key : クラスタ番号  value : 1レコード  出力(クラスタの重心)  key : クラスタ番号  value : クラスタの重心の位置 20
  • 21.
    処理2検討 <クラスタ1, A><クラスタ2, B> <クラスタ1, C> Map 出力 Shuffle & Sort で同じクラスタは一纏まりになり、 Shuffle & Sort その纏まりでクラスタの重心が計算できる <クラスタ1, [A , C]> <クラスタ2, [B]> 1回の MapReduce で実現できそう Reduce 入力 21
  • 22.
    処理3概要  処理  各レコードを、一番近いクラスタに割り当て直す  入力1(クラスタの重心)  key : クラスタ番号  value : クラスタの重心の位置  入力2(クラスタリングするデータファイル)  key : <要検討>  value : 1レコード  出力(クラスタを割り当て直したレコード)  key : 割り当てたクラスタ  value : 1レコード 22
  • 23.
    処理3検討  問題となりそうなところ  2つの形式のデータの入力はどうする?  クラスタの重心のデータはすべての Reduce を行うノー ドに 配布する必要があるがどうする?  すべてに配布しないと各レコードがどのクラスタに近いのか 比較できない 実現方法を知っていれば1回の MapReduce で 知らなければ MapReduce の回数を増やす 次回、1回の MapReduce で実現する方法を解説 予定 23
  • 24.
    その他次回解説を行う問題  <要検討>にしてあった部分  処理3の終了後、条件によって処理を終了するか、 処理2の処理に戻るか分岐する問題  MapReduce の実装レベルの内容は次回行う(予 定) 24
  • 25.
  • 26.
    TF-IDF アルゴリズムとは  文書中の単語に関する重み付けのアルゴリズム  その単語がその文書でどれくらい特徴的であるかを 単語ごと文書ごとに数値化(tfidf 値)  出てくる文書が少なく、特定の文書での出現回数が多い単語ほ ど その文書での数値が大きい  キーワード抽出や Web 検索へ応用できる  例:ある文書中の tfidf 値 “Hadoop” : 0.3 文書 “HDFS” : 0.6 “MapReduce” : 0.5 26 …
  • 27.
    tfidf 値の意味(1)  異なる文書の同じ単語の場合  単語の tfidf 値が高い文書ほど、その単語を特徴として持 つ文書  その単語がよく表れる文書 文書のキーワード 検索 文書A 文書B 文書C “Hadoop” : 0.3 “Hadoop” : 0.5 “Hadoop” : 0.2 “Hadoop” の検索結果は上位から 文書B , A , C 27
  • 28.
    tfidf 値の意味(2)  一つの文書内の単語の場合  特定の文書中で tfidf 値が高い単語が、その文書を特徴付け る  文書のインデックス作成 文書のキーワード検索 の高速化 tfidf 値 インデックス “Hadoop” : 0.3 “HDFS” : 0.6 “HDFS” 文書A “Java” : 0.2 “MapReduce” “MapReduce” : 0.5 “Hadoop” “Ruby” : 0.1 … 28
  • 29.
    TF-IDF アルゴリズム(tfidf 値の求め方)(1)  tfidf 値は、単語の出現頻度(tf : term frequency)と 逆文書頻度(idf : inverse document frequency)の積で求め られる tfidf 単語の出現頻度 * 逆文書頻度  単語の出現頻度(tf)は以下の式で求められる 文書中の単語の出現回 数 単語の出現頻度 文書中の単語の総数  逆文書頻度(idf)は以下の式で求められる(この式は ジップの法則に由来する) 文書数 逆文書頻度 log10 単語が出現した文書数 29
  • 30.
    TF-IDF アルゴリズム(tfidf 値の求め方)(2) 文書1 文書2 文書3 A tf:0.5 0.2385 単語の出現頻度 * 逆文書頻度 A 文書中の単語の出現回数 / 文書中の単語の総数 0.5 * 0.477 idf:0.477 2/4 log10(文書数/単語が出現した文書数) tf:0.25 log10(3 / 1) tf:0.33 B 0.044 B単語ごとに共通の値 0.05808 idf:0.176 C tf:0.25 C tf:0.33 C tf:0.25 idf:0 0 0 0 D tf:0.33 D tf:0.5 0.05808 0.088 idf:0.17 D 6 tf:0.25 E 0.11925 idf:0.47 30 7
  • 31.
  • 32.
    k-means アルゴリズムとの違い  k-means はアルゴリズムの中でフローが決まってい た  TF-IDF は計算式だけでフローが無いので、どのよう な順番で処理を行うのか考えなければならない 32
  • 33.
    ジョブフローを作る際に意識すること(再掲)  MapReduce は分散処理なので、複雑な処理はでき ない  複雑な処理は複数回の MapReduce で実現する  ここでは1回の MapReduce を1ジョブとする  1ジョブの処理はシンプルにする 複雑な処理 ジョブ 2 複雑な ジョブ ジョブ 処理 1 4 ジョブ 3 33
  • 34.
    MapReduce の簡単な復習(再掲)  MapReduce は以下の3つのフェーズで構成される  入力データの加工を行う「Map」  データの整理と分配を行う「Shuffle & Sort」  同じ key に対する value は一纏めにし、key 順にソートした データを Reduce を行うノードが受け取る  まとめられたデータに対して処理を行う「Reduce」  それぞれのフェーズの入出力は key と value のペア 34
  • 35.
    アルゴリズムからジョブフローへの流れ 1. 大まかな処理に分ける 2. 処理の入出力を考える 3. データを Reduce からの参照のされ方で分ける 1. 全ての Reduce 2. 全てではないが複数の Reduce 3. 一つの Reduce 4. 処理ごとに簡単な MapReduce で実現できるか検討 し、 必要に応じてジョブを増やす 35
  • 36.
    1.大まかな処理に分ける  必要なものを考え、大まかな処理に分ける 文書中の単語の出現回数を求める 文書中の単語の総数を求める 式に代入 tfidf 値 して計算 文書数を求める 単語が出現した文書数を求め る 文書中の単語の出現回 数 文書数 * log10 文書中の単語の総数 単語が出現した文書数 36
  • 37.
    2.処理の入出力を考える(1)  どのような key と value のペアを出力するか考える  「式に代入して計算」の処理の場合 Hadoop : 0.3 文書A HDFS : 0.6 MapReduce : 0.5 … key は 文書名と単語のペ value は ア tfidf 値 文書 A の Hadoop の 値: 0.3 文書 A の HDFS の 値: 0.6 文書 A の MapReduce の 値: 0.5 37
  • 38.
    2.処理の入出力を考える(2)  同様にして考えると以下の表のようになる 処理 key value 式に代入して計算 文書名/単語 tfidf 値 文書中の単語の出現回数を求める 文書名/単語 出現回数 文書中の単語の総数を求める 文書名 単語の総数 文書数を求める <要検討> 文書数 単語が出現した文書数を求める 単語 出現した文書 数 38
  • 39.
    2.処理の入出力を考える(3)  入力ファイルから文書名を取得する必要があるので、 今回の入力ファイルは説明を簡単にするため以下の フォーマットを用いる 入力ファイル タイトル名1@バイトオフセット 文章 タイトル名1@バイトオフセット 文章 タイトル名1@バイトオフセット 文章 タイトル名1@バイトオフセット 文章 タイトル名2@バイトオフセット 文章 タイトル名2@バイトオフセット 文章 タイトル名2@バイトオフセット 文章 … 39
  • 40.
    3.データを Reduce からの参照のされ方で分ける(1)  「式に代入して計算」の処理の入力を考える 全体で共通の値  以下は計算式と必要な値を求める処理の出力 各文書で共通の値 全て異なる値 各単語で共通の 値 文書中の単語の出現回 数 文書数 * log10 文書中の単語の総数 単語が出現した文書数 処理 key value 文書中の単語の出現回数を求める 文書名/単語 出現回数 文書中の単語の総数を求める 文書名 単語の総数 文書数を求める <要検討> 文書数 単語が出現した文書数を求める 単語 出現した文書 数 40
  • 41.
    3.データを Reduce からの参照のされ方で分ける(2)  全体で共通の値  k-means のクラスタの中心データの配布と同じ方法を使 う  部分的に共通の値  ジョブ(MapReduce)を追加して全て異なる値と一緒に 扱う  全体で共通の値と同じ手法を使わない理由は次回 41
  • 42.
    ここまでで構築した処理の流れ 文書数を求め 式に代入 る して計算 入力 文書中の単語の 出力 ファイ 出現回数を求める ファイル ル 値をまとめ 値をまとめ (tfidf る1 る2 値) 単語が出現した 文書数を求める 文書中の単語の 総数を求める 42
  • 43.
  • 44.
    「文書数を求める」検討  入力ファイルから簡単な MapReduce で文書数を求 めることはできない  先に「文書のリスト作成」のジョブを作成してから だと、ワードカウントと同様にして文書数が求めら れる 文書数を求める 文書数を求め 文書名の る 文書名を数える リスト作成 44
  • 45.
    「文書中の単語の出現回数を求める」検討  入力から文書名と単語のペアを key にすれば、 ワードカウントと同様にして文書中の単語の出現回 数が求められる 45
  • 46.
    「単語が出現した文書数を求める」検討  入力ファイルから簡単な MapReduce で単語が出現 した文書数を求めることはできない  先に「文書で出現した単語のリスト」を作成しして からだと、ワードカウントと同様にして単語が出現 した文書数が求められる 単語が出現した文書数を求める 単語が出現し た文書数を求 リストから 文書で出現した める 単語が出現した 単語のリスト 文書数を求める 46
  • 47.
    「文書中の単語の総数を求める」検討  文書名を key にすれば、ワードカウントと同様にし て 文書中の単語の総数が求められる 47
  • 48.
    ジョブフロー 文書数を求める 文書名の 文書名を数 式に代入 リスト作成 える して計算 文書中の単語の 出力 入力 出現回数を求める ファイ ファイル ル 値をまとめ 値をまとめ (tfidf 単語が出現した文書数を求める る1 る2 値) 文書で出現し リストから た 単語が出現した 単語のリスト 文書数を求める 文書中の単語の 総数を求める 48
  • 49.
  • 50.
    まとめ  アルゴリズムからジョブフローにする手順 1. 大まかな処理に分ける 2. 処理の入出力を考える 3. データを Reduce からの参照のされ方で分ける 1. 全ての Reduce 2. 全てではないが複数の Reduce 3. 一つの Reduce 4. 処理ごとに簡単な MapReduce で実現できるか検討し、 必要に応じてジョブを増やす 50
  • 51.
    次回の予定  MapReduce プログラミング基礎とプログラミングテ クニック  ワードカウント  k-means  TF-IDF 51