SlideShare a Scribd company logo
NLP with MongoDB

-1 -
NLP おさらい

-2 -
NLPおさらい
■自然言語処理
読者の為に書かれた普通の文章を処理する手法

■典型的な流れ
●

Tokenize
–あるドキュメントからそれを構成する単語単位に分割

単語検索が可能になる
●

Vecterize
–単語の重みを加味しドキュメントを代表するパラメータ(ベクトル)を生成

重みを加味した検索が可能になる
●

Clusterize
–文章同士のパラメータを比較し関連度を算出しグループ化

関連ドキュメント検索が可能になる
-3 -
NLPおさらい
■Tokenize
White space:ドキュメントを単純にスペースで区切る
ラテン系の言語の場合は大体コレで良い
アジア(漢字)圏の言語では用を成さない。。

N-Gram:ドキュメントをN文字ずつ区切る
『本日は晴天なり』の2-Gram=>(本日|日は|は晴|晴天|天な|なり)
大量の意味の無い単語が抽出されるが、頻出したモノを単語とみなす
単語辞書を使わないので汎用的だが精度が低い

形態素解析:単語辞書を使う
辞書を使うので品詞を特定でき、文法上の用法を加味出来るので高精度
辞書の網羅率に依存し、言語毎に辞書が必要で汎用性がない
-4 -
NLPおさらい
■Vectorize
TF-IDF:

  小難しい事は端折る!!
要は

・そのドキュメント内に頻出する単語は重要!(『宇宙』など)
・大量のドキュメントに出現する単語は不要!(『私』など)
-5 -
■Clusterize

NLPおさらい

Canopy:大まかなクラスタを見つける(要は碁石拾い)

K-means:重心→クラスタ分類、クラスタ平均→重心、と繰り返す
単純なアルゴリズムで扱い易いが、極値解を求めるため初期条件に強く依存

…

    初期重心の与え方が肝!
-6 -
MapReduce
in
MongoDB
-7 -
MapReduce in MongoDB
■MongoDBのMapReduceの癖
primary mongodで処理が走る
そもそも『DBでロジック走らせる』ってどうなのよ?

PL/S○Lとかも色々アレじゃん?
並列化がshard毎
膨大なshardを管理するの大変だし、データ配置的に非効率なことも多い

emit問題
一時的に使うemitコレクションがレプリケーションされる。。超無駄!!

NaN等で下手打つとDBが死ぬ(aggrigation FWも同じ)
やっぱりnoscriptじゃないと危険。。
-8 -
MapReduce
in
MongoDB
使えたもんじゃねぇ!
-9 -
じゃあ、どうするよ?
■代替案の候補
mongo-hadoop + Mahout

