アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

('ω') < 転職した

mecabとPHPで形態素解析

そもそも形態素解析とは?

文章を「言語で意味を持つ最小単位」に分割し、それぞれの品詞等を判別する作業。
参考:形態素解析 - Wikipedia

形態素解析すると具体的にどうなるの?

元の文字列

吾輩は猫である。名前はまだ無い。
どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。

形態素解析すると…

吾輩,は,猫,で,ある,。,名前,は,まだ,無い,。
どこ,で,生れ,た,か,とんと,見当,が,つかぬ,。,何,でも,薄暗い,じめじめ,し,た,所,で,ニャーニャー,泣い,て,いた事,だけ,は,記憶,し,て,いる,。

こうなります。

何に使うの?

など

それはSQLのLIKEやPHPのstrposじゃだめなの?

機能としては、この文章に対して「はまだ」だとか「いじめ」だとかでヒットしても良ければOKです。

吾輩は猫である。名前はまだ無い。
どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。

ただし、strposはともかく、LIKEについては速度面でも問題になる可能性があります。
(文章量やレコード数がそれほど多くない場合は問題にならない可能性もあります)

詳しくは過去に書きましたので参考にしてください。
MySQLでフリーワード検索 - アナログCPU:5108843109

どうやって使うの?

$keyword_list = mecab_split("形態素解析を行いたい文章");

// $keyword_list は以下のようになる
// array(
//     "形態素",
//     "解析",
//     "を",
//     "行い",
//     "たい",
//     "文章",
// )
  • カタカナへの変換もできたりします(ひらがなに変換するならmb_convert_kanaを併用で)
$mecab = new MeCab_Tagger(array('-O' => 'yomi'));
$kana_string = $mecab->parse("カナ変換を行いたい文章")

// $kana_string は以下のようになる
// カナヘンカンヲオコナイタイブンショウ

問題点はないの?正確に動くの?

  • 人名やアニメ作品名などの固有名詞に弱いです。辞書登録することで解決する場合もあります。
  • 形態素解析とかな変換を併用する場合は精度が落ちがちになります。
例)
元の文章      :東京都新宿区西新宿五丁目
形態素解析のみ:東京,都,新宿,区,西新宿,五,丁目
かな変換のみ  :とうきょうとしんじゅくくにししんじゅくごちょうめ
形態素解析したものをかな変換:とうきょう,と,しんじゅく,く,にししんじゅく,ご,ひのとめ
かな変換したものを形態素解析:とうき,ょうとしんじゅくくにししんじゅくごちょうめ