読者です 読者をやめる 読者になる 読者になる

めもりーあろけーと

技術的な話とか日常的な話とか。

PHP7にMeCabを導入する。

メモです。

使うまでの準備

epelリポジトリのインストール

$ sudo yum install epel-release

次にMeCabをインストールため、リポジトリを追加します。

$ sudo rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm

MeCabをインストールします。

$ sudo yum install mecab mecab-devel mecab-ipadic

MeCabがインストールされたか確認します。

$ mecab --version
mecab of 0.996

次にPHP7をインストールするためremiリポジトリを追加します。

$ sudo rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

PHP7をインストールします。

$ sudo yum install --enablerepo=remi,remi-php70 php php-common php-devel php-mbstring

PHP7がインストールされているか確認します。

$ php -v
PHP 7.0.7 (cli) (built: May 25 2016 18:28:00) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies

次にMeCabPHPで使うための準備を行います。 githubからphp-mecabを入れます

$ git clone https://github.com/rsky/php-mecab.git
$ cd php-mecab/mecab
$ sudo yum install libtool
$ phpize
$ ./configure
$ make
$ sudo make install

PHPのiniの設定を変更します。

sudo php -r "\$h=fopen('/etc/php.ini','a');fwrite(\$h,'extension=mecab.so'.\"\n\");"

mecabモジュールがインストールされているか確認します

$ php -m | grep mecab
mecab

これで全ての準備完了です。

MeCabが動くか試してみる

PHPMeCabが動くか試してみます。

<?php

