中年engineerの独り言 - crumbjp

LinuxとApacheの憂鬱

自然言語解析 in MONMO(後編)

一連の自然言語処理MONMOちゃん上で実現する試みの第3弾
前回はベクタライズまで行った。

今回は、形態素解析結果から、そのドキュメントの特徴を表す『ベクトル』を算出する、ベクタライズを行う。

k-means

非階層型のクラスタリング手法。
シンプルで軽量。
ある程度の分散処理も可能。

概要

初期値として、仮重心を複数与え、各ベクトルは一番近い重心に所属するものとし、それらの平均値を新たな重心とする。
これを繰り返す事で、仮重心は移動して行き、最終的に動かなくなる。それが本当の重心と言える。

但し、初期値として与える仮重心の個数や値ににより、結果が大きく変わる。



canopy

非常にシンプルで荒っぽいクラスタリング手法
分散処理は難しい。

k-meansの最大の問題である初期値の算出によく利用される。

概要

いわゆる碁石拾いである。
ベクトルをランダムに1つ選び、それを仮重心とする。さらに仮重心から半径(T2)以内のベクトルを削除する。
これをベクトルが無くなるまで繰り返す。
仮重心から半径(T1)以内のベクトルの平均値を算出し、それを重心とする。


monmo-NLProcessing/clusterize

clusterize
https://github.com/monmo/monmo-NLProcessing/blob/master/clusterize/README
流れ
  1. ベクトルをcanopyクラスタリングを掛ける。
  2. canopy結果を利用してkmeansクラスタリングを掛ける。

クラスタライズ準備

前々回の手順で完了している。
ディレクトリを移動するだけ

cd monmo-NLProcessing/clusterize
サンプルデータをクラスタリングする

  1.サンプルデータを投入(2500件のx,y座標データ)

mongoimport -d test -c samplevector --file ../sample/samplevectors2.json

  2.Canopy

./canopy.sh -s test.samplevector -f loc -2 20 -1 22

  3.仮重心を確認

./viewcluster.sh -s test.canopy.samplevector.cluster
====== 0 ( 608 ) ======
{ "id" : "y", "s" : -49.85003289473686 }
{ "id" : "x", "s" : -50.286003289473705 }
====== 1 ( 572 ) ======
{ "id" : "y", "s" : 51.6208916083916 }
{ "id" : "x", "s" : -48.94491258741262 }
====== 4 ( 425 ) ======
{ "id" : "y", "s" : 51.91148235294116 }
{ "id" : "x", "s" : 44.45475294117645 }
====== 6 ( 540 ) ======
{ "id" : "x", "s" : 48.769388888888855 }
{ "id" : "y", "s" : -51.55907407407403 }

  4.Kmeans

./kmeans.sh -s test.samplevector -f loc -i test.canopy.samplevector.cluster

  5.クラスター確認

./viewcluster.sh -s test.kmeans.samplevector.fin.cluster
====== 0 ( 626 ) ======
{ "id" : "y", "s" : -49.49702875399362 }
{ "id" : "x", "s" : -50.793690095846664 }
====== 1 ( 626 ) ======
{ "id" : "y", "s" : 49.92397763578274 }
{ "id" : "x", "s" : -49.16311501597446 }
====== 4 ( 624 ) ======
{ "id" : "y", "s" : 50.24775641025642 }
{ "id" : "x", "s" : 49.465288461538435 }
====== 6 ( 624 ) ======
{ "id" : "x", "s" : 50.32350961538466 }
{ "id" : "y", "s" : -49.74504807692312 }

  付属のclusterviewerで、視覚的に確認する事もできる。
  

 ※mongodの起動オプションにjsonp関連の設定が必要

rest=true
jsonp=true

  サンプル

クラスタリング自然言語処理:関連ドキュメントを算出)

前回行ったベクタライズ結果(ベクトル)をクラスタリングする。

  1.Canopy

./canopy.sh -s test.vector.tfidf.token.sampledoc

  2.仮重心を確認

./viewcluster.sh -s test.canopy.vector.tfidf.token.sampledoc.cluster
====== 27 ( 5 ) ======
0.6991590463302894       : 紙
0.26116572843727387      : 板紙
0.25448682647478826      : トイレットペーパー
0.20883262479957973      : 製紙
0.19898074919588601      : 布
0.14420424256537573      : 芯
0.14021816226652337      : パルプ
0.1301327196970886       : 王子
0.09387761477214077      : 業
0.09332310672575826      : 原紙
====== 28 ( 2 ) ======
0.5029816857228637       : Firebird
0.4098154219626097       : PostgreSQL
0.18170394267364035      : テーブル
0.17180653606418556      : インデックス
0.15644102504605537      : SQL
0.1476751483723454       : Best
0.13266129033454707      : バージョン
0.12598011447679408      : 閲覧
0.11908756100369494      : データベース
0.11393026693281044      : 2009年
====== 3 ( 12 ) ======
0.4408980420027375       : Apache
0.2540765415131882       : Log
0.163021939539478        : Axis
0.14548038477551709      : Net
0.13875718139417623      : Hadoop
0.130368792455702        : Maven
0.1267163309098733       : mod
0.12508219419623304      : Erlang
0.11450975136013103      : Ant
0.11102670657856481      : Tomcat
  :
  :
  :
