オープンソースこねこね

個人的なwebプログラミングなどについての備忘録です。

2012-05-17

PHPでUnicodeアンエスケープしたJSONを出力する関数

PHP

分がunicodeエスケープされてしまい、「\u65e5\u672c\u8a9e」とか、ぱっと見よくわからん文字列になってしまうので、ちょっとデバッグがし難かったりします。JSONの仕様上では日本語そのままより、このようにエスケープされたほうが正しいようだけど。

PHPのマニュアルを読むとPHP5.4からはオプションにJSON_UNESCAPED_UNICODEを指定するとエスケープしないようなのですが、yumインストールに5.4が対応していなかったりで、ちょっと自分の環境では使えないのでUnicodeエスケープしないラッパー関数を書きました。

参考にさせていただいた情報

http://d.hatena.ne.jp/iizukaw/20090422

コード

/**
 * PHP5.4からでないと対応していないUnicodeアンエスケープをPHP5.3でもできるようにしたラッパー関数
 * @param mixed   $value
 * @param int     $options
 * @param boolean $unescapee_unicode
 */
function json_xencode($value, $options = 0, $unescapee_unicode = true)
{
  $v = json_encode($value, $options);
  if ($unescapee_unicode) {
    $v = unicode_encode($v);
    // スラッシュのエスケープをアンエスケープする
    $v = preg_replace('/\\\\\//', '/', $v);
  }
  return $v;
}

/**
 * Unicodeエスケープされた文字列をUTF-8文字列に戻す。
 * 参考:http://d.hatena.ne.jp/iizukaw/20090422
 * @param unknown_type $str
 */
function unicode_encode($str)
{
  return preg_replace_callback("/\\\\u([0-9a-zA-Z]{4})/", "encode_callback", $str);
}

function encode_callback($matches) {
  return mb_convert_encoding(pack("H*", $matches[1]), "UTF-8", "UTF-16");
}

動作テスト

$a = array("a" => "日本語");
echo json_xencode($a); # {"a":"日本語"}
echo json_encode($a);  # {"a":"\u65e5\u672c\u8a9e"}
2012-05-02

MeCabのインストール手順

先日ベイジアンフィルタを実装した際にCentOSMeCab(形態素解析エンジン)をインストールしたので、そのへんの手順をメモしておきます。ソース直で入れるのは好きではないので、checkinstallでrpmにしてからインストールしています。

checkinstallをインストールする

以前に記事を書いたのでそちらを参照。

http://kohkimakimoto.hatenablog.com/entry/2012/04/15/140128

MeCabをダウンロードしてビルドする

# cd /var/tmp
# wget http://mecab.googlecode.com/files/mecab-0.993.tar.gz
# tar xvzf mecab-0.993.tar.gz
# cd mecab-0.993
# ./configure
# make

※なおMeCabの最新は以下から確認

http://mecab.googlecode.com/svn/trunk/mecab/doc/index.html

MeCabcheckinstallでRPM化してインストール

# cd /var/tmp/mecab-0.993
# checkinstall --install=no
# rpm -ivh /root/rpmbuild/RPMS/i386/mecaitb-0.993-1.i386.rpm

IPA辞書(ipadic)をダウンロードしてビルドする

# cd /var/tmp
# wget http://mecab.googlecode.com/files/mecab-ipadic-2.7.0-20070801.tar.gz
# tar xvzf mecab-ipadic-2.7.0-20070801.tar.gz
# cd mecab-ipadic-2.7.0-20070801
# ./configure --with-charset=utf-8
# make

IPA辞書(ipadic)をcheckinstallでRPM化してインストール

# cd /var/tmp/mecab-ipadic-2.7.0-20070801
# checkinstall --install=no

パッケージ情報を修正。Nameにバージョン番号などが入ってしまっているので以下のようにする。

----------------------
1 -  Summary: [ Package created with checkinstall 1.6.3 ]
2 -  Name:    [ mecab-ipadic ]
3 -  Version: [ 2.7.0 ]
4 -  Release: [ 20070801 ]
5 -  License: [ GPL ]
6 -  Group:   [ Applications/System ]
7 -  Architecture: [ i386 ]
8 -  Source location: [ mecab-ipadic-2.7.0-20070801 ]
9 -  Alternate source location: [  ]
10 - Requires: [  ]
11 - Provides: [ mecab-ipadic-2.7.0 ]
----------------------

# rpm -ivh /root/rpmbuild/RPMS/i386/mecab-ipadic-2.7.0-20070801.i386.rpm

PHPからMeCabを使う場合はphp_mecabをインストールする

pecl.opendogs.org をチャンネルに追加。

# pear channel-discover pecl.opendogs.org
# pear remote-list -c opendogs
# pear install opendogs/mecab-beta

PHPの設定を行う

# echo "extension=mecab.so" > /etc/php.d/mecab.ini
2012-04-20

機械学習 - PHPとMeCabとMySQLでベイジアンフィルタを実装してみた。の続き

機械学習 - PHPとMeCabとMySQLでベイジアンフィルタを実装してみた。

の続きで、上記のPHPベイジアンフィルタを使ってツイッターのツイートをカテゴライズするサービスを作ってみました。↓

ツイート分析

で、作ってみたはいいけど、あんまカテゴリ推定の精度がよくない気がする。。。とりあえず現時点で適当にピックアップしたツイート200件くらい学習させたけど全然足りない? よくわからんす。

2012-04-16

Chrome拡張で入れているもの

ただの個人的メモっす。

code cola (CSSをオンラインで編集)

https://chrome.google.com/webstore/detail/lomkpheldlbkkfiifcbfifipaofnmnkn

Eye Dropper (カラーピッカー)

https://chrome.google.com/webstore/detail/hmdcmlfkchdmnmnmheododdhjedfccka

Bubble Translate (翻訳)

https://chrome.google.com/webstore/detail/jlhlebbhengjlhmcjebbkambaekglhkf?hl=ja

IE Tab (IEエンジン)

https://chrome.google.com/webstore/detail/hehijbfgiekmjfkfjpbkbammjbdenadd

Awesome Screenshot (キャプチャー)

https://chrome.google.com/webstore/detail/alelhddbbhepgpmgidjdcjakblofbmce?hl=ja

2012-04-15

CentOSにcheckinstallをgitからインストールする

最近checkinstallを再インストールしたのですが、ちょっと以前とは仕様などがかわっていたので、メモしておきます。今回はgitからインストールします。

依存パッケージのインストール

# yum install git gcc make gettext rpm-build

checkinstallをインストール

# cd /var/tmp
# git clone http://checkinstall.izto.org/checkinstall.git
# cd checkinstall/
# make
# make install

64bit環境ではエラーとなるバグがあるので、以下で回避

# ln -s /usr/local/lib/installwatch.so /usr/local/lib64/installwatch.so

checkinstallをRPM化する

デフォルトでPRMを作成するディレクトリが/root/rpmbuild配下のようなのでディレクトリを作る

# mkdir -p /root/rpmbuild/SOURCES

checkinstallを実行

# cd /var/tmp/checkinstall
# checkinstall --install=no

RPMで再インストール

# cd /root/rpmbuild/RPMS/i386
# rpm -ivh checkinstall-20120324-1.i386.rpm

※64bit環境などだとi386部分がx86_64とかに変わると思うので適宜読み替えてください

最後にパッケージのインストール状況を確認して終わり。

# rpm -qi checkinstall
# rpm -ql checkinstall
2012-04-06

機械学習 - PHPとMeCabとMySQLでベイジアンフィルタを実装してみた。

PHPMeCabMySQLを使ってベイジアンフィルタを実装してみました。ひとまず動くようにはなったので公開します。機械学習によってテキストドキュメントの自動分類ができます。

高校数学すら忘れてしまっていたので、ついでに条件付き確率などを基礎から勉強してみたが、残念ながらあんまり理解していないです。

さて、実装したベイジアンフィルタですが、機械学習やカテゴリ推定のアルゴリズム部分はPHPで書いて、学習データはMySQLに保存するようにしてあります。ソースはgithubに置きました

https://github.com/kohkimakimoto/BayesClassifier 

使い方など

あとで書きます。。。

あと、カテゴリ推定のサンプルなども書く。。。

2012/04/20 - 追記

サービス作ってみました。

http://kohkimakimoto.hatenablog.com/entry/2012/04/20/125341

参考にしたサイトなど

http://gihyo.jp/dev/serial/01/machine-learning/0003

上記のサイトの他に、以前購入したWeb DB Press総集編に収録されている伊藤直也氏による記事も参考にしました(Vol56のアルゴリズムの連載記事)。というかアルゴリズムの部分は、ほとんどこの記事にあったPerlのコードをPHPに置き換えた感じです。

 

2012-03-18

CentOSでRPMのソースを取得する

rpmでパッケージ管理されているプログラムのソースをもってくる手順。

yum-utilsのインストール

# yum install yum-utils

RPM、ビルド周りのツールをインストール

# yum install gcc make gettext rpm-build

SRPMリポジトリ設定を追加

# cp -p /etc/yum.repos.d
# cp -p CentOS-Base.repo CentOS-Base.repo.bak
# vim CentOS-Base.repo
# 以下を追加
[base-src]
name=CentOS-$releasever - Bese -src
baseurl=http://vault.centos.org/5.6/os/SRPMS/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

[updates-src]
name=CentOS-$releasever - Updates - src
baseurl=http://vault.centos.org/5.6/updates/SRPMS/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

ソース(SRPM)のダウンロード

# yumdownloader --source httpd

デフォルトでカレントディレクトリにダウンロードされる

SRPMを展開

# rpm -ivh httpd-2.2.3-45.el5.centos.1.src.rpm

デフォルトで以下に解凍される

/usr/src/redhat/SOURCES  - ソース
/usr/src/redhat/SPECS    - specファイル

参考サイトなど

    http://win2linux.sourceforge.jp/goodapps/RPM.html

    http://wiki.centos.org/HowTos/RebuildSRPM