【PHP】Mecabで「似ているデータ」を見つける方法さてさて、前回を除くと最近公開した記事がほぼLaravelの話題がばかりになっていることに気がつきました。思っているのですが、私の開発環境は現在ドップリLaravel化してしまい、正直なところネイティブなPHPコードの開発は過去1年間でたった一回だけ(しかも古いサイトの移転のお手伝い)だったので、たまにはPHP全般の話題も、といろいろ考えていました。すると、まっさきに思い浮かんだのが日本語に関連する話題です。いうのもLaravelももちろん多言語にいろいろと対応はしていますが、さすがに単一国家だけで話されている日本語のみに対応するというのはあまりないはずだと考えたからです。そんな影響で今回お届けするのは、PHPで「似ているデータ」を見つけ出す方法です。今回は誰でもシンプルに実行できるように難解な公式や機械学習などは全く使いません。合わせて読みたい似ているデータを見つける仕組み例えば、商品管理システムやブログのように説明文や記事がデータとして存在しているものを想定しています。長い文章が必要になってきます。いうのも、手順としては以下のようになるからです。あるデータの説明文から「単語」だけを取り出す取り出した単語から意味のないものなど不要なものを排除する残った単語だけを集計して数が多いものから並べかえるこうすることで最終的にそのデータに「より関連度が高い」単語だけが取得できるので、これをキーワードとして他のデータを検索すれば、それがそのまま「似ているデータ」になるという訳ですね。ここからは実際に見ていきましょう。形態素解析プログラムを利用します。いうことで、まずこのmecab本体をインストールしていきましょう。以下2つのコマンドを実行してください。libmecab-devインストールが完了したら、mecabが動くかチェックしてみましょう。以下のコマンドを実行してみてください。mecabすると、テキストの入力モードになりますので、例えば「犬も歩けば棒に当たる」と入れて実行してみましょう。実行結果はこうなります。Algolia)でも少し紹介しましたが、全文検索を自前で作るときはとても重宝します。php-mecabのインストール続いてmecabがPHPから使えるようにしてみましょう。適当なフォルダに移動して以下のコマンドでコードをローカル環境にコピーします。https://github.com/rsky/php-mecab.git次にコピーしたフォルダ内に移動します。php-mecab/mecab移動したらphpizeコマンドを実行。phpizeコマンドが使えない場合は、以下のコマンドを先に実行してください。php7.2-devあとは以下のコマンドを順に実行すればインストールが完了します。now?と聞かれたらレポートを送信するかどうかなのでお好みで決定してください。ちなみに、私はn(No)にしました😊インストールが完了すると以下のような表示が出ます。/usr/lib/php/********/では、php-mecabを有効にするためにmecab.iniファイルを作成しましょう。files」と書かれているフォルダがいいでしょう。mecab.iniの中身は以下のとおりです。extension=mecab.soファイルが作成されたら、以下のコマンドでnginxとphp-fpmを再起動します。php7.2-fpmそして、再度php_info()を再表示して以下のようにmecabの項目が出ていたら成功です。似ているデータを探すコードをつくるでは、準備ができたので実際にPHPのコードを見ていきましょう。3);});arsort($tag_counts);print_r($tag_counts);やっていることは次のとおりです。mecabのインスタンスを作成してひとつずつ単語を判別していきます。ループの中では、まず判別に必要な以下3つのデータを取得します。(※1)例えば「テキスト」の場合は次のようになります。ドメイン:教育・学習;科学・技術3つのデータが取得できたらお好みの条件でフィルタをかけます。今回の条件はこうなっています。あることそして、これらの条件をくぐり抜けることができたものをひとつずつ配列に追加していくことになります。それらの単語の中でも優先順位をつけるために、まずarray_count_values()で配列内のデータをカウントします。1そして、array_filter()を使って「何個以上その単語があればタグとして使うか」のフィルターをかけ、さらにarsort()で個数が多い順に配列を並べ替えて最終的に「似ているデータ」を探すためのタグ(キーワード)とします。ちなみに、wikipediaのPHPのページにある「概要」のテキストを使ってタグ抽出したものが以下になります。3)あとは、DBのフィールドにtagsなどを追加してjsonとしてこれらのタグを保存しておけば、後でいつでも似たデータを取得できるというわけです。1フィルターをかける条件によっては「こと」や「もの」などあまり似たデータを取得するには向かないデータもありますので、次のように漢字のみをOKにしたり、文字が2文字以上のものだけでフィルタをかけるなど工夫するといいと思います。2ホントに「ちなみに」ですが、私が運営している無料プレスリリースサイト「ぷれりり・プレスリリース」でも今回のテクニックを利用して関連するプレスリリースを自動的に表示するようにしています。ご興味にある方はぜひそちらも参考にしてみてください!おわりに短いながらも久しぶりに純粋なPHPコードを書きましたが、配列にフィルタを掛ける場所ではPHPの標準関数より先にLaravelのヘルパー関数の方が思い浮かんでくるので、やっぱりLaravelにドップリはまっちゃってるのを実感してしまいました😂ただ、今回のコードの中でphp_count_values()などはあまり馴染みのない関数でしたが、とても便利なものがあるのだなとも思いました。(しかもこの関数はPHP4から存在しているようです。知らなかったです・・・)もしかすると、Laravelのヘルパー関数を使わなくても実行できる便利な関数がPHPには用意されているのかもしれません。そのあたりもできるだけカバーしていきたいですね。いうことで、皆さんも一度mecabで「似ているデータ」を取得してみてはいかがでしょうか。開発スキルプログラム開発は15年以上。Laravel、Vue.jsをメインとしてPython(機械学習)やElectronの開発もお引き受けしております。過去2度カナダのバンクーバーに滞在していました。開発状況によりましては開発をお待ちいただく可能性がございますが、いつでもご相談は受けさせていただいております。お気軽にご連絡ください!お問い合わせフォーム開発してほしい機能を募集中!MITライセンスで公開します。詳しくはこちらの記事をご覧ください。ぷれりり・プレスリリース掲載無料のプレスリリース・スタンド!播磨孤道(はりまこどう)兵庫周辺のゆったり自転車一人旅の記事を書いていきます。