make is.dev make it simple. development.
2024年5月23日

PHP+MeCabで形態素解析 #2

MeCabを使って形態素解析を試してみる。
PHPとMeCabの連携にはphp_mecabを使う。

ソースからビルドしないといけないのでやや面倒だったりハマッたり。
環境によってはビルドからのインストール自体が難しかったり。
…と、扱いに困るケースもあるが、処理性能は#1(execを経由する実行)の方法より格段に早い。
多量に解析にかけるなら、こちらの方法を取った方が良い。

#1(execを経由する実行)は以下を参照

使用環境

・ Amazon Linux 2
・ PHP 8.2.9
・ MeCab 0.996

環境準備

MeCabをyumでインストールするため、Groongaリポジトリを追加する。

amazon-linux-extras install -y epel
yum install -y https://packages.groonga.org/amazon-linux/2/groonga-release-latest.noarch.rpm

上記はAmazon Linux2での例。
OS毎に入れ方が異なるので、詳細は以下公式ドキュメントを参照。

https://groonga.org/ja/docs/install.html

epelはGroongaの追加に必要なので先に入れる。

続いて、MeCab本体とdevel(php-mecabのビルドに必要)、IPA辞書をインストール。

yum install -y mecab mecab-devel mecab-ipadic

PHPからMeCabを使えるようにするため、php-mecabをインストールしていく。
ソースからビルドする必要があるため、先に以下をインストールする(既に入っている場合はスキップ)

yum install -y git
yum install -y gcc
yum install -y php-devel

まずは、php-mecabのソースを取得。
(gitが入っていない場合エラーになるので、先に入れる)

git clone https://github.com/ranvis/php-mecab.git

php-mecabというフォルダが出来るので、そこに移動してphpizeでコンパイルを実行。
(php-develが入っていない場合エラーになるので、先に入れる)

cd php-mecab/mecab/
phpize

続けて、configureする。
(mecab-develやgccが入っていない場合エラーになるので、先に入れる)

./configure --with-mecab=/usr/bin/mecab-config

mecab-configのパスが mecab-devel のインストールの仕方により異なる場合があるので必要に応じてパスを調整。
mecab-configのnot foundでエラーとなる場合、mecab-develが入っていない事の他、パスが違うことも疑った方が良い。

makeとインストールを実行。

make
make test
make install

ここまで上手くいったら、以下のパスにmecab.soが出来ていることを確認。

ls /usr/lib64/php/modules/ | grep mecab

PHPにmecab.soを読み込ませるため、mecab.iniを作成。
(環境によってはphp.iniへの追記など)

vi /etc/php.d/mecab.ini
extension=mecab.so
/etc/php.d/mecab.ini

動かしてみる

<?php

// インスタンスを生成
$mecab = new \MeCab\Tagger();

// 解析
$nodes = $mecab->parseToNode( 'MeCabを試してみました' );

// 解析結果の取得例
foreach ( $nodes as $node ) {

    // BOS/EOSはスキップ
    if ( $node->getStat() >= 2 ) {
        continue;
    }

    // 分解された文字列 (例:試し)
    echo $node->getSurface(), "\n";

    // 品詞ID (例:31)
    echo $node->getPosId(), "\n";

    // 区分(0.通常、1.不明(未知語)、2.BOS(文頭)、3.EOS(文末) ※BOS、EOSはヘッダとフッタ)
    echo $node->getStat(), "\n";

    // 情報をまとめた文字列 (例:動詞,自立,*,*,五段・サ行,連用形,試す,タメシ,タメシ)
    echo $node->getFeature(), "\n";

}
PHP

getPosId() で取得出来る品詞IDのリストは以下。
getFeature() の取得結果の頭に同じ内容が含まれるので、IDから引くよりもこちらを使った方が扱いやすいかもしれない。

その他,間投,*,* 0
フィラー,*,*,* 1
感動詞,*,*,* 2
記号,アルファベット,*,* 3
記号,一般,*,* 4
記号,括弧開,*,* 5
記号,括弧閉,*,* 6
記号,句点,*,* 7
記号,空白,*,* 8
記号,読点,*,* 9
形容詞,自立,*,* 10
形容詞,接尾,*,* 11
形容詞,非自立,*,* 12
助詞,格助詞,一般,* 13
助詞,格助詞,引用,* 14
助詞,格助詞,連語,* 15
助詞,係助詞,*,* 16
助詞,終助詞,*,* 17
助詞,接続助詞,*,* 18
助詞,特殊,*,* 19
助詞,副詞化,*,* 20
助詞,副助詞,*,* 21
助詞,副助詞/並立助詞/終助詞,*,* 22
助詞,並立助詞,*,* 23
助詞,連体化,*,* 24
助動詞,*,*,* 25
接続詞,*,*,* 26
接頭詞,形容詞接続,*,* 27
接頭詞,数接続,*,* 28
接頭詞,動詞接続,*,* 29
接頭詞,名詞接続,*,* 30
動詞,自立,*,* 31
動詞,接尾,*,* 32
動詞,非自立,*,* 33
副詞,一般,*,* 34
副詞,助詞類接続,*,* 35
名詞,サ変接続,*,* 36
名詞,ナイ形容詞語幹,*,* 37
名詞,一般,*,* 38
名詞,引用文字列,*,* 39
名詞,形容動詞語幹,*,* 40
名詞,固有名詞,一般,* 41
名詞,固有名詞,人名,一般 42
名詞,固有名詞,人名,姓 43
名詞,固有名詞,人名,名 44
名詞,固有名詞,組織,* 45
名詞,固有名詞,地域,一般 46
名詞,固有名詞,地域,国 47
名詞,数,*,* 48
名詞,接続詞的,*,* 49
名詞,接尾,サ変接続,* 50
名詞,接尾,一般,* 51
名詞,接尾,形容動詞語幹,* 52
名詞,接尾,助数詞,* 53
名詞,接尾,助動詞語幹,* 54
名詞,接尾,人名,* 55
名詞,接尾,地域,* 56
名詞,接尾,特殊,* 57
名詞,接尾,副詞可能,* 58
名詞,代名詞,一般,* 59
名詞,代名詞,縮約,* 60
名詞,動詞非自立的,*,* 61
名詞,特殊,助動詞語幹,* 62
名詞,非自立,一般,* 63
名詞,非自立,形容動詞語幹,* 64
名詞,非自立,助動詞語幹,* 65
名詞,非自立,副詞可能,* 66
名詞,副詞可能,*,* 67
連体詞,*,*,* 68