最有力候補、MRはhadoopに流しとけば鉄板
でもJavaが面倒・・・もう昔に戻れない(TT;

nodeで書けば?
JSなら簡単なMR位、さらっと書ける!
・・・非同期地獄・・・コールスタック足りないよ・・・

そう言えばmongo shellってV8!
敢えて、、ね。→ 他の人と違う事やりたいし。。
ベンチ取ったら、nodeより早かった(多分V8バージョンの違い)

    十分使えそう!!
-10 -
Monmoちゃん

-11 -
Monmoちゃん
■JOB 単純なJobキュー

■MAP(reduceはemitのkey毎のMAP)

-12 -
Monmoちゃん
■必要なもの
–MongoDB
–Monmoソース(git

clone)

–Linux(bash)

 こんだけ!

■セットアップ
git clone
– mongo.env を適当に編集(MongoのパスやDBの場所)
–

–

適当にworkerを起動(ex> ./bin/worker.sh -j 4)

 超簡単!
もうサンプルJOB投入~♪
./bin/jobctl.sh -f ./sample/jobs/samplejob.js -s test.T -o test.R

–

■GIT
●

https://github.com/monmo

-13 -
Monmoちゃん
■特徴(ウリ)
セットアップが超簡単!=>他に何も要らない
構成変更も楽!=>workerを増減するだけ
MongoDBに優しい設計
JS(mongo shell)で開発できる
まさに language impedance が 0!

一通りの自然言語処理関連のアルゴリズム実装
–

形態素解析

熟語解析(C-VALUE)
– TF-IDF
– Canopy , K-means
–

徹底的に並列化
なるべくV8のJITに掛かるように工夫
-14 -
Monmoちゃん
■問題(困った点)
●

開発力が1馬力・・・
 white space tokenizerが無かったり、英数の正規化を全角に寄せてたり、、 
 色々やる事いっぱい。。思いつきで始めたからね・・・

●

まだSharding関連の実装がない(効率的に使えない)

●

Workerのバージョンチェック作らなきゃ・・・

●

本当の大規模環境がテストできない・・・
個人のツラさ・・・マシンパワー欲しい。。マジで。。

●

Mongo shellが色々対応してないので、細やかな制御がムズい
signal とか log とか

■色々連絡貰えると助かります!
hiroaki.kubota@mail.crumb.jp
-15 -
NLP
with
Monmoちゃん
-16 -
NLP with Monmoちゃん
■手順
以下をgit cloneする
monmo(本体)
– monmo-NLProcessing
–

■monmoセットアップ
README.jpのクイックスタートを流す

■monmo-NLProcessing
順にクイックスタートを流す
tokenize/README
vectorize/README
clusterize/README
-17 -
細かい話は
README読んで!
-18 -
NLP with Monmoちゃん
■tokenize(形態素解析)戦略
●

IPA辞書を元に独自の辞書をコンパイルしてMongoDBに保持
–

MongoDBの高度な配列インデックスが利用できる

–

活用形や先頭N文字を配列インデックスし、速度・精度を上げる

{
w :["行く","行ける","行け","行こ","行か","行き","行い"],
t :["動詞","非自立","自立"],
h :["行く","行け","行こ","行か","行き","行い"]
      :
}
–

その他、活用形毎の接続分類用のカラムもあったり。。

品詞周りをカナリ頑張ってるので精度は高いよ!!
-19 -
NLP with Monmoちゃん
■vectorize(TF-IDF)戦略
●

特別なことはあまりない。。

●

効率の面から TF → DF → IDF → TF-IDF の順で処理する

●

語句の重みはIDFの段階で決まる(チューニングはIDFでやる)

●

正規化

●

熟語はをどう取り扱えば良いんだろうか・・・?

●

READMEで差分戦略までは練った。実装はまだ・・・

-20 -
NLP with Monmoちゃん
■clusterize(Canopy)戦略
●

ユークリッド距離とcos距離に対応

●

T2サンプリングを並列化し、高速化!!

●

T1サンプリング後に追加処理
–

小さなクラスタを削除

–

近すぎる(T2内)クラスタを削除

–

ココだけ並列化出来ない・・・

■clusterize(K-means)戦略
●

ユークリッド距離とcos距離に対応

●

極々普通の実装

●

並列処理と待ち合わせの繰り返し
–

クラスタ分類→(待ち合わせ)→ 重心算出 → (待ち合わせ)→ ・・・
-21 -
NLP with Monmoちゃん
■課題や、なんとなく判ったこと
●

MongoDB的にはTokenizeが一番厳しい
–
–

●

辞書参照が激しいから
辞書の動的更新止めてローカルに持つのも手?

Vectorize以降はDB負荷はほぼ無い
MAP対象のデータをJOB化する時、同じ数のJOBドキュメント生成する
 このときはDB負荷が上がる
–

–
–

●

JOBコレクションをshardingするのは効果がありそう
が、今の環境の規模では効果の判断は無理・・・

BSON→JSONの変換でJIT対象になる
–

3回以上使うオブジェクトは考慮の余地がありそう

–

大きい部分は既に対応したが、細かいところは要チェック
-22 -
さーやってみよー

-23 -
サーバーほしーよー

-24 -

More Related Content

PDF
Lispmeetup48 cl-online-learningによる文書分類
PDF
PHPで全文検索エンジンをつくるまで
PPTX
CotoGoto 〜 外部連携のメリット 〜
PDF
自然言語処理はじめました - Ngramを数え上げまくる
PPTX
自然言語処理における機械学習による曖昧性解消入門
PPTX
CotoGoto 〜 始める前に 〜
PPTX
CotoGoto 〜 解析の仕方 〜
PPTX
CotoGoto 〜 ライフログのつけ方 〜
Lispmeetup48 cl-online-learningによる文書分類
PHPで全文検索エンジンをつくるまで
CotoGoto 〜 外部連携のメリット 〜
自然言語処理はじめました - Ngramを数え上げまくる
自然言語処理における機械学習による曖昧性解消入門
CotoGoto 〜 始める前に 〜
CotoGoto 〜 解析の仕方 〜
CotoGoto 〜 ライフログのつけ方 〜

Viewers also liked (20)

PPTX
Marketing Eye - small business marketing
XLS
Ejercicios 2
PPTX
Nlbelgrade415
PPT
презентация элективного курса по обществознанию
PPTX
Winston classic rolls-royce slideshow
PPT
Crash course observation lab
PPTX
Bucerias
PPT
MongoTokyo
PPT
Copyright crash course part 5
PPT
презентация элективного курса по географии
PPT
B orenic1
PPTX
JavaScriptライフを10倍楽しくする方法-HTML5fun-
PDF
Optimal Management on Startup Village
PDF
บทที่ 2 ทวีชัย
PPT
Hist 141 the great depression & ww2
PPTX
Marketing Eye
PPTX
Evan 3rd bday ss
PPT
Environmental Stewardship Focus Area
PDF
Relatório de monitoramento do plano nacional de cidadania
PPT
Overview of CNCS Priorities and Performance Measures
Marketing Eye - small business marketing
Ejercicios 2
Nlbelgrade415
презентация элективного курса по обществознанию
Winston classic rolls-royce slideshow
Crash course observation lab
Bucerias
MongoTokyo
Copyright crash course part 5
презентация элективного курса по географии
B orenic1
JavaScriptライフを10倍楽しくする方法-HTML5fun-
Optimal Management on Startup Village
บทที่ 2 ทวีชัย
Hist 141 the great depression & ww2
Marketing Eye
Evan 3rd bday ss
Environmental Stewardship Focus Area
Relatório de monitoramento do plano nacional de cidadania
Overview of CNCS Priorities and Performance Measures
Ad

More from Hiroaki Kubota (9)

PDF
Db tech showcase2015 how to replicate between clusters
PDF
DB tech showcase: 噂のMongoDBその用途は?
PDF
MongoDBJP 納涼もんご祭り
PDF
Why mincore() returns different value of stat ?
PDF
Mongo ghostsync and slaveDelay (Japanease)
PDF
Mongo ghostsync and slaveDelay
PDF
C10K on Mongo's sharding
PPT
Cockatoo
PPT
Albatross
Db tech showcase2015 how to replicate between clusters
DB tech showcase: 噂のMongoDBその用途は?
MongoDBJP 納涼もんご祭り
Why mincore() returns different value of stat ?
Mongo ghostsync and slaveDelay (Japanease)
Mongo ghostsync and slaveDelay
C10K on Mongo's sharding
Cockatoo
Albatross
Ad

MongoDBで自然言語処理