スタッフブログ

STAFF BLOG

アプリ開発日誌

2016.10.31

「MeCab」を使ってイニシャルを生成しよう

サーバー開発担当の木下です。

少し前にPebble Timeを購入しました。屋外でも見やすい液晶と、使いやすいインターフェイスが気に入っています。ウォッチフェイス(盤面)も、昔のMac風のものや、ひたすらUnixtimeだけ刻み続けるものなど、遊び心のあるものがたくさんあって面白いです。

さて今回は、形態素解析の話です。

形態素解析とは

「形態素解析」は自然言語処理のひとつで、文章を単語(形態素)ごとに切り分けてそれぞれの品詞・読みなどを判別する処理のことを指します。
日本語の形態素解析は非常に難しいと言われているようです。というのも、英語のように文章が単語で区切られておらず、また文脈によって読みが変わるからです。

日本語の形態素解析エンジンはいくつかありますが、その中の一つに、オープンソースで開発されている「MeCab」があります。こちらはGitHubで公開されています。
余談ながらお気づきかもしれませんが、「MeCab」の語源は「和布蕪」のようです。
UNIX/Windowsで動作するようなので、今回は手元のLinuxマシンで試してみたいと思います。

形態素解析をさわってみる

上記GitHubページから、MeCab本体のSourceをダウンロードしてきました。現時点での最新版は「mecab-0.996.tar.gz」です。コンパイル・インストールしてみましょう。

$ tar xvzf ./mecab-0.996.tar.gz
$ cd mecab-0.996
$ ./configure
$ make
$ make check
# make install

続けて、辞書データもインストールします。

$ tar xvzf ./mecab-ipadic-2.7.0-20070801.tar.gz
$ cd mecab-ipadic-2.7.0-20070801
$ ./configure --with-charset=utf8
$ make
# make install

順調にいけばこれでインストール完了です。実際に解析してみましょう。

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

サンプル通りに解析できました。
今回の目標は「イニシャルを生成する」です。ここからはPHPで記述して、APIに組み込めるようにしたいと思います。

MeCabでイニシャルを生成する

PHPで記述してみました。exec関数を使って、mecabコマンドを呼び出しています。

$firstName = '漱石';
$lastName = '夏目';

$firstNameKana = exec('echo '.$firstName.' | mecab --node-format="%f[7]" --eos-format="\n"');
$lastNameKana = exec('echo '.$lastName.' | mecab --node-format="%f[7]" --eos-format="\n"');

echo $firstNameKana; // -> ソウセキ
echo $lastNameKana; // -> ナツメ

「夏目 漱石」をちゃんと「ナツメ ソウセキ」に解析できました。ここから、カナを英字に変換してみます。
カナ→英字はmb_convert_kanaあたりで一発変換できるかと思っていたのですが、PHPにはそのような関数がなさそうなので、自分で関数を作成することにしました。

function initialCheck($val){   
  $valf = mb_substr($val, 0, 1, 'UTF8');
  switch($valf){
    case 'ア': return 'A'; break;
    case 'イ': return 'I'; break;
    case 'ウ': return 'U'; break;
    case 'エ': return 'E'; break;
    case 'オ': return 'O'; break;
    case 'カ': case 'キ': case 'ク': case 'ケ': case 'コ': return 'K'; break;
    case 'サ': case 'シ': case 'ス': case 'セ': case 'ソ': return 'S'; break;
    case 'タ': case 'チ': case 'ツ': case 'テ': case 'ト': return 'T'; break;
    case 'ナ': case 'ニ': case 'ヌ': case 'ネ': case 'ノ': return 'N'; break;
    case 'ハ': case 'ヒ': case 'フ': case 'ヘ': case 'ホ': return 'H'; break;
    case 'マ': case 'ミ': case 'ム': case 'メ': case 'モ': return 'M'; break;
    case 'ヤ': case 'ヰ': case 'ユ': case 'ヱ': case 'ヨ': return 'Y'; break;
    case 'ラ': case 'リ': case 'ル': case 'レ': case 'ロ': return 'R'; break;
    case 'ワ': case 'ヲ': case 'ン': return 'W'; break;
    case 'ガ': case 'ギ': case 'グ': case 'ゲ': case 'ゴ': return 'G'; break;
    case 'ザ': case 'ジ': case 'ズ': case 'ゼ': case 'ゾ': return 'Z'; break;
    case 'ダ': case 'ヂ': case 'ヅ': case 'デ': case 'ド': return 'D'; break;
    case 'バ': case 'ビ': case 'ブ': case 'ベ': case 'ボ': return 'B'; break;
    case 'パ': case 'ピ': case 'プ': case 'ペ': case 'ポ': return 'P'; break;
    default: return '';
    break;
    }
}