echo (new MeCab\Tagger())->parse('MeCab は 京都大学情報学研究科−日本電信電話株式会社コミュニケーション科学基礎研究所
共同研究ユニットプロジェクトの一環として開発されたオープンソース形態素解析エンジンです.
言語, 辞書, コーパスに依存しない汎用的な設計を基本方針としています.');

下記が実行結果です

MeCab    名詞,固有名詞,組織,*,*,*,*
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
京都大   名詞,固有名詞,組織,*,*,*,京都大,キョウトダイ,キョートダイ
学 名詞,接尾,一般,*,*,*,学,ガク,ガク
情報  名詞,一般,*,*,*,*,情報,ジョウホウ,ジョーホー
学 名詞,接尾,一般,*,*,*,学,ガク,ガク
研究  名詞,サ変接続,*,*,*,*,研究,ケンキュウ,ケンキュー
科 名詞,接尾,一般,*,*,*,科,カ,カ
− 記号,一般,*,*,*,*,−,ヒク,ヒク
日本電信電話  名詞,固有名詞,組織,*,*,*,日本電信電話,ニホンデンシンデンワ,ニホンデンシンデンワ
株式会社    名詞,一般,*,*,*,*,株式会社,カブシキガイシャ,カブシキガイシャ
コミュニケーション 名詞,一般,*,*,*,*,コミュニケーション,コミュニケーション,コミュニケーション
科学  名詞,一般,*,*,*,*,科学,カガク,カガク
基礎  名詞,一般,*,*,*,*,基礎,キソ,キソ
研究所   名詞,一般,*,*,*,*,研究所,ケンキュウジョ,ケンキュージョ
共同  名詞,サ変接続,*,*,*,*,共同,キョウドウ,キョードー
研究  名詞,サ変接続,*,*,*,*,研究,ケンキュウ,ケンキュー
ユニット    名詞,一般,*,*,*,*,ユニット,ユニット,ユニット
プロジェクト  名詞,一般,*,*,*,*,プロジェクト,プロジェクト,プロジェクト
の 助詞,連体化,*,*,*,*,の,ノ,ノ
一環  名詞,一般,*,*,*,*,一環,イッカン,イッカン
として   助詞,格助詞,連語,*,*,*,として,トシテ,トシテ
開発  名詞,サ変接続,*,*,*,*,開発,カイハツ,カイハツ
さ 動詞,自立,*,*,サ変・スル,未然レル接続,する,サ,サ
れ 動詞,接尾,*,*,一段,連用形,れる,レ,レ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
オープン    名詞,サ変接続,*,*,*,*,オープン,オープン,オープン
ソース   名詞,一般,*,*,*,*,ソース,ソース,ソース
形態素   名詞,一般,*,*,*,*,形態素,ケイタイソ,ケイタイソ
解析  名詞,サ変接続,*,*,*,*,解析,カイセキ,カイセキ
エンジン    名詞,一般,*,*,*,*,エンジン,エンジン,エンジン
です  助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
.   名詞,サ変接続,*,*,*,*,*
言語  名詞,一般,*,*,*,*,言語,ゲンゴ,ゲンゴ
,   名詞,サ変接続,*,*,*,*,*
辞書  名詞,一般,*,*,*,*,辞書,ジショ,ジショ
,   名詞,サ変接続,*,*,*,*,*
コーパス    名詞,一般,*,*,*,*,コーパス,コーパス,コーパス
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
依存  名詞,サ変接続,*,*,*,*,依存,イゾン,イゾン
し 動詞,自立,*,*,サ変・スル,未然形,する,シ,シ
ない  助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ
汎用  名詞,一般,*,*,*,*,汎用,ハンヨウ,ハンヨー
的 名詞,接尾,形容動詞語幹,*,*,*,的,テキ,テキ
な 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
設計  名詞,サ変接続,*,*,*,*,設計,セッケイ,セッケイ
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
基本  名詞,一般,*,*,*,*,基本,キホン,キホン
方針  名詞,一般,*,*,*,*,方針,ホウシン,ホーシン
と 助詞,格助詞,一般,*,*,*,と,ト,ト
し 動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
て 助詞,接続助詞,*,*,*,*,て,テ,テ
い 動詞,非自立,*,*,一段,連用形,いる,イ,イ
ます  助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
.   名詞,サ変接続,*,*,*,*,*
EOS

これで動いていることを確認しました。 では、これをPHPで扱いやすいように変換しましょう。

<?php

$result = explode("\n", rtrim((new MeCab\Tagger())->parse('MeCab は 京都大学情報学研究科−日本電信電話株式会社コミュニケーション科学基礎研究所
共同研究ユニットプロジェクトの一環として開発されたオープンソース形態素解析エンジンです.
言語, 辞書, コーパスに依存しない汎用的な設計を基本方針としています.')));

$analysis = [];
foreach ($result as $line) {
    // 行を分解する
    $exploded  = explode("\t", $line);
    if (empty($exploded[1])) continue;
    $word = $exploded[0];
    $details = $exploded[1];

    if (!isset($analysis[$word])) {
        $analysis[$word] = [
            // 出現回数
            'occurrences' => 0,
            // 文字列の詳細の格納場所
            'details' => []
        ];
    }
    $analysis[$word]['occurrences']++;
    $analysis[$word]['details'][] = explode(",", $details);
}

print_r($analysis);

出力結果は下記のようになります。

Array
(
    [MeCab] => Array
        (
            [occurrences] => 1
            [details] => Array
                (
                    [0] => Array
                        (
                            [0] => 名詞
                            [1] => 固有名詞
                            [2] => 組織
                            [3] => *
                            [4] => *
                            [5] => *
                            [6] => *
                        )

                )

        )

    [は] => Array
        (
            [occurrences] => 1
            [details] => Array
                (
                    [0] => Array
                        (
                            [0] => 助詞
                            [1] => 係助詞
                            [2] => *
                            [3] => *
                            [4] => *
                            [5] => *
                            [6] => は
                            [7] => ハ
                            [8] => ワ
                        )

                )

        )

    [京都大] => Array
        (
            [occurrences] => 1
            [details] => Array
                (
                    [0] => Array
                        (
                            [0] => 名詞
                            [1] => 固有名詞
                            [2] => 組織
                            [3] => *
                            [4] => *
                            [5] => *
                            [6] => 京都大
                            [7] => キョウトダイ
                            [8] => キョートダイ
                        )

                )

        )

    [学] => Array
        (
            [occurrences] => 2
            [details] => Array
                (
                    [0] => Array
                        (
                            [0] => 名詞
                            [1] => 接尾
                            [2] => 一般
                            [3] => *
                            [4] => *
                            [5] => *
                            [6] => 学
                            [7] => ガク
                            [8] => ガク
                        )

                    [1] => Array
                        (
                            [0] => 名詞
                            [1] => 接尾
                            [2] => 一般
                            [3] => *
                            [4] => *
                            [5] => *
                            [6] => 学
                            [7] => ガク
                            [8] => ガク
                        )

                )

        )

    [情報] => Array
        (
            [occurrences] => 1
            [details] => Array
                (
                    [0] => Array
                        (
                            [0] => 名詞
                            [1] => 一般
                            [2] => *
                            [3] => *
                            [4] => *
                            [5] => *
                            [6] => 情報
                            [7] => ジョウホウ
                            [8] => ジョーホー
                        )

                )

        )

    [研究] => Array
        (
            [occurrences] => 2
            [details] => Array
                (
                    [0] => Array
                        (
                            [0] => 名詞
                            [1] => サ変接続
                            [2] => *
                            [3] => *
                            [4] => *
                            [5] => *
                            [6] => 研究
                            [7] => ケンキュウ
                            [8] => ケンキュー
                        )

                    [1] => Array
                        (
                            [0] => 名詞
                            [1] => サ変接続
                            [2] => *
                            [3] => *
                            [4] => *
                            [5] => *
                            [6] => 研究
                            [7] => ケンキュウ
                            [8] => ケンキュー
                        )

                )

        )
        // ...長いので省略
    )

)

上記のような感じで取れてるかと思います。 以上です。

PS. 性別違和の正式な診断をGID委員会から得られ、ホルモン治療が始まりました。ここまでの過程はカウンセリングという形で精神科2人の意見同意(半年〜1年)を通していくもので、私の場合はすんなりと半年でしたが、そこからがまた長く…。ようやく本来生まれるべきであった元の身体に戻れるんだなぁと思いました。