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を検討した方が良い。