弊社のサービス「M&Aクラウド」では、ビジネスキーワードと呼ばれるキーワードを使って買収・出資企業様と売却・資金調達企業様のマッチングを行っております。
このビジネスキーワードというものは、ユーザー様が自由に入れられるものなのですが、その分表記ブレが発生したり、キーワードとして使えない文章だったりといった事が起きていました。
今回は簡易的に、キーワードではないものを判別して除外する、という条件で進めることにしましたので、MeCabを使って品詞からキーワードではないものを判別し除外していくことにします。
MeCabとは
MeCabはオープンソースの形態素解析エンジンです。形態素解析とは、自然言語で書かれた文を言語上で意味を持つ最小単位(=形態素)に分け、それぞれの品詞や変化などを判別することです。文章を名詞、動詞、助詞、助動詞などの品詞に分解し、種類を判別します。Mecabは日本語の形態素解析エンジンとしてはかなりメジャーなものだと思います。
mecabのインストール
弊社ではWEBサーバーにAWS Elastic Beanstalkを利用しているため、その設定ファイルを書いていきます。ebextensions/*以下に配置しました。 実際のコードは以下を御覧ください。
MeCab自体のインストールと、MeCabから使う辞書データのインストールという2つをインストールします。
実際に使ってみる
MeCabをコマンドとして実行します。
このように、テキストを品詞分解した上でそれぞれが何の品詞かを判別してくれます。上記のように文章をMeCabに渡すと助詞や助動詞が判別されます。これらがある場合、そのテキストはキーワードではなく文章だと判別できます。 MeCab: 品詞 ID にありますが、MeCabの品詞分類の結果はかなり細かいです。実際ここまで細かく品詞を分類して使うことってあんまりないんじゃないでしょうか?
今回は助詞、助動詞、記号を含む場合、文章であると判定し除外するという処理にしました。
はまりどころ
こちらの記事に紹介されているのですが、記号がなぜかサ変接続の名詞として判定されてしまうという問題がありました。
サ変接続の名詞というのは「該当」のような後ろにするをつけると「該当する」となり動詞になることができる名詞なのですが、これだけだと名詞ではあるので、除外したくはありません。一方、「#」のような明らかに記号のものがなぜかサ変接続の名詞というふうに誤判定されてしまいます。
今回は色々試したところ、半角の記号は全角に変換してからMeCabにわたすと記号として認識される事がわかりましたので、これで対応することができました。
まとめ
普段WEBアプリケーションを書いていると、こういったPHPからコマンドを実行するというような処理はあまりやらないので面白かったです。あと、WEBサーバーにMeCabが入ったことによって、今回のキーワードのクレンジングだけでなく、ユーザーの入力値のバリデーションなど様々なことに応用できそうだと考えています。