====== 8 ( 1 ) ======
0.8057625546526619       : R
0.33396552734146134      : 関数
0.1665807620029282       : 犬
0.15287848869715082      : 解析
0.14516184139211946      : 統計
0.12807083125784488      : パッケージ
0.11105384133528545      : リスト
0.07643924434857541      : f
0.07565769634531941      : 行列
0.0615125651459316       : PDF
====== 9 ( 2 ) ======
0.5030288277932503       : 大臣
0.3782776791666038       : 政務
0.3634129449830944       : 内閣
0.2881511119264911       : 官
0.2403024083749958       : 府
0.1912386335984169       : 条
0.1690473739354759       : 委員
0.14240962826254328      : 法律
0.1226773027532713       : 庁
0.1180222505621871       : 担当


  3.Kmeans

./kmeans.sh -s test.vector.tfidf.token.sampledoc -i test.canopy.vector.tfidf.token.sampledoc.cluster

  4.クラスター確認

./viewcluster.sh -s test.kmeans.vector.tfidf.token.sampledoc.fin.cluster
====== 27 ( 13 ) ======
0.6710317847485132       : 紙
0.21439418158242424      : 印刷
0.1768292696988328       : 折り紙
0.16236873170000543      : 新聞
0.16236198982268538      : 段ボール
0.15825358425477087      : 板紙
0.14641634234324327      : 製紙
0.14031243070531707      : トイレットペーパー
0.11932858638000869      : ペーパーナイフ
0.11669516517623972      : 芯
  :
  :
  :

   詳細:

./viewcluster.sh -s test.kmeans.vector.tfidf.token.sampledoc.fin.cluster -V
====== 0 ( 7 ) ======
0.4405965585238873       : 宇宙
0.3487744336004021       : 探査
0.33117813139430435      : 月面
0.32402389175263796      : 計画
0.24126460324385507      : 月
0.23420944668374247      : アポロ
0.19723888046346477      : 着陸
0.193779193883831        : 号
0.13895807931926288      : 飛行
0.12638293574816634      : 有人
_id:(51e64d60c507ed1f43d213c4) : 宇宙開発出典:フリー百科事典『ウィキペディア(Wikipedia)』移動:案内、検索宇宙開発(うちゅうかいはつ、英:spacedevelopment)は、宇宙空
_id:(51e64d60c507ed1f43d213c7) : 月面着陸出典:フリー百科事典『ウィキペディア(Wikipedia)』移動:案内、検索月面でポーズをとるエドウィン・オルドリン。撮影したニール・アームストロングが
_id:(51e64d60c507ed1f43d213e4) : アポロ計画出典:フリー百科事典『ウィキペディア(Wikipedia)』移動:案内、検索アポロ計画(アポロけいかく、Apolloprogram)とは、アメリカ航空
_id:(51e64d60c507ed1f43d213f7) : 月面車出典:フリー百科事典『ウィキペディア(Wikipedia)』移動:案内、検索月面車(げつめんしゃ)とは、月面上を走行するために造られた自動車のこと。目次1
_id:(51e64d60c507ed1f43d213e6) : 宇宙開発競争出典:フリー百科事典『ウィキペディア(Wikipedia)』移動:案内、検索宇宙開発競争(うちゅうかいはつきょうそう、SpaceRace、宇宙開発レ
_id:(51e64d60c507ed1f43d213f9) : 月探査出典:フリー百科事典『ウィキペディア(Wikipedia)』移動:案内、検索月面に近づくアポロ12号の月着陸船物理的な月探査(Explorationoft
_id:(51e64d60c507ed1f43d213fd) : 宇宙探査機出典:フリー百科事典『ウィキペディア(Wikipedia)』移動:案内、検索この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。出典
  :
  :
  :
解説

2.の出力は1.Canopyの結果。
フォーマットは以下の通り。

====== <クラスターID> ( <所属ドキュメント数> ) ======
<上位キーワードの重み> : キーワード
  :

4.のKmeans後は少し重みが変わっており、所属ドキュメント数も変化し、重心が少し移動した事が解る。

まとめ

ここまでで関連ドキュメントを算出するところまで出来た。

まだ差分計算などの課題は有りつつも、一通りの自然言語処理が出来た。

今後ともMONMOちゃんをよろしく!!