【PHP】MeCabの導入手順と利用方法

phpでMeCabを利用できるようにするまでの備忘録です。

## 導入環境
今回導入する環境です。

```bash
$ cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
$ php -v
PHP 5.4.16 (cli) (built: Nov 15 2017 16:33:54)
```

## MeCabを導入
公式サイトの手順に従って作業を進めます。
URL：<a href="http://taku910.github.io/mecab/" rel="noopener" target="_blank">http://taku910.github.io/mecab/</a>

```bash
$ cd /usr/local/src
$ wget "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7cENtOXlicTFaRUE" -O mecab-0.996.tar.gz
$ cd mecab-0.996/
$ ./configure --with-charset=utf8
$ make
$ make install
```

<strong style="color:red;">※ エラーが発生した場合の対処法を下記に載せておきます。</strong>

### エラー発生(その1)

```bash
$ ./configure
checking for a BSD-compatible install... /bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking for gcc... no
checking for cc... no
checking for cl.exe... no
configure: error: in `/usr/local/src/mecab-0.996':
configure: error: no acceptable C compiler found in $PATH
See `config.log' for more details
```

下記コマンドを実行します。

```bash
$ sudo yum install gcc
```

### エラー発生(その2)

```bash
$ ./configure
(省略)
checking if g++ supports stl <vector> (required)... configure: WARNING: g++ stl <vector> does not work
checking if g++ supports stl <list> (required)... configure: WARNING: g++ stl <list> does not work
checking if g++ supports stl <map> (required)... configure: WARNING: g++ stl <map> does not work
checking if g++ supports stl <set> (required)... configure: WARNING: g++ stl <set> does not work
checking if g++ supports stl <queue> (required)... configure: WARNING: g++ stl <queue> does not work
checking if g++ supports stl <functional> (required)... configure: WARNING: g++ stl <functional> does not work
checking if g++ supports stl <algorithm> (required)... configure: WARNING: g++ stl <algorithm> does not work
checking if g++ supports stl <string> (required)... configure: WARNING: g++ stl <string> does not work
checking if g++ supports stl <iostream> (required)... configure: WARNING: g++ stl <iostream> does not work
checking if g++ supports stl <sstream> (required)... configure: WARNING: g++ stl <sstream> does not work
checking if g++ supports stl <fstream> (required)... configure: WARNING: g++ stl <fstream> does not work
checking if g++ supports template <class T> (required)... configure: WARNING: g++ template <class T> does not work
checking if g++ supports const_cast<> (required)... configure: WARNING: g++ const_cast<> does not work
checking if g++ supports static_cast<> (required)... configure: WARNING: g++ static_cast<> does not work
checking if g++ supports reinterpret_cast<> (required)... configure: WARNING: g++ reinterpret_cast<> does not work
checking if g++ supports namespaces (required) ... no
checking if g++ supports \__thread (optional)... no
configure: WARNING: \__thread keyword is not supported on this environment. Error handling of MeCab, e.g., MeCab::getLastError(), is not thread safe.
checking if g++ supports template <class T> (required)... configure: WARNING: g++ template <class T> does not work
checking if g++ supports GCC native atomic operations (optional)... no
checking if g++ supports OSX native atomic operations (optional)... no
checking if g++ environment provides all required features... no
configure: error: Your compiler is not powerful enough to compile MeCab.         If it should be, see config.log for more information of why it failed.
```

下記コマンドを実行します。

```bash
$ sudo yum install gcc-c++
```

## IPA辞書を導入
公式で推奨されているMeCab用のIPA辞書をインストールします。

```bash
$ wget "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7MWVlSDBCSXZMTXM" -O mecab-ipadic-2.7.0-20070801.tar.gz
$ tar zxfv mecab-ipadic-2.7.0-20070801.tar.gz
$ cd mecab-ipadic-2.7.0-20070801
$ ./configure --with-charset=utf8
$ make
$ make install
```

## 動作確認
インストールしたMeCabの動作確認を行います。問題なければ下記のように出力されます。

```bash
$ echo すもももももももものうち | mecab
すもも	名詞,一般,\*,*,*,*,すもも,スモモ,スモモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
うち	名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS
```

### 文字化けが発生した場合
文字化けが発生したら./configureにオプションが正しく付与されているか確認しましょう。
間違えた場合はアンイストール(make uninstall)して最初から作業します。

```bash
$ echo すもももももももものうち | mecab
すもももももももものうち	����,����,*,*,*,*,*
EOS
```

## php-macabをインストール
phpでMeCabを利用するためにphp-mecabをインストールします。

```bash
$ git clone https://github.com/rsky/php-mecab.git
$ cd php-mecab/mecab/
$ phpize
$ ./configure --with-mecab=/usr/local/src/mecab-0.996/mecab-config
$ make
$ make test
$ make install

$ ls /usr/lib64/php/modules/ | grep mecab # 出力確認
mecab.so

$ vim /etc/php.d/mecab.ini # 新規ファイルを作成
# 下記コードを記載
extension=mecab.so

$ service httpd restart # apacheを再起動
$ php -m | grep mecab # phpモジュールにmecabが含まれることを確認
mecab
```

<strong style="color:red;">※ エラーが発生した場合の対処法を下記に載せておきます。</strong>
### エラー発生(その1)

```bash
$ git clone https://github.com/rsky/php-mecab.git
-bash: git: command not found
```

下記コマンドを実行します。

```bash
$ sudo yum install git
```

### エラー発生(その2)

```bash
$ phpize
Can't find PHP headers in /usr/include/php
The php-devel package is required for use of this command.
```

下記コマンドを実行します。

```bash
$ sudo yum install php-devel
```

## phpでMeCabを利用する
phpでMeCabを利用するサンプルコードです。

```php:mecab_test.php
<?php
$str = 'すもももももももものうち';

$mecab = new Mecab_Tagger();
$nodes = $mecab->parseToNode($str);
foreach ($nodes as $n) {
    $items = $n->getFeature();
    echo $items . PHP_EOL;
}
```

```bash
$ php mecab_test.php
BOS/EOS,*,*,*,*,*,*,*,*
名詞,一般,*,*,*,*,すもも,スモモ,スモモ
助詞,係助詞,*,*,*,*,も,モ,モ
名詞,一般,*,*,*,*,もも,モモ,モモ
助詞,係助詞,*,*,*,*,も,モ,モ
名詞,一般,*,*,*,*,もも,モモ,モモ
助詞,連体化,*,*,*,*,の,ノ,ノ
名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
BOS/EOS,*,*,*,*,*,*,*,*
```

お疲れ様でした。