pikesaku’s blog

個人的なプログラム勉強メモです。記載内容について一切の責任は持ちません。

Jubatusチュートリアル勉強(データ変換・文字列編)

データ変換とは?

一般的に機械学習を行う場合、テキスト等の非定形データは直接扱うことはできない

その為、それらのデータから特徴抽出をして、特徴ベクトルデータを得る必要がある。これがデータ変換。

特徴ベクトルデータは、キーが文字列・値が数値のkey-value型のデータ

このデータ変換により、自然言語・画像・音声データを統一的に扱う事が可能になる

Jubatusはこの変換機能を有し、設定ファイルで柔軟にカスタマイズできる。


データ変換の流れ

①クライアントが学習データからdatum(学習データの元)を生成しサーバに渡す。

②サーバはdatumにフィルター処理をする。

③サーバはフィルター処理されたdatumに特徴抽出処理(重み付け)をして特徴ベクトルデータを得る


サーバにおけるフィルター処理について

クライアントから提供されるdatumはkey:value型データ。keyは文字列。
valueのデータは以下3種類があり。
1) 文字列
2) 数値
3) バイナリデータ

フィルター処理は、datumを入力として指定ルールに基づき新たなdatumを生成し、学習対象データに追加する。

例) 参考URLの例では、クライアントが生成したdatum(message)にHTMLタグ除去処理をして、別keyでdatum(message-detagged)を追加している。

フィルター処理は、datumの種類により異なる。本記事では文字列データの処理について記載する。(数学が苦手だから。。。)

設定ファイル内の以下パラメタで実現

stiring_filter_types

変換ルールを定義

例)

"string_filter_types": {
  "detag": { "method": "regexp", "pattern": "<[^>]*>", "replace": "" }
},

やっている事は以下の通り
①"detag"という名前でHTMLタグを除去するフィルタを定義
②"method"で正規表現をするフィルタ"regexp"を指定
③"pattern"でパターンマッチを指定
④"replace"でパターンにマッチした場合の置換ルールを指定

"detag"はユーザー定義データ
"method"、"pattern"、"replace"に指定可能なパラメタは他にもあり。詳細は参考URLを参照。
フィルタ・変換ルールのみ定義。どのdatumに適用するかは、ここでは定義しない。

string_filter_rules

stiring_filter_typesで定義されたルールをdatumに適用し学習対象となる新datumを追加する。

例)

"string_filter_rules": [
  { "key": "message", "type": "detag", "suffix": "-detagged" }
]

やっている事は以下の通り
①"key"でフィルタ処理対象にするdatumを指定。
※"message"はクライアント側プログラムで学習データからdatumを生成する時に定義されている。
②"type"でstiring_filter_typesで定義した変換ルール"detag"を指定。
③"suffix"で新しく生成されるdatumのkey値生成を生成。

結果、以下のdatumが作成され学習対象として追加される。
key: message-detagged
value: タグ除去されたデータ

上記例にはないが、"except"パラメタを利用してマッチ除外条件の指定も可能。


サーバにおける特徴抽出処理(重み付け)について

この処理をdatumに行い、特徴ベクトルデータを得る。

設定ファイル内の以下パラメタで実現

string_types

重み付けルールを定義

例)

"string_types": {
  "bigram":  { "method": "ngram", "char_num": "2" }
},

やっている事は以下の通り
①"bigram"という名前の重み付けルールを定義
②"method"で重み付けアルゴリズム("ngram")を指定
ngramは隣接するN文字を特徴量として利用するアルゴリズム(このような特徴量をN-gram特徴と呼ぶ)
③"char_num"は②で指定したアルゴリズムのオプション。ngramの隣接するN文字のNを指定。

"bigram"はユーザー定義データ。
"method"、"method"に指定可能なパラメタは他にもあり。

詳細は参考URLを参照。
重み付けルールのみ定義。どのdatumに適用するかは、ここでは定義しない。

string_rules

string_typesで定義されたルールをdatumに適用し重み付けをする。

例)

"string_rules": [
  { "key": "message",          "type": "bigram", "sample_weight": "tf",  "global_weight": "bin" },
  { "key": "message-detagged", "type": "space",  "sample_weight": "bin", "global_weight": "bin" }
]

やっている事は以下の通り
①"key"で適用するdatumを指定。
②"type"でstring_typesで定義したアルゴリズム"bigram"を指定
③"sample_weight"で重み付けする値を決定。
 "bin"の場合は常に1とする。
 "tf"の場合は、datumの文字列中の出現回数で重みづけする。
④"global_weight"で今までの通算データから算出される大域的な重み付けを指定。
 "bin"の場合は常に1とする。


今日はここまで!
特徴抽出処理あたりからよく分からない。。。。
サンプルプログラムで動きをみてみよう。