形態素解析という技術をご存知でしょうか。日本語を最小単位で単語ごとに分割し、それぞれの単語が名詞なのか動詞なのかを判定してくれるものです。例えば「今日は良い天気ですね」を形態素解析するとこのような結果が得られます。
さらに、文章を単語ごとにスペース区切りにする処理をわかち書きといいます。こんな感じです。
この処理は日本語のような単語と単語がスペースで区切られていない言語で全文検索を行う際には必須です(LIKE検索ではデータ量が増えるとパフォーマンスが非常に悪くなるため)。全文検索については MySQLで全文検索 - FULLTEXTインデックスの基礎知識|blog|たたみラボ がひじょ〜にわかり易いので、詳しく知りたい方は一読をオススメします。
この形態素解析(わかち書き)を行うツールはいくつかありますが、今回は MeCab を使いました。mecab-ruby というライブラリを使うことで、Ruby から MeCab を操作できちゃうみたいなので以下のサイトを参考に早速使ってみることに。
ベイジアンフィルターで日本語を分類する。 - ザリガニが見ていた...。
はぐれプログラマ清純派: Mecabを入れる(Ruby版)
早速使ってみましょう。まず、わかち書きをするにはインスタンス作成時に wakati を指定してあげます。これだけです。ただし、$KCODE を指定しないと文字参照になってしまうので必ず指定してください。
文字参照を変換して指定された文字列を得る方法 - (゚∀゚)o彡 sasata299's blog
最初の例のような形態素解析を行うには、先ほどは parse メソッドでしたが、parseToNode メソッドを使います。あと、インスタンス生成時に wakati は指定しません。
結果はこんな感じです。特定の種類の単語を抜き出すとかも簡単に出来ますね。使い方も非常に簡単なので素晴らしい。(*´Д`*)
なお、今回は事前に用意されている辞書しか使っていませんが、辞書に追加したり、自分で辞書を作成したりすることも出来ます。例えば「ほげ」という単語は通常は「ほ」と「げ」という二つの単語として扱われますが、辞書に「ほげ」という単語を登録しておけば、優先的に「ほげ」として扱われるようにすることも可能です。辞書についての話は MeCab: 単語の追加方法 が大変わかりやすかったです。
今日 名詞,副詞可能,*,*,*,*,今日,キョウ,キョー は 助詞,係助詞,*,*,*,*,は,ハ,ワ 良い 形容詞,自立,*,*,形容詞・アウオ段,基本形,良い,ヨイ,ヨイ 天気 名詞,一般,*,*,*,*,天気,テンキ,テンキ です 助動詞,*,*,*,特殊・デス,基本形,です,デス,デス ね 助詞,終助詞,*,*,*,*,ね,ネ,ネ EOS
さらに、文章を単語ごとにスペース区切りにする処理をわかち書きといいます。こんな感じです。
今日 は 良い 天気 です ね
この処理は日本語のような単語と単語がスペースで区切られていない言語で全文検索を行う際には必須です(LIKE検索ではデータ量が増えるとパフォーマンスが非常に悪くなるため)。全文検索については MySQLで全文検索 - FULLTEXTインデックスの基礎知識|blog|たたみラボ がひじょ〜にわかり易いので、詳しく知りたい方は一読をオススメします。
この形態素解析(わかち書き)を行うツールはいくつかありますが、今回は MeCab を使いました。mecab-ruby というライブラリを使うことで、Ruby から MeCab を操作できちゃうみたいなので以下のサイトを参考に早速使ってみることに。
ベイジアンフィルターで日本語を分類する。 - ザリガニが見ていた...。
はぐれプログラマ清純派: Mecabを入れる(Ruby版)
早速使ってみましょう。まず、わかち書きをするにはインスタンス作成時に wakati を指定してあげます。これだけです。ただし、$KCODE を指定しないと文字参照になってしまうので必ず指定してください。
文字参照を変換して指定された文字列を得る方法 - (゚∀゚)o彡 sasata299's blog
#!/usr/bin/ruby
$KCODE = 'u'
require 'MeCab'
wakati = MeCab::Tagger.new('-O wakati')
puts wakati.parse('最近の夜は寒い') # 最近 の 夜 は 寒い
最初の例のような形態素解析を行うには、先ほどは parse メソッドでしたが、parseToNode メソッドを使います。あと、インスタンス生成時に wakati は指定しません。
#!/usr/bin/ruby
$KCODE = 'u'
require 'MeCab'
mecab = MeCab::Tagger.new()
node = mecab.parseToNode('最近の夜は寒い')
while node do
puts "#{node.surface}\t#{node.feature}"
node = node.next
end
結果はこんな感じです。特定の種類の単語を抜き出すとかも簡単に出来ますね。使い方も非常に簡単なので素晴らしい。(*´Д`*)
BOS/EOS,*,*,*,*,*,*,*,*
最近 名詞,副詞可能,*,*,*,*,最近,サイキン,サイキン
の 助詞,連体化,*,*,*,*,の,ノ,ノ
夜 名詞,副詞可能,*,*,*,*,夜,ヨル,ヨル
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
寒い 形容詞,自立,*,*,形容詞・アウオ段,基本形,寒い,サムイ,サムイ
BOS/EOS,*,*,*,*,*,*,*,*
なお、今回は事前に用意されている辞書しか使っていませんが、辞書に追加したり、自分で辞書を作成したりすることも出来ます。例えば「ほげ」という単語は通常は「ほ」と「げ」という二つの単語として扱われますが、辞書に「ほげ」という単語を登録しておけば、優先的に「ほげ」として扱われるようにすることも可能です。辞書についての話は MeCab: 単語の追加方法 が大変わかりやすかったです。