この関数で、カナを変換してみましょう。

$initial = initialCheck($firstNameKana) . initialCheck($lastNameKana);
echo $initial; // -> SN

これでイニシャルが生成できるようになりました。この処理をまとめて関数にしてしまえば、Webの入力画面やAPIなどで使いやすくなると思います。

自然言語処理の活用

今回はイニシャルを生成するだけでしたが、実は自然言語処理(+音声解析)はIT業界でも今特に注目を浴びている分野です。Googleの音声検索や、iOSのSiri、WindowsのCortanaなどがその代表例です。
10月4日に開催されたGoogleの発表イベント「Made by Google」で、一番最初に自然言語処理の話題が取り上げられていたところからも、その注目度がよく分かります。
スマホに向かって「○○さんにお礼のメール」と言うだけでメールを書いてくれたり、「課題図書の感想」と言うだけで読書感想文を自動生成してくれたりする世界に期待したいところです。

また弊社では、音声認識・解析アプリのご依頼も承っております。お気軽にお問い合わせください!

BACK

お問合せ

イーディーエーに興味をお持ちいただいて
ありがとうございます!
スマホアプリに関するご相談、
お見積りや弊社へのご質問など、
お気軽にお問い合わせください。
担当者より折り返しご連絡させていただきます。

    お名前必須
    会社名
    メールアドレス必須
    電話番号必須
    お問合わせ種別必須
    お問合わせ内容必須

    アンケートにご協力ください。
    弊社サイトへはどのようにしてアクセスされましたか?

    個人情報のお取扱いに関する同意事項

    1.事業者の氏名又は名称

    株式会社イーディーエー

    2.個人情報保護管理者の氏名又は職名、所属及び連絡先

    個人情報保護管理者 小宮 保人
    Mail:[email protected]

    3.取得した個人情報の利用目的

    当フォームで取得した個人情報は、お問い合わせに関する回答のために利用し、目的外利用はいたしません。

    4.弊社が取得した個人情報の第三者への委託、提供について

    弊社は、ご本人に関する情報をご本人の同意なしに第三者に委託または提供することはありません。

    5.個人情報保護のための安全管理

    弊社は、ご本人の個人情報を保護するための規程類を定め、従業者全員に周知・徹底と啓発・教育を図るとともに、その遵守状況の監査を定期的に実施いたします。
    また、ご本人の個人情報を保護するために必要な安全管理措置の維持・向上に努めてまいります。

    6.個人情報の開示・訂正・利用停止等の手続

    ご本人が、弊社が保有するご自身の個人情報の、利用目的の通知、開示、内容の訂正、追加又は削除、利用の停止、消去及び第三者への提供の停止を求める場合には、下記に連絡を頂くことで、対応致します。

    株式会社イーディーエー 個人情報お問合せ窓口
    〒106-0032 東京都港区六本木7丁目14番23 ラウンドクロス六本木4F
    TEL:03-5422-7524 FAX:03-5422-7534
    Mail:[email protected]

    7.ご提供いただく情報の任意性

    個人情報のご提供は任意ですが、同意を頂けない場合には、第3項にあります利用目的が達成できない事をご了承いただくこととなります。

    8.弊社Webサイトの運営について

    弊社サイトでは、ご本人が弊社Webサイトを再度訪問されたときなどに、より便利に閲覧して頂けるよう「クッキー(Cookie)」という技術を使用することがあります。これは、ご本人のコンピュータが弊社Webサイトのどのページに訪れたかを記録しますが、ご本人が弊社Webサイトにおいてご自身の個人情報を入力されない限りご本人ご自身を特定、識別することはできません。
    クッキーの使用を希望されない場合は、ご本人のブラウザの設定を変更することにより、クッキーの使用を拒否することができます。その場合、一部または全部のサービスがご利用できなくなることがあります。