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

PHP+MeCabで形態素解析 #1

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

PHPとMeCabの連携はphp_mecabを使った方が高速だが、ateliee/mecabを使った連携の方が環境の準備は手軽。
php_mecabは#2の方で試すとして、まずは手軽な方から。

使用環境

・ Amazon Linux 2
・ PHP 8.2.9
・ MeCab 0.996
・ ateliee/mecab

環境準備

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本体とIPA辞書をインストール。

yum install -y mecab mecab-ipadic

PHPからMeCabを使うため、ateliee/mecabを組み込む。
こちらはComposerでインストール。

composer require ateliee/mecab:"dev-master"

動かしてみる

<?php

require '../vendor/autoload.php';

use meCab\meCab;


// インスタンス生成
$mecab = new meCab();

// 解析
$results = $mecab->analysis('Mecabを試してみました');

// 解析結果の取得例
foreach( $results as $result ) {

    // 試し    動詞,自立,*,*,五段・サ行,連用形,試す,タメシ,タメシ
    echo $result->getStr(), "\n";

    // 試し
    echo $result->getText(), "\n";

    // 動詞
    echo $result->getSpeech(), "\n";

    // 自立, , 
    var_dump( $result->getSpeechInfo() );

    // 五段・サ行
    echo $result->getConjugate(), "\n";

    // 連用形
    echo $result->getConjugateType(), "\n";

    // タメシ
    echo $result->getPronunciation(), "\n";

    // タメシ
    echo $result->getReading(), "\n";

    // 試す
    echo $result->getOriginal(), "\n";

}
PHP

これで動きはするが、インスタンス生成時のコンストラクタで以下のエラーが発生している。

sh: mecab-config: command not found

ライブラリが古いからか、辞書のパスの取得コマンドが今のMeCabのバージョンと合っていないのかなという印象。

パスは任意に辞書を追加しない限り不要なので、エラーの元になっている個所をコメントアウトしておく。
(エラーを回避しているだけで正しく動作する修正ではないので注意。
 辞書周りのメソッドは他にもこのままでは正しく動作しなさそう)

<?php
namespace meCab;

/**
 * Class meCab
 * @package meCab
 */
class meCab{
    private $tmp_file;
    private $dictionary;

    static private $dictionary_dir;
    static private $class_inited;

    function __construct()
    {
        $this->tmp_file = tempnam(sys_get_temp_dir(),'mecab');
        if(!self::$class_inited){
            // self::autoDictionaryDir();
        }
    }

(後略)
vendor/ateliee/mecab/src/meCab.php

所感

ateliee/mecabの動きとしては、解析にかけた文字列を一度tmp配下のファイルに出力し、exec経由でmecabを実行。
ファイルの内容を解析させて、その結果を取得している。

PHPから直接MeCabを実行しているわけではないので、php_mecabを使った方法に比べて遅い。
また、DISK I/Oがかかる。
簡易に使うには便利だが、多量に解析する場合は以下のphp_mecabを検討した方が良い。