さくらサーバ上でPHPから形態素解析(Mecab)を使用してみる Mecab導入編


Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 1384

Warning: preg_match_all(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 700

Warning: Invalid argument supplied for foreach() in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 707

Warning: preg_match_all(): Compilation failed: invalid range in character class at offset 4 in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 700

Warning: Invalid argument supplied for foreach() in /home/neginium/www/amimilab/wp/wp-content/plugins/lightbox-plus/classes/shd.class.php on line 707

フォームに入力された日本語を単語に分解して結果を返す、という動作をPHP上で行いたくなったため、形態素解析ソフトMecabのインストールとPHP上で利用する方法をメモ

解析辞書はIPAとNeologdを併用して、精度の高い解析を試みます。

今回は、Mecab本体と辞書のインストール編です。
※本体・辞書ともにUTF-8でインストールします。
※利用端末の文字コードはUTF-8設定にしています。

導入方法
Mecab本体のインストール

端末上に作業ディレクトリを作り、Mecab本体をダウンロード・コンパイル・インストールします。

※作業ディレクトリは”ホームディレクトリ/work/”とします。
※インストール先は”ホームディレクトリ/local/”とします。

>作業ディレクトリを作成して、Mecab本体をダウンロード&解凍

cd ~
mkdir work
cd work
wget http://mecab.googlecode.com/files/mecab-0.996.tar.gz
tar zxvf mecab-0.996.tar.gz

>解凍したディレクトリに移動し、Makefileを作成します。
※設定は、デフォルトのインストール先をホームディレクトリ/local/内に設定し
 使用文字コードをUTF-8のみに設定

cd mecab-0.996
./configure --prefix=`echo ~`/local/ --enable-utf8-only

>コンパイル&インストール

make
make install

以上のコマンドでMecab本体はインストールできましたが、辞書が無いためmecabを実行しようとすると、辞書が無いと怒られてしまいます。

※mecabの実行は以下のコマンドで確認できます

~/local/bin/mecab


なので、次は辞書のインストールをします。

IPA辞書のインストール

Neologd辞書を使うにはIPA辞書の併用を公式サイトでオススメされているので、まずはIPA辞書をインストールします。
(さくらサーバでのインストールでは、辞書が正常にUTF-8でインストールできなかったため、コンパイル手順を自前のものにしています)

>IPA辞書ダウンロード&解凍

cd ~/work/
wget http://mecab.googlecode.com/files/mecab-ipadic-2.7.0-20070801.tar.gz
tar zxvf mecab-ipadic-2.7.0-20070801.tar.gz

>ディレクトリ移動&辞書インストール設定
※設定は、デフォルトインストール先をホームディレクトリ/local/に設定、設定値の取得に自前でインストールしたMecabのmecab-configを利用

cd mecab-ipadic-2.7.0-20070801
./configure --prefix=`echo ~`/local/ --with-mecab-config=`echo ~`/local/bin/mecab-config

>IPA辞書ファイルの文字コードをEUC-JPからUTF-8へ変換
これをしないと、UTF-8の環境からMecabを使用する場合に結果文が文字化けします。

find . -name '*.csv' -exec nkf -Ew --overwrite {} \;
find . -name '*.def' -exec nkf -Ew --overwrite {} \;

>辞書ファイルのコンパイル&インストール

~/local/libexec/mecab/mecab-dict-index
make install

この時点で、Mecabを実行すれば、形態素解析を行うことができます。
試しにコマンドを実行して、文字を入力してみます。

~/local/bin/mecab

形態素解析が難しいひらがなの固有名詞を入力した例
※「のんのんびより」=アニメ作品のひとつです。
  img1

固有名詞が認識されず細かく分解されてしまっています。
なので固有名詞が多く登録されている、Neologd辞書をインストールしてみます。

Neologd辞書インストール

>辞書ファイルのダウンロード
辞書の構成ファイルをgitコマンドでダウンロードします。

cd ~/work/
git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
cd mecab-ipadic-neologd

>辞書ファイルのコンパイル&インストール

普通ならここで、正規の手順として”./bin/install-mecab-ipadic-neologd -n”と入力して実行するのですが、環境のせいか以下のメッセージが表示されて、処理が止まってしまいます。

img2

この原因としては、途中のEUC-JP→UTF-8変換処理で使用している”iconv_euc_to_utf8.sh”スクリプトの先頭が”#!/bin/bash”となっており、さくらサーバには/bin/bashが存在しないため発生しています。


なので、インストール実行前に以下のコマンドを実行し、スクリプトを修正します。

 sed -i -e 's@#!/bin/bash@#!/usr/bin/env bash@' libexec/iconv_euc_to_utf8.sh

修正が完了したら、以下のコマンドを入力して、コンパイル&インストールを続行します。

 mkdir ~/local/lib/mecab/dic/ipadic-neologd
./bin/install-mecab-ipadic-neologd -n --prefix ~/local/lib/mecab/dic/ipadic-neologd --asuser

※オプションの意味は、-n:最新の辞書を持ってくる、–prefix 辞書のインストール先を設定、
 –asuser:ユーザモードでインストール(sudo make installでなく、make installを実行)

インストール途中で以下のように、「[install-mecab-ipadic-neologd] : Do you want to install mecab-ipadic-neologd?」と聞かれるので、「yes」と入力してENTERを押します。

img3

最後に、「[install-mecab-ipadic-neologd] : Finish..」と表示されたら、インストール完了です。
※左側文字化けしてますが、左側はさくらサーバデフォルトのMecab(EUC-JP)が、右側は今回インストールしたMecab(UTF-8)の結果がそれぞれ表示されているためで、問題ありません。

使用例

以下のコマンドで、neologd辞書を使った形態素解析が行えます。
※IPA辞書で解析を行う場合は末尾「-d ~/local/lib/mecab/dic/ipadic-neologd」を指定せずに呼び出します。

 ~/local/bin/mecab -d ~/local/lib/mecab/dic/ipadic-neologd

IPA辞書で試した文をNeologd辞書でも試した例

img4

このように、「のんのんびより」が固有名詞と認識され、より高い精度で形態素解析ができるようになりました。

これでMecabがNeologd辞書で使用できるようになったので、次の投稿(php_mecab導入編)ではこのMecabをPHPから呼び出す方法をご紹介します。

それでは、失礼します。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする