ラベル Machine Learning の投稿を表示しています。 すべての投稿を表示
ラベル Machine Learning の投稿を表示しています。 すべての投稿を表示

2015年4月11日土曜日

オープンソース版SiriのSirius試してみた

最近はブログのネタに事欠かなくて非常に幸せです。こんばんは。

さてある日twitterを眺めていたらこんなツイートが↓
ファッ?!ってなりますよね?
なりますよね!!!

非常に気になって記事を見てみたのですが、
「Siriusとは、音声認識、画像マッチング、自然言語処理および質疑応答システムなどのIPA(インテリジェントパーソナルアシスタント)の中心的機能を果たすものである」
と書かれています。
どうやらSiriと同等の機能を提供することを目標に開発されているようです。

もともとこのへんの分野が非常に好きな私としては試さずにはいられません。
しかも(なぜか)都合よく、VM2つ3つ起動できるスペックのマシンを発注していたので、早速試してみました。

インストールとか

プロダクトのページは http://sirius.clarity-lab.org/ で、ソースコードはgithubの https://github.com/jhauswald/sirius で公開されています。

インストール自体は書かれている手順通りにやれば基本的には問題ないのですが、いかんせん依存ライブラリが多い(http://sirius.clarity-lab.org/index.html%3Fp=9.html#install のPrerequisites参照)です。
で、たまたま最近Dockerに興味があったので、これ幸いと環境構築に使うことにします。
なお、当然ながら同じこと考えていた人がおり、プルリク投げられていた のでDockerfile作成の参考にしています。(せっかくなのでこちらはUbuntu14.04)

今回使った環境は以下の通りです。
  • ホスト
    • OS
      • Windows7 64bits
    • メモリ
      • 16GB
    • CPU
      • 8コア
  • ゲストOS
    • OS
      • Ubuntu 14.04
    • メモリ割り当て
      • 2GB
    • CPU
      • 1コア

Windows上にVMでUbuntuを起動して、その上でDockerを動かす構成にしています。

VMをWindows上のVirtualBoxで動かすので、Vagrantの力も借ります。
Vagrantfileの書き方やDockerとの連携については、以下のページを参考にしています。ありがとうございます。


本題ではないのでVagrantfileとDockerfileの中身については説明を省きますが、gistに置いて*1ますので気になる方はどうぞ。*2, *3

ということでVagrantfileとDockerfileの準備ができたので、早速VMを起動しコンテナを作成します。
$ cd ${VAGRANT_DIR}
$ vagrant up

たったこれだけ。簡単ですね。
ちなみに手元の環境だと、依存ライブラリのインストールからSirius本体のビルドなどが終わるまで数時間かかっています。(おそらくゲストOSに割り当てているリソースが少ない上に、無線で繋いでいたのでなおさら悪い)

動かしてみる

準備が整ったので早速動かしてみます。
動かし方は公式のドキュメントに記載のとおりです。

Automatic Speech Recognition (ASR) [音声認識]

サーバプロセス起動

$ cd /path/to/sirius/sirius-application/run-scripts/
$ ./start-asr-server.sh pocketsphinx &
注意:start-<service>-server.shはフォアグラウンドで動きます。

テストクエリ送信

$ ./sirius-asr-test.sh ../inputs/questions/what.is.the.speed.of.light.wav

結果

Your audio file is:
../inputs/questions/what.is.the.speed.of.light.wav
Sending request to server localhost:8081/ ...
transcript []: what is the speed of light
 what is the speed of light
***********************************************
正しく認識してくれているようです。

Image Matching (IMM) [画像認識]

サーバプロセス起動

$ cd /path/to/sirius/sirius-application/run-scripts/
$ ./start-imm-server.sh &

テストクエリ送信

$ ./sirius-imm-test.sh ../image-matching/matching/landmarks/query/query.jpg

結果

(1) Your image file is:
../image-matching/matching/landmarks/query/query.jpg
img: tower-pisa.jpg data: tower pisa
Image data: tower pisa
画像はピサの斜塔なので正解です。

Question-Answering System (QA) [質問応答]

サーバプロセス起動

$ cd /path/to/sirius/sirius-application/run-scripts/
$ ./start-qa-server.sh &

テストクエリ送信

$ ./sirius-qa-test.sh "what is the speed of light"
注意:質問文はなんでもよい様子

結果

(1) Your query text is:
what is the speed of light
(2) Sending request to server...
Query str: query=what%20is%20the%20speed%20of%20light

+++++ Analyzing question (2015-04-11 08:53:20) +++++
Normalization: what be the speed of light

Answer types:
NErate->NEspeed

Interpretations:
Property: SPEED
Target: light

Predicates:
-

+++++ Generating queries (2015-04-11 08:53:22) +++++
Query strings:
speed light
("speed of light" OR "light speed")
"light" speed light
"the speed of light is"
"is the speed of light"

+++++ Searching (2015-04-11 08:53:22) +++++

+++++ Selecting Answers (2015-04-11 08:53:34) +++++
Filter "AnswerTypeFilter" started, 64 Results (2015-04-11 08:53:34)
Filter "AnswerTypeFilter" finished, 81 Results (2015-04-11 08:53:35)
Filter "AnswerPatternFilter" started, 81 Results (2015-04-11 08:53:35)
Filter "AnswerPatternFilter" finished, 439 Results (2015-04-11 08:53:45)
Filter "PredicateExtractionFilter" started, 439 Results (2015-04-11 08:53:45)
Filter "PredicateExtractionFilter" finished, 439 Results (2015-04-11 08:53:45)
Filter "FactoidsFromPredicatesFilter" started, 439 Results (2015-04-11 08:53:45)
Filter "FactoidsFromPredicatesFilter" finished, 439 Results (2015-04-11 08:53:45)
Filter "TruncationFilter" started, 439 Results (2015-04-11 08:53:45)
Filter "TruncationFilter" finished, 408 Results (2015-04-11 08:53:46)
Filter "StopwordFilter" started, 408 Results (2015-04-11 08:53:46)
Filter "StopwordFilter" finished, 371 Results (2015-04-11 08:53:46)
Filter "QuestionKeywordsFilter" started, 371 Results (2015-04-11 08:53:46)
Filter "QuestionKeywordsFilter" finished, 341 Results (2015-04-11 08:53:46)
Filter "ScoreNormalizationFilter" started, 341 Results (2015-04-11 08:53:46)
Filter "ScoreNormalizationFilter" finished, 341 Results (2015-04-11 08:53:46)
Filter "ScoreCombinationFilter" started, 341 Results (2015-04-11 08:53:46)
Filter "ScoreCombinationFilter" finished, 341 Results (2015-04-11 08:53:46)
Filter "FactoidSubsetFilter" started, 341 Results (2015-04-11 08:53:46)
Filter "FactoidSubsetFilter" finished, 338 Results (2015-04-11 08:53:46)
Filter "DuplicateFilter" started, 338 Results (2015-04-11 08:53:46)
Filter "DuplicateFilter" finished, 172 Results (2015-04-11 08:53:46)
Filter "ScoreSorterFilter" started, 172 Results (2015-04-11 08:53:46)
Filter "ScoreSorterFilter" finished, 172 Results (2015-04-11 08:53:46)
299,792,458 meters per second
***********************************************
光速は約30万km/sなので、正しく応答してくれていそうです。

余談

出身地で動かしてみたくなったので、以下のクエリを投げ込んでみました。
$ ./sirius-qa-test.sh "where is saga?"

結果

(1) Your query text is:
where is saga?
(2) Sending request to server...
Query str: query=where%20is%20saga%3F

+++++ Analyzing question (2015-04-11 08:54:24) +++++
Normalization: where be saga

Answer types:
NElocation

Interpretations:
Property: PLACE
Target: saga

Predicates:
-

+++++ Generating queries (2015-04-11 08:54:24) +++++
Query strings:
saga
saga
"saga" saga
"saga is in"
"saga is at"

+++++ Searching (2015-04-11 08:54:24) +++++

+++++ Selecting Answers (2015-04-11 08:54:27) +++++
Filter "AnswerTypeFilter" started, 24 Results (2015-04-11 08:54:27)
Filter "AnswerTypeFilter" finished, 345 Results (2015-04-11 08:54:30)
Filter "AnswerPatternFilter" started, 345 Results (2015-04-11 08:54:30)
Filter "AnswerPatternFilter" finished, 6183 Results (2015-04-11 08:54:45)
Filter "PredicateExtractionFilter" started, 6183 Results (2015-04-11 08:54:45)
Filter "PredicateExtractionFilter" finished, 6183 Results (2015-04-11 08:54:45)
Filter "FactoidsFromPredicatesFilter" started, 6183 Results (2015-04-11 08:54:45)
Filter "FactoidsFromPredicatesFilter" finished, 6183 Results (2015-04-11 08:54:45)
Filter "TruncationFilter" started, 6183 Results (2015-04-11 08:54:45)
Filter "TruncationFilter" finished, 4301 Results (2015-04-11 08:54:46)
Filter "StopwordFilter" started, 4301 Results (2015-04-11 08:54:46)
Filter "StopwordFilter" finished, 3440 Results (2015-04-11 08:54:48)
Filter "QuestionKeywordsFilter" started, 3440 Results (2015-04-11 08:54:48)
Filter "QuestionKeywordsFilter" finished, 3174 Results (2015-04-11 08:54:48)
Filter "ScoreNormalizationFilter" started, 3174 Results (2015-04-11 08:54:48)
Filter "ScoreNormalizationFilter" finished, 3174 Results (2015-04-11 08:54:48)
Filter "ScoreCombinationFilter" started, 3174 Results (2015-04-11 08:54:48)
Filter "ScoreCombinationFilter" finished, 3096 Results (2015-04-11 08:54:48)
Filter "FactoidSubsetFilter" started, 3096 Results (2015-04-11 08:54:48)
Filter "FactoidSubsetFilter" finished, 3077 Results (2015-04-11 08:54:48)
Filter "DuplicateFilter" started, 3077 Results (2015-04-11 08:54:48)
Filter "DuplicateFilter" finished, 876 Results (2015-04-11 08:54:57)
Filter "ScoreSorterFilter" started, 876 Results (2015-04-11 08:54:57)
Filter "ScoreSorterFilter" finished, 876 Results (2015-04-11 08:54:57)
Icelandic
***********************************************
Icelandic……?
佐賀はアイスランドだった……?

Combining Services [システム連携]

(この例はASR→QAという連携のようです)

サーバプロセス起動

$ cd /path/to/sirius/sirius-application/run-scripts/
$ ./start-asr-server.sh pocketsphinx &
$ ./start-qa-server.sh &

テストクエリ送信

./sirius-asr-qa-test.sh ../inputs/real/what.is.the.capital.of.italy.wav

結果

Your voice search (text) is:
../inputs/real/what.is.the.capital.of.italy.wav
Sending request to ASR server...
transcript []: what is the capital affiliate
Sending request to QA server...
Query str: query=what%20is%20the%20capital%20affiliate

+++++ Analyzing question (2015-04-11 09:02:06) +++++
Normalization: what be the capital affiliate

Answer types:
NElocation

Interpretations:
Property: NAME
Target: capital affiliate
Property: DEFINITION
Target: capital affiliate

Predicates:
-

+++++ Generating queries (2015-04-11 09:02:06) +++++
Query strings:
capital affiliate
"the capital" affiliate
"capital affiliate" capital affiliate
"capital affiliate" capital affiliate
"the capital affiliate is"
"is the capital affiliate"

+++++ Searching (2015-04-11 09:02:06) +++++

+++++ Selecting Answers (2015-04-11 09:02:11) +++++
Filter "AnswerTypeFilter" started, 37 Results (2015-04-11 09:02:11)
Filter "AnswerTypeFilter" finished, 505 Results (2015-04-11 09:02:15)
Filter "AnswerPatternFilter" started, 505 Results (2015-04-11 09:02:15)
Filter "AnswerPatternFilter" finished, 886 Results (2015-04-11 09:02:16)
Filter "PredicateExtractionFilter" started, 886 Results (2015-04-11 09:02:16)
Filter "PredicateExtractionFilter" finished, 886 Results (2015-04-11 09:02:16)
Filter "FactoidsFromPredicatesFilter" started, 886 Results (2015-04-11 09:02:16)
Filter "FactoidsFromPredicatesFilter" finished, 886 Results (2015-04-11 09:02:16)
Filter "TruncationFilter" started, 886 Results (2015-04-11 09:02:16)
Filter "TruncationFilter" finished, 787 Results (2015-04-11 09:02:16)
Filter "StopwordFilter" started, 787 Results (2015-04-11 09:02:16)
Filter "StopwordFilter" finished, 757 Results (2015-04-11 09:02:16)
Filter "QuestionKeywordsFilter" started, 757 Results (2015-04-11 09:02:16)
Filter "QuestionKeywordsFilter" finished, 724 Results (2015-04-11 09:02:16)
Filter "ScoreNormalizationFilter" started, 724 Results (2015-04-11 09:02:16)
Filter "ScoreNormalizationFilter" finished, 724 Results (2015-04-11 09:02:16)
Filter "ScoreCombinationFilter" started, 724 Results (2015-04-11 09:02:16)
Filter "ScoreCombinationFilter" finished, 722 Results (2015-04-11 09:02:16)
Filter "FactoidSubsetFilter" started, 722 Results (2015-04-11 09:02:16)
Filter "FactoidSubsetFilter" finished, 722 Results (2015-04-11 09:02:16)
Filter "DuplicateFilter" started, 722 Results (2015-04-11 09:02:16)
Filter "DuplicateFilter" finished, 435 Results (2015-04-11 09:02:17)
Filter "ScoreSorterFilter" started, 435 Results (2015-04-11 09:02:17)
Filter "ScoreSorterFilter" finished, 435 Results (2015-04-11 09:02:17)
New York City
***********************************************
イタリアの首都(=ローマ)はなにか?が元の音声なので、ニューヨークと答えてるのはNGですね。
ただ音声認識の結果が "what is the capital affiliate" なので、"affiliate" からアメリカを連想できているのはいい感じかもしれません。

ということで、同梱されているデータだけではまだ精度的に厳しい部分もありそうですが、いわゆる音声認識での対話システムみたいなものが簡単に実現できそうな感じです。(Combining Serviceあたりが想像しやすいでしょうか)
日本語に対応しているかは未確認ですが、ぜひ対応して欲しいですね!(自分でやれ)

*1:気が向いたら本家にプルリク投げるか…?
*2:余談その1:Ubuntuは12と14で微妙に差異があったのでいろいろハマりました。
*3:余談その2:直近(2015/04/08, JST)のコミットで入った、各サーバプロセス起動時にCPUを見てスレッド数を変更する対応の影響で、プロセッサ数が4未満だとQAがうまく動かなくなるようです。(該当するissueはこれ→https://github.com/jhauswald/sirius/issues/59

2014年10月5日日曜日

HMMLearn導入メモ

どうもご無沙汰しております。気づけば一年以上ぶりですね。
忙しさを言い訳に全く何もしてない状況が続いていましたが、さすがにこれはマズいとそろそろ重い腰を上げたいところです。

最近はデータ解析のまねごとに勤しんだり、新しい機能の開発をやってみたり、新卒の子のフォローをしてみたりと色々やっているわけですが、ここに来てまた他のことにも手を出そうとしています。下手の横好きとも

ということで、タイトルのネタです。

諸々の事情により時系列データの予測をする必要に迫られそうなので、とりあえずHMM使ってみるかー、という安易な発想に基づき手頃なライブラリとして sklearn を導入することに。

が、

HMMのリファレンスいわく、
Warning

The sklearn.hmm module has now been deprecated due to it no longer matching the scope and the API of the project. It is scheduled for removal in the 0.17 release of the project.

This module has been moved to a seperate repository: https://github.com/hmmlearn/hmmlearn
とのこと。
仕方ないので、hmmlearnのリポジトリに飛んで記載されている手順通りにインストール。

  1. git clone git://github.com/hmmlearn/hmmlearn.git
  2. cd hmmlearn
  3. python setup.py install
  4. nosetests
すると、4. で以下のエラーに遭遇。

E.E
======================================================================
ERROR: Failure: ImportError (cannot import name _hmmc)

まぁ、なんやかんやあって切り離されたライブラリみたいだし、しょうがないかと思ってissuesを漁るとありました、ドンピシャのやつ。
https://github.com/hmmlearn/hmmlearn/issues/3
見るとまだ解決していないようですが、とりあえず全部コピればOKのようです。

……汚くなるからやだなぁ。

ということで色々試してみた結果、以下のようにすれば良さそうです。
$ cp -r hmmlearn/utils/ ${PYTHON_ROOT}/site-packages/hmmlearn/utils/
(${PYTHON_ROOT}はpythonのインストール先。virtualenv使ってたら、${VIRTUAL_ENV}/lib/pythonx.x/とかでしょうか)

どうもこのutils直下にいるfixes.pyを読んでいる感じですが、詳細不明なのでとりあえずの対処ということで。
ひょっとしなくてもvirtualenv使ってるとおかしくなるとかそういうアレかもしれません。

割とニッチなライブラリみたいなので困っている方はいない気もしますが、万一お困りの方がいれば参考までに。

2013年5月10日金曜日

PRML読書録(その0)

コンスタントに書く習慣をつけたい今日このごろ。

前回の記事(→WebGLでk-meansをビジュアライズ)ですが、当初の予定ではこれにDirichlet Process Mixtureによるクラスタリングを追加する予定でした。
学生の頃から気になる手法ではあったのですが、ちゃんと追えていなかったので、ここでやろうと。
が、どうにも基礎知識が足りなさすぎて実装の手がかりすらつかめない状況に陥ったので、方針を変えることに。

何をするかといえば、これまた学生の頃から(ry な、Pattern Recognition and Machine Learning(PRML)*1をちゃんと読んで、しばらくの間基礎知識の補強期間にしようと思います。
で、その過程で色々実装したものを使って遊んだり、アウトプットしていって、最終的に最近の新しい話題に関するネタをやれる状況を作ろうかなー、と。

ただ、このあたりは既に偉大な先駆者(PRML 読んでやってみた(上巻編)PRML 読んでやってみた(下巻編))がいらっしゃるので、ちょっと違う観点で実装したり出来ればなぁと考えていたり。*2

ということで、本来は順番通りに読んでいくべきでしょうけど、DPMに関係の深そうな、HMMとかその辺を中心にやっていこうと思います。
果たして最初のアウトプットはいつになるのか

  • *1:amazonだと和書が中古でしか流通していないので、手元にあるのはなぜか洋書。無駄にハードルが…
  • *2:実装に使われている言語はRがメインのようなので、numpyで書いてみるとか、実装したお試しコード全部ビジュアライズするとか。

2013年5月3日金曜日

WebGLでk-meansをビジュアライズ

久しぶりの連休!
ということで月イチどころか、週イチでの更新です。珍しい。
多分続かないですが

さて今日は少し前からちまちま作っていたものが形になったので公開してみます。

WebGLでk-meansをビジュアライズ
http://www.lazykyama.jp/ClusteringVisualizer/contents/
はい。タイトルのまんまです。

どういうものかというと、てっく煮ブログさんの以下の記事をパクったにインスパイアされたコンテンツです。
3D版!「K-Means法」ビジュアライズしてみた
http://tech.nitoyon.com/ja/blog/2009/04/13/kmeans-visualize-3d/ 

内容は機械学習やクラスタリングなどでお馴染み、k-meansの結果をWebGLで可視化する、ということで、インスパイア元とほぼ同じ*1です。
ちなみに動作確認はChromeでしかやっていないので、他のブラウザの方はご覧頂けないかもしれません。

このコンテンツですが、実際にアクセスすると、
こんな感じで表示されます。

で、nextボタンをポチポチ押していくとクラスタの割り当てが変わっていき、最終的に、
こうなります。
当然回転するので、くるくる回しているだけでも結構楽しいかもしれませんw


最後に実装について少し。
今回はWebGLを使ったと書きましたが、実際の描画などはthree.jsを使っています。
色々調べているとWebGLを直で触るのがしんどそうだったので、ライブラリの力を借りました。
OpenGLを少し触っていた事もありますが、サンプルが充実しているので、このくらいの規模なら割と簡単に作れるなー、というのが率直な感想です。
今後はWebGLを使ったサイトも増えてくるんでしょうかね。

  • *1:うちの方がアニメーションなどもろもろしょぼいので、正しくは劣化コピー


2013/05/14 追記:
「関連キーワードでググったらどのくらい上に来るかな〜」と、嬉々としてググったところ、全く同じ事をやっている方のブログ(K-means法をHTML5 canvasで可視化する)を発見して(´・ω・`)ションボリ
なんか作るときはちゃんと調べてからやりましょうねということで…