KLab若手エンジニアの これなぁに?

KLab株式会社の若手エンジニアによる技術ブログです。phpやRubyなどの汎用LLやJavaScript/actionScript等のクライアントサイドの内容、MySQL等のデータベース、その他フレームワークまで幅広く面白い情報を発信します。

2008年12月

MeCabを使った形態素解析1

どうも、相変わらず暴君なyoshida-kです。 今日はMeCabというオープンソースな形態素解析エンジンをphpから利用して見ましょうというお話です。 MeCabを使うと文章を単語に分割したり、分割された単語がどういったものなのかという情報を取得したりできます。 まずは、MeCabをインストールしてみましょう。 リンク先を見ればインストール方法は明らかですが、とりあえず順を追って説明します。 1.sourceforge.netよりMeCabのソースをDownload 2.任意のディレクトリにDownloadしてきたアーカイブを展開 tar -zxvf ./mecab-x.y.tar.gz 的なw 3.mecabのコンパイルを行う。 普通のアプリと同じでconfigureしてmake , make installな感じです。 ディレクトリ内にあるINSTALLファイルを見るととりあえずやり方が書いてあったりします。 ここまでやるととりあえずmecabがインストールされるわけですが、コレだけではmecabはちゃんと動きません。 mecabを動かすには辞書が必要です。 辞書も先ほどのsourceforgeのところからdownloadできるので同様に展開⇒make installしてください。 さて、この状態でmecabを起動することが可能となりました。 mecabを起動すると形態素解析をしてくれます。 よく使われている例ですが 「すもももももももものうち」と入力すると
すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
このような形に出力してくれます。 さて、いよいよPHPでこのMeCabを利用するためにPHPのExtensionをインストールしましょう。 MeCabのPHP ExtensionはこちらのPage2さんが公開してくださってます。 インストール方法は phpize ⇒ configure ⇒ make ⇒ make installです。 インストールが完了したらphp.iniのモジュール読み込みの設定にmecab.soを追加しましょう。 さて、以下の内容がテストコードです。 うまくいくと、mecabを起動して実行したものと同じ結果が出力されます。
<?php
   dl("mecab.so");

   $mecab = mecab_new();
   $string = "すもももももももものうち";

   print mecab_sparse_tostr( $mecab , $str );

   mecab_destroy();
 ?>
いかがでしょう? コレだけではまだ実用性にかけるので次回はもうちょっと実用的な内容を紹介させていただきます。

HTTP/POSTリクエストでiモードIDを取得

amo-kです。 ちょっとした覚書です。 ドコモのiモードIDの取得で若干はまったので記録の意味で書いておきます。 通常のリンク(HTTP/GET)だと
任意のURL?guid=ON
例) http://example.com/?guid=ON
といった形でリンクURLにクエリパラメータを付加すれば ドコモGWでONの部分がiモードIDに置換され HTTPサーバ側では
任意のURL?guid=iモードID
例) http://example.com/?guid=abcdefg
というリクエストを受ける。 これは何も引っかからない。 しかしformでHTTP/POSTリクエストする際が引っかかった。 POSTメソッドの場合、直感的には input要素のname属性値にguid、value属性値にON つまり以下のように指定するように想像する。
<input type="hidden" name="guid" value="ON" />
しかし実は formタグのaction属性値に
<form method="post" action="path/?guid=ON">
と指定しなければ取得できない。 ということで覚書でしたw

デスソースとは

どうも 先日 KLab男塾に入塾致しました、yoshida-kです。 初投稿がいきなり技術以外のネタですが、ちょいとデスソースについて語らせていただきます。
デスソース


デスソースとはアメリカのBlairという会社から出ているホットソース(タバスコみたいなモノ)で、とにかく辛いソースです。 どれくらい辛いか? なんか、 とても、 痛いデスw 鍋一杯のスープに味付け程度に3滴たらしただけでデスソースの味しかしなくなるほど強烈です。 あまりコレでは伝わりませんか。 では数値で表してみましょう。 唐辛子の辛さを図る単位が世の中にはあるらしく


