Blogger Syntax Highliter

Saturday, August 8, 2015

Azure MLのテキストアナリティクスを使って日本の会社を分類してみる

 

Azure MLのティストアナリティクスを使って、日本の会社を分類してみます。と言っても、日本語の業務内容から分類するには、日本語文章を形態素解析が必要なため少し面倒なので、もっと簡単な方法で簡易的に試してみます。

 

日本語会社名から分類

日本の会社名は漢字で構成されている場合が多いため、使われている漢字から業種を推測することができます。日本人の大人でも、業務内容の知らない会社の業種を完璧に当てることは難しいのですが、漢字の意味を知っていればそれなりに判断することができます。

今回は漢字の意味を知らないAzure MLに、会社名をもとに業種を分類させてみようと思います。Azure MLには、教師あり学習として日経225の会社名と業種を渡して学習させました。

 

日経225の会社一覧からデータの作成

会社一覧のデータは、業種がわかるものが必要です。今回は日経225インデックスの銘柄一覧サイトの情報をもとに、手作業で会社の一覧情報を作りました。

https://indexes.nikkei.co.jp/nkave/index/component?idx=nk225

Excelで入力した後、CSV形式で出力します。

01

出力されたCSVデータの文字コードはShift-JISなので、メモ帳を使ってUTF-8に変更します。(「名前を付けて保存」で文字コードを指定します。)これでAzure MLで読み込む準備が整いました。

02

 

Azure Machine Learningでデータセットを作成

UTF-8にしたCSVを、Azure MLにインポートします。データのインポートは、Dataset追加から行います。

03

 

Azure Machine Learningで日本の会社名から業種を分類するExperimentを作成

今回は、Azure ML が持つテキストアナリティクスのFeature Hashingを使います。通常は単語がスペース区切りになっている英文に利用しますが、日本語の社名は漢字の組み合わせで何となく業種がわかるので、一文字単位でスペース区切りにしてFeature Hashingを行います。下図のようなExperimentを作成します。

04

Project Columnsでは、会社名であるName1カラムとどのような業種を表すsectorカラムを取り出しています。取り出した会社名を今回の用途のために Feature Hashing しやすいように、Execute Python Scriptを使って、文字をスペース区切りにします。作成した文字列はURLエンコード化されてname_txカラムとして追加します。なぜURLエンコードしたのかは、以前の記事をご参照ください。

Pythonだとこんな感じの文字処理になるのでしょうか、、。C#を使いたいです。

 

 

Feature Hashingでは、name_txを選択して、Hashing bitsizeを16ぐらいに、N-gramsを3ぐらいにして、文字のつながりを指定します。xx機械、xx製薬など2文字以上のつながりが多いですよね。

Feature Hashingされたデータは、16ビット分のカラムが作成されており、学習をする際に負荷をかけるため、Filter Based Feature Selectionで特徴のあるデータだけ残します。Feature Scoring MethodはChi Squared(カイ二乗)で、target columnはsectorを選択します。Number of desired featureは1000ぐらいにして、1000個の特徴のあるカラムにします。

あとは、Classification系の教師あり学習を選びます。今回はメモリ使用を抑えた簡易的なMulticlass Desision Jungleを使いました。

最後に、Feature Hashingされた大量のカラムがあると結果が見にくいので、結果を抽出するためにScored Labelsとsectorとname1のみ出力するようにのProject Columnsで調整しています。

結果は

日経225の80%を学習に使い、20%を試した結果は下図の通りです。業種によっては少ない学習数ですが、思っていたより良い感じに分類してくれています。マツダが機械になったのは不思議です。

05

 

最後に

Feature Hashing本来の使い方とは少し異なりますが、考え方は同じなので試してみましたが、思ったより良い結果が出ました。そもそも、会社のことを知らない日本人が見ても分類することは難しいので、完全な結果は出ないことはわかると思いますが、人間が一つ一つ分類するのが難しい大量の単語を一気に分類するときには使えそうですね。

4 comments:

  1. 初めまして。前回のブログと共に参考にさせて頂いています。
    一点質問させてください。

    このエントリーの場合、どこで分かち書きにしているのでしょうか?
    というのもAzure上でのMeCabの使用方法がわからないので質問しました。

    ReplyDelete
  2. すみません、1文字づつと書いてありましたね。。。
    もしよろしければAzure上でMeCab使用する方法がありましたご教授頂けないでしょうか?
    MeCabはPCにインストールしてして使うモノだと認識しているので、何か方法がないか模索中です。

    ReplyDelete
  3. 手動でMeCabで処理させてからAzure MLに渡せば、とりあえず試すことができますが、自動で処理させたいので、半年ぐらい前ですがMeCabをWebサービス化してチャレンジしていました。(当時は速度が遅かったので途中でやめました)
    私も明確な答えは持っていませんが、Azure Web Appsで実現する場合は、Webで受け取ったリクエストを、Queueに入れて、WebjobsでMeCab処理後、Azure MLのWeb Serviceで処理してもよいのかもと思ってます。バッチ的な感じでは、Data Factoryを使ってMeCab処理させたものをAzure MLに渡して処理することもできるかもしれません。
    時間があったときに再度チャレンジする予定です。

    あと、MeCabをプログラム内で動かす場合は、NMeCabを使った方が便利なようです。下記のしばやん先生のBlogが参考になります。
    http://blog.shibayan.jp/entry/20150307/1425727383

    ReplyDelete
  4. どうもありがとうございます!!
    .NETですね。。。勉強します。

    私も色々チャレンジしてみます!

    ReplyDelete