WordPressブログで関連記事を表示するため形態素解析のプラグイン開発
前に日本語形態素解析「MeCab」を使った関連記事表示機能の精度が良かったので、今の環境で導入してみたときの覚書。
環境: CentOS 7.4.1708, PHP 7.0.28, MariaDB 10.1.31, WordPress 4.9.4
ちなみにここまでしなくても関連記事を表示するWordPressプラグインはたくさんある。
形態素解析すると、文章の中で名詞だけ取り出し、漢字の読みも分かるので「御飯」「ご飯」「ごはん」を同じ「ゴハン」として判断可能。
目次
- MeCabのダウンロードとコンパイル
- 辞書のインストール
- PHPで使うための拡張ライブラリをインストール
- MariaDBの全文検索設定
- WordPressのプラグインとして実装
1.MeCabのダウンロードとコンパイル
C++で書かれているのでコンパイラと辞書のコード変換ライブラリlibiconvが必要。
# yum install gcc-c++ libticonv
公式サイトからダウンロードしてビルド
# /opt/software/
# tar -xzvf mecab-0.996.tar.gz
# cd mecab-0.996
# ./configure --with-charset=utf8
# make
# make check
# make install
2.辞書のインストール
これも公式サイトからダウンロードしてインストール。charsetを指定しないと文字化けする。
# cd /opt/software/
# tar -xzvf mecab-ipadic-2.7.0-20070801.tar.gz
# cd mecab-ipadic-2.7.0-20070801
# ./configure --with-charset=utf-8
# make
# make install
さらに辞書の精度を上げたい場合は下記のような辞書も参考に
- mecab-ipadic-NEologd : Neologism dictionary for MeCab | GitHub
- 新語・固有表現に強い「mecab-ipadic-NEologd」の効果を調べてみた : LINE Engineering Blog
今回は似ている記事を表示したいだけなので、ここまでの精度はいらない。
3.PHPで使うための拡張ライブラリをインストール
下記サイトでベータ版が公開されている。
pearで配布されているので、php-pearをインストール。
# yum install php-pear
公式サイトの手順に従ってインストール。
# pear channel-discover pecl.opendogs.org
# pear remote-list -c opendogs
# pear install opendogs/mecab-0.6.0
specify pathname to mecab-config [no] : /usr/local/bin/mecab-config
# echo "extension=mecab.so" > /etc/php.d/mecab.ini
# systemctl restart php-fpm
確認
# php --ri mecab
あとで気づいたけどGitHubにソースコードが公開されているので、cloneしてビルドした方がよかったかも。次回はそうする。
PHPのコードサンプルもソースコードを参照。common.inc.phpを見るとだいたい分かる。
4.MariaDBの全文検索設定
記事が似ているかどうかはMariaDBの全文検索の機能で行う。
MariaDB 10.0からInnoDBでも全文検索が出来るようになったようなので、こちらを使う。
全文検索する対象の単語長をデフォルトの4から1に設定
# less /etc/my.cnf.d/server.cnf
[server]
# Fulltext Index
innodb_ft_min_token_size = 1
再起動
# systemctl restart mariadb
5.WordPressのプラグインとして実装
基本の流れ
- 「save_post」にフックして記事タイトルと本文を形態素解析して別テーブルに保存
- 記事を表示する際に、形態素解析したデータを比較(全文検索)して似ている記事を判断
- 管理画面に今までの記事を形態素解析し直す機能をつけておくと便利
- 管理画面で辞書を登録できるようにするとさらに便利
速度は全く問題なし。形態素解析するのは投稿したときだけだし、表示するときもNginxのキャッシュ機能を使えば毎回全文検索することもない。
< Related Posts >