極性分析ツールpolarisを作って言語処理100本ノックで作ったデータで精度を検証した話

出落ちになってしまうのですが、結論から言うと

___精度が低かったです___

しょんぼり。

polarisって何?

github.com

polarisとは、 私が作成した、極性分析のツールです。言語処理のための機械学習の著者である高村大也先生の研究である、「スピンモデルによる単語の感情極性抽出」の研究成果として公開している単語感情極性対応表を用いて、文章のポジティブ・ネガティブを判定します。

実装

単語と感情極性実数値のペアをデータベース(sqlite3)に格納します。
極性を分析する文字列に対して、形態素解析を行い(英語であればスペースで区切る(mecabに区切らせています))、語幹を抽出します。英語の場合はstemmifyという、ポーターのステマーのRuby実装のライブラリを用いました。なお、データベースに格納されている英単語もここではステミング処理をしたものを登録しています。(ダメそう...)
抽出された単語一つ一つの感情極性実数値を取得し、それらを足し合わせたものを双曲線関数(tanh)の曲線上の点に割り当てることで-1から1に収まるスコアを得ました。

精度の話

プログラムを作成して満足してしまっていた僕ですが、言語処理100本ノックの第8章で作成する Movie-review-dataのsentence polarity dataset v1.0を元に作成した極性の正解データを用いて精度を検証することができることに気づいてしまいました。そこで進捗がダメであるというのに精度を検証するプログラムを作成し始めてしまったというわけです。

結果

# i: 総数
i: 10653
# j: 正解数
j: 6669
# => 約62.6%

おおよそ6割程度の精度ですね。悲しいです。 数学から言語処理から初心者なので、どこがダメで精度が悪いのかよくわかっていません。もし何か「ここがおかしい」という点にお気づきになられたら、githubのリポジトリにissueとしてコメントをしていただきたいです。どうぞ宜しくお願いします。
文脈を考慮できるような判定器との比較をしないといけません。(言語処理100本ノックの8章で作る判定器と比較したいのに進まないので辛い...)

今後

 今回は英語に文章に対してのみ検証を行ったので、日本語の文章に対しても検証しなければなりません。正解データを探します。また、もちろん精度を上げるための工夫もしなくてはなりません。どうすれば良いだろうか...
ちなみに、精度の検証のために用いたデータ(言語処理100本ノックで作成した正解データと実験プログラムはgithubのリポジトリで公開してますのでもしよかったら遊んでみてください。

参考

Hiroya Takamura, Takashi Inui, Manabu Okumura, "Extracting Semantic Orientations of Words using Spin Model", In Proceedings of the 43rd Annual Meeting of the Association for Computational Linguistics (ACL2005) , pages 133--140, 2005.

ありがとうございました。

Golang + cli-init, cli-initのビルドにこけたとき

こちらのページを参考にcli-initのインストールをした。 dev.classmethod.jp

$GOPATHを設定した後に

$ cd $GOPATH/src/github.com/tcnksm/cli-init
$ make install
go get github.com/jteeuwen/go-bindata/...
go get -d -t ./...
go-bindata  -o templates.go templates
make: go-bindata: No such file or directory
make: *** [install] Error 1

なんかこけた。

$GOPATH/binにパスが通っていなかったのが問題でした。 参考 How to Write Go Code - The Go Programming Language

export PATH=$PATH:$GOPATH/bin

を.zshrcに追加。

ビルドできた。

Twitter APIを利用してフォローしているユーザを取得したい時

Twitter::REST::Client#followersを使っていませんか?

もし使っている場合、全件取得できずに

Rate limit exceeded (Twitter::Error::TooManyRequests)

が出てしまいませんか?

そんなときはTwitter::REST::Client#friend_idsとTwitter::REST::Client#usersを使いましょう。

ここまで書いたところで超丁寧な解説を発見してしまったのでサンプルコードはそちらを参照してください。

CRF++, Cabochaのインストール(2015/04/01)

備忘録です

Google Codeの閉鎖のお知らせを受け、様々なプロジェクトがGitHubなどに移行しています。

言語処理系のツールに関しても例外ではなく、CRF++, CabochaのGoogleCodeページは閲覧できなくなっています。

しかし、Web上に上がっているCRF++, Cabochaのインストール方法を解説している多くの資料は未だにGoogleCode上のリポジトリを利用する方法を提示しています。OSXで利用できるパッケージマネージャのHomebrewも更新がまだされていないため、

brew install crf++

は失敗します。

CRF++のインストール

CRF++: Yet Another CRF toolkitからソースをダウンロードし、

./configure 
make
sudo make install

を実行してください。

Cabochaのインストール

Yet Another Japanese Dependency Structure Analyzerからソースをダウンロードし、

./configure --with-charset=utf8
make
make check
sudo make install

を実行してください。

ターミナルで

cabocha

が実行できれば成功です。

cakephpでdebug modeを0にすると"The requested address '/' was not found on this server" になる

ハマりました

ルーティングの問題なのかなと思いroutes.phpとにらめっこするも解決せず.

ふとhome.ctpを読む

if (!Configure::read('debug')):
    throw new NotFoundException();
endif;

おい!!!!!!!お前か!!!!!!!!しかもこの記法..

cakephpではdebug modeが0の時はNotFoundExceptionを投げるようになっているんですね. なんかもうちょっと別にやりようはなかったのか.... (それともちゃんとNotFoundExceptionを投げなければいけない理由がある?)

CakePHP2 実践入門 (WEB+DB PRESS plus)

CakePHP2 実践入門 (WEB+DB PRESS plus)

cakephp + ajaxでInternal Server Error

備忘録です

解決策

$this->autoRender = false;

これを加えるとエラーが消える.

理由

  • 調べます

OSXのiTermでタブ文字が入力出来ない

OSXのターミナルアプリでは、sedの条件式にTab文字を使えません(入力出来ない)。

エスケープシーケンス'\t'も解釈してくれません。

解決するには...?

sed s/$'\t'/' '/g

のようにします。

ちなみに、sedよりもtrコマンドを使う方が良いという資料も散見されました。

tr '\t' ' '

これで同じことができます。