(SHUと表記する)というらしいです。 通常のタバスコは約2000SHUに対して我々が使用しているアフターデスソースは50000SHUと実に約25倍という脅威の辛さw しかも、このデスソースはさらに上には上があるらしく、日本国内でも販売されているサドンデスソースは約50000~100000(調べたが結構な開きがあるらしい)とさらに危ない。


キーホルダ
すでに、自宅用に購入しちゃいましたがw そんなデスソースは実は味もしっかり考えられていて、パスタやピザはもちろん焼きうどんやペヤングソースやきそばにもマックのナゲットだろうと何だって合います。 さらに、デスソースにはこんなカッコいいスカルなキーホルダが1つついてきます。 (お徳用パックのmini4本セットには2つついてきます。) こいつをジャラジャラと提げている人を見かけたら激辛党員だと思って間違いありません。 ちなみにyoshida-kの目標は1年内にこのキーホルダでウォレットチェーンを作ることですw こんな素敵なデスソースがあれば職場の人間関係も円滑で刺激的なものになると思います。

C/C++ のコードを Flash Player 上で動かす Alchemy

たかだです。 先日 Adobe Labs が C/C++ のコードを Flash Player 向けにコンパイルする Alchemy というプロジェクトをプレビューリリースしました。 Alchemy は llvm を利用し、C/C++ のコードを ActionScript3(ActionScript ByteCode ではありません)に変換し、それを SWF または SWC 形式にコンパイルします。 llvm の最適化処理によって、しばしばネイティブの ActionScript より高速に動作するそうです。 新しもの好きのわたしが早速こちらを動かしてみたいと思います。 以下 Alchemy:Documentation:Getting Started を参考に、Windows+Cygwin 環境で Alchemy を動かします。 必要なものは、以下の通りです。
  • Cygwin
  • (Cygwin上で動く)Perl
  • (Cygwin上で動く)zip
  • (Cygwin上で動く)gcc/g++
  • Java
  • Flex 3.2 SDK

Flex のインストール

最初に Flex 3.2 SDK をインストールします。Flex SDK は以下から 3.2 をダウンロードしてください。 (Cygwin および Java などのインストールについては以下では解説しません)。 解凍し、適当なパスに置いてください。 Cygwin 上で Flex SDK に Path を通す必要があります。 ここでは Flex SDK のインストール先を C:/develop/flex_sdk_3/ とします。 以下を .bashrc などに書きくわえてください。

PATH=/cygdrive/c/develop/flex_sdk_3/bin/:$PATH
export PATH
正しくパスが通っていれば、以下のようになるはずです。

$ mxmlc -version
Version 3.2.0 build 3958

Alchemy のインストール

Adobe Labs より「Alchemy Toolkit for Cygwin on Windows」をダウンロードし、適切な場所に解凍しておきます。 (以下では C:/develop/alchemy-cygwin/ に解凍したものとします)。 最初に config というスクリプトを実行します。

$ cd /cygdrive/c/develop/alchemy-cygwin/
$ ./config 
Generating alchemy-setup...
Turning execution bit on for Alchemy binaries...

Add "source /cygdrive/c/develop/alchemy-cygwin/alchemy-setup" to your login script.
  "alc-home" takes you to the Alchemy install folder.
  "alc-on" puts Alchemy gcc toolchain replacements at the front of your path.
  "alc-off" restores original path.
  "alc-util" shows you various Alchemy-related environment vars
You need Flash 10 or AIR 1.5 and the Flex 3.2 SDK installed for testing.
以上により alchemy-setup が生成され、alchemy ツールのいくつかが使えるようになりました。 alchemy-setup というシェルスクリプトを実行することで必要な環境変数を設定し、alc-on などのコマンドを呼び出せるようになります。 ただし、こちらを実行する前に Air Debug Launcher(ADL)のパスを alchemy-setup に追加しておく必要があります。ADL は Flexディレクトリの bin/ 以下にある adl.exe というファイルです。 alchemy-setup を編集し、ADL のパスを追加してください。 (以下は alchemy-setup に書き加えます)。

export ADL=/cygdrive/c/develop/flex_sdk_3/bin/adl.exe
ログイン時に、alchemy-setupが実行されるようにするため、.bashrcを変更します。Adobe Labsのgetting startedには、achacksディレクトリをPATHに追加するように書いてありますが、追加しない方がよいようです。 (alchemy-setupの場所は、設定に応じて変更してください)。 (以下は.bashrcに書き加えます)。

source /cygdrive/c/develop/alchemy-cygwin/alchemy-setup
alchemy-cygwin/bin/llvm-stub にシンボリックリンクをはる必要もあるようです

cd bin/
ln -s llvm-stub llvm-stub.exe
以上が終わったら、Cygwinにログインし直し環境変数の設定が更新されるようにします。 (単に source .bashrc を実行するだけでもかまいません)。

C コードのコンパイル

以上までで alc-on / alc-off というコマンドを利用できるようになりました。 alc-on を実行すると gcc コマンドの参照先が alchemyプロジェクトのものに変更され、alc-off で元に戻ります。

$ alc-on
$ which gcc
/cygdrive/c/develop/alchemy-cygwin/achacks/gcc
さっそくサンプルプログラムをコンパイルしましょう。alchemy のディレクトリの中にすでにサンプルプログラムが用意されています。 ここでは、stringecho.c というコードをコンパイルします。 コードを一部だけのぞいてみましょう。以下のようなC言語の関数が定義されています。引数が null かどうかチェックし、AS3_String 型にして返すだけの関数のようです。

static AS3_Val echo(void* self, AS3_Val args)
{
	//initialize string to null
	char* val = NULL;
	
	//parse the arguments. Expect 1.
	//pass in val to hold the first argument, which
	//should be a string
	AS3_ArrayValue( args, "StrType", &val );
	
	//if no argument is specified
	if(val == NULL)
	{
		char* nullString = "null";
		//return the string "null"
		return AS3_String(nullString);
	}
	
	//otherwise, return the string that was passed in
	return AS3_String(val);
}

alc-on の状態で、gcc コマンドを利用し、コンパイルします。

$ cd /cygdrive/c/develop/alchemy-cygwin/samples/stringecho/
$ gcc stringecho.c -Wall -swc -o stringecho.swc
WARNING: While resolving call to function 'main' arguments were dropped!

4328.achacks.swf, 363894 bytes written
frame rate: 60
frame count: 1
69 : 4
72 : 363824
76 : 33
1 : 0
0 : 0
frame rate: 24
frame count: 1
69 : 4
77 : 506
64 : 31
63 : 16
65 : 4
9 : 3
41 : 26
82 : 471
1 : 0
0 : 0
converting to DOS line endings
catalog.xml: done.
  adding: catalog.xml (deflated 75%)
  adding: library.swf (deflated 61%)
$ ls -l
total 149
drwx------+ 2 takada-at ????????         0 Dec  1 10:02 as3
-r-x------+ 1 takada-at ????????       435 Nov 13 10:20 readme.txt
-r-x------+ 1 takada-at ????????      1221 Nov 13 10:20 stringecho.c
-rwxr-xr-x  1 takada-at mkgroup-l-d 144137 Dec  1 11:07 stringecho.swc
SWC ファイルが生成されました! 生成された SWC ファイルはライブラリとして ActionScript コードの中で利用できます。 stringecho.swc は、引数として渡された文字列を、そのまま返すだけの関数を提供しています。 ここでは、以下のような mxml コードを利用して、このライブラリの動作を試してみましょう。以下を、Hello.mxml として保存し、同じディレクトリに stringecho.swc も置きます。

<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="main()">
    <mx:Label text="aaa" id="labelone" fontSize="24" />
    <mx:Script><![CDATA[
        public function main():void{
            import cmodule.stringecho.CLibInit;
            var lib:CLibInit = new CLibInit();
            var stringEcho:Object = lib.init();
            labelone.text = stringEcho.echo("Hello!");
        }
    ]]></mx:Script>
</mx:Application>
SWFファイルとしてコンパイルします。target-player の指定を忘れないように注意してください。

$ mxmlc.exe -library-path+=./stringecho.swc Hello.mxml -target-player=10.0.0
設定ファイル "C:\develop\flex_sdk_3\frameworks\flex-config.xml" をロードしています
C:\develop\alchemy-cygwin\samples\stringecho\Hello.swf (461380 bytes)
生成されたSWFファイルをブラウザにドラッグすると...? 期待通り、Helloの文字が表示されました。
 KLab若手エンジニアブログのフッター