< Project Name/> この記事をシェアする
B
サイト内を検索する
最近の記事 読まれている記事

【natto・mecabで】5分で形態素分析に入門して、修造の「人生を強く生きる83の言葉」の頻出語を調べてみる。【形態素解析】

2015.2.10(火)

こんにちは。
めっきり寒く全てのやる気がnot_foundのvsannaです。

やる気というrecordが見つからない。

今回のテーマは形態素解析

さて、今回はいかにもプログラミングっぽいことをしてみました。
その名も形態素解析。 形態素にこう、グッと来る。

とはいっても聞いたことなかったので調べたところ、ざっくり言って文章を品詞分解することを意味するとのこと。

で、これを使うと面白いことが出来そう!というブログを幾つか目にしました。

品詞分解するだけで色々な応用が出来そうで非常に面白そうです。
どちらも試してみたい。この瞬間のワクワク感がたまらん。

使う材料は1つの検索エンジンと1つのgem

今回、mecabという形態素解析エンジン(様々な処理を行うプログラムの塊)と、それをrubyで使えるようにするnattoというgemを使います。

1. 形態素分析をするmecab

mecabは形態素分析のエンジンです。
公式はこちら。 => MeCab: Yet Another Part-of-Speech and Morphological Analyzer

Google日本語入力開発者チームの1人の方が開発されたようです。

2. mecabをrubyで使えるようにするgem「natto」

そのまんまだと思っておきます。
rubyからmecabをうまいこと使えるようにしてくれるいいやつです。

こちらは公式ページがみあたりませんでした…

実際に使うためにはmecabの使い方を中心に理解していきます。

で、私は〇〇をやってみる。

というわけで今回やってみるのは、タイトルにある通り
「修造の『人生を強く生きる83の言葉』の頻出語を調べてみる」
です。字面だけ見ると全く意味がわからない。

  • まずはサクッと品詞分解
  • 応用編として修造分析
  • もっとできないかを妄想

あたりをやってみます。

0. 環境準備

環境準備です。以下テンプレ。

macの場合

デフォルトでRubyが入っています。
が、バージョンが古いので最新のものに更新しておきます。

初心者でもできた!Ruby on Rails開発環境の構築方法(Mac編)
こちらの「3.Rubyのインストール」まですすめて頂ければOKです。

windowsの場合

RubyLife – Rubyインストールが詳しそうです

どちらの場合も、

  $ ruby -v
で2.X.X以上のバージョン表記がされればOKです。

nattoとmecabの準備

まずはmecabをmacにインストール。
こちら => Macにmecabインストールの「本来入っている辞書を追加」まで進めてみてください。
windowsの方はggってみて下さい!もしくはMac買っちゃいましょう★

続いて、同じ方の記事であるこちら => mecabをRubyで使う を参考にします。
「Rubyから利用」の段落以降を読み進めて下さい。
bundleがわからなくて怖い方は、気にせず

  gem install natto
したうえで、コードの冒頭に
  require 'natto'
と書き足しましょう。

1. mecab単体で使ってみる

さて、前段でインストールしたmecabを単体で(rubyからではなく)使ってみます。

コンソールで

  $ mecab
としてmecabを起動させた上で、
  (空行にそのまま入力)今日は雪が降ってて非常に寒い。おなか減った。
といれると、

bash
今日は雪が降ってて非常に寒い。おなか減った。
今日    名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は    助詞,係助詞,*,*,*,*,は,ハ,ワ
雪    名詞,一般,*,*,*,*,雪,ユキ,ユキ
が    助詞,格助詞,一般,*,*,*,が,ガ,ガ
降っ    動詞,自立,*,*,五段・ラ行,連用タ接続,降る,フッ,フッ
て    動詞,非自立,*,*,一段,連用形,てる,テ,テ
て    助詞,接続助詞,*,*,*,*,て,テ,テ
非常    名詞,形容動詞語幹,*,*,*,*,非常,ヒジョウ,ヒジョー
に    助詞,副詞化,*,*,*,*,に,ニ,ニ
寒い    形容詞,自立,*,*,形容詞・アウオ段,基本形,寒い,サムイ,サムイ
。    記号,句点,*,*,*,*,。,。,。
おなか    名詞,一般,*,*,*,*,おなか,オナカ,オナカ
減っ    動詞,自立,*,*,五段・ラ行,連用タ接続,減る,ヘッ,ヘッ
た    助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。    記号,句点,*,*,*,*,。,。,。

と結果が表示されます。気持ちよすぎるのではないかこれ。

2. 実際にコードを書く。

では早速rubyで書いてみます。

まずはサクッと品詞分解

Ruby
# 必要なライブラリを呼び出し。
require 'natto'

# nm(納豆めかぶ)を呼び出し。
nm = Natto::MeCab.new

# nmにテキストをフィードしてparse(解析)してもらう
puts nm.parse("今日は雪が降ってて非常に寒い。おなか減った。")

これだけで上述のmecab単体での作業と同様の事ができます。
おもむろにnatto_mecab.ruなどと名前をつけて、

  $ ruby natto_mecab.rb
で実行してみます。コンソールにmecabの解析結果がだだっと出てきたら成功です。

3.いよいよ修造分析をしてみる。

さて、ここからが本編です。

まずはデータ用意

今回利用したのはこちら。
松岡修造の人生を強く生きる83の言葉

手元にあったテキストデータで調度良いのがこれだった。 csvにしたのがこちら。(一部だけ画像表示。実際に83個確かにあります。)

スクリーンショット 2015-02-07 22.57.06

無心でテキストを打ち込む。

コードをかく。

Ruby
# 今回使うライブラリを読んでおく。最低限必須なのはnattoだけ。
require 'natto'
require 'pp'
require 'csv'

# こちらの配列に修造の名言を品詞分解したものを放り込んでいく。
syuzo_words = []

# csvファイルを読み込む。1行ずつ処理。
CSV.open('syuzo.csv', 'r') do |reader|

    # Nattoを介してMecabエンジンを起動!
    nm = Natto::MeCab.new

    # 読み込んだcsvファイルの各行を順次処理する。
    reader.each do |row|

        # ここでnatto_mecabを介してパース!(解析。ここでは品詞分解。)
        # 分解されて出てきた品詞をnという変数に放り込む
        nm.parse(row[0]) do |n|
            # nのsurfaceには品詞そのものが詰まっているのでそれをいただく。
            # 他にn.feaureで細かい属性情報(品詞の種類やよみがななど)を取得できます。
            s = n.surface ? n.surface : "-"
            syuzo_words << s
        end
    end
end
# ここまででこんなかんじ。
# syuzo_words = ["ナイス", "ボレー", "、", "修造", "!", …..]


words_and_count = []

# 品詞分解した結果を集計
# #uniqで重複をなくしつつ、
# #map処理で各要素ごとに品詞分解した中身(word)と、
# それが何回カウントされているか(syuzo_words.grep(word).count)を作り出している。
syuzo_words.uniq.map do |word|  
    words_and_count[words_and_count.size] = ["#{word}", "#{syuzo_words.grep(word).count}"] if word
end
# ここまででこんな感じ
# words_and_count = [["ナイス", "2"], ["ボレー", "1"], ["、", "12"], ["修造", "3"], ["!", "23"],…]


# 最後にsort_byで並び替えて更に降順に。
# word_and_count[1]とは["ナイス", "2"]のindex1つまり、"2"の値を指しており、その値を元に並び替え。
pp words_and_count.sort_by { |word_and_count| word_and_count[1].to_i }.reverse

実行!

ぽちっとな。

  $ ruby syuzo.rb > syuzo.txt

で、結果がこちら。

bash
["-", "81"],
 ["は", "53"],
 ["だ", "39"],
 ["に", "33"],
 ["の", "31"],
 ["て", "28"],
 ["。", "26"],
 ["を", "24"],
 ["!", "23"],
 ["な", "21"],
 ["ん", "19"],
 ["が", "17"],
 ["ない", "15"],
 ["よ", "13"],
 ["、", "12"],
 ["も", "12"],
 ["心", "11"],
 ["た", "11"],
 ["こと", "10"],
 ["で", "10"],
 ["ある", "9"],
 ["自分", "8"],
 ["し", "7"],
 ["と", "7"],
 ["から", "7"],
 ["いい", "6"],
 ["たら", "6"],
 ["いる", "6"],
 ["か", "6"],
 ["ば", "5"],
 ["何", "5"],
 ["時", "5"],
 ["僕", "5"],
 ["する", "4"],
 ["お前", "4"],
 ["人", "4"],
 ["力", "4"],
 ["じゃ", "4"],
 ["なっ", "3"],
 ["それ", "3"],
 ["だけ", "3"],
 ["よう", "3"],
 ["ぞ", "3"],
 ["でも", "3"],
 ["う", "3"],
 ["大丈夫", "3"],
 ["みろ", "3"],
 ["見", "3"],
 ["なる", "3"],
 ["られる", "3"],
 ["ー", "3"],
 ["幸せ", "3"],
 ["君", "3"],
 ["き", "3"],
 ["お", "3"],
 ["修造", "3"],
 ["好き", "3"],
 ["あなた", "3"],…まだまだ続く。

長いのでcount数が3以上のものだけを抜粋です。
うーん、要らない助詞がトップにきてちょっと見にくいのですが、意味あるワードとしては、

  • 自分
  • 大丈夫
  • 幸せ
  • 修造
  • 好き

あたりが頻出といったかんじでしょうか。
いい感じに自己啓発です。修造さん流石っす!(思ったより普通で落ちがnot_found)

もっと出来そうなこと

この他にもこんなことができたらいいなをまとめてみます。

  • 俺のエディターで利用。
    • 頻出しているワードを分析して書き換えを促す
    • キーワード化したいワードが適切な分量入っているかを自動でチェック
  • 形態素分析×twitter
    • 自身のツイートの傾向分析
  • 形態素分析×翻訳 => ルー語(に出来るらしい)
    • Microsoftの翻訳APIと連携させてみたい。
  • 形態素分析×センター英語
    • 頻出ワードを分析。割とマジでテキストだけ手に入ればかんたんでは…?

こんな感じでしょうか。

終わりに

さて形態素分析のご紹介でした。
かなりシンプルにかつ面白いことができるので、用途は無限大に思い浮かびます。
プログラミング初心者の私でも幅広く応用が出来そうです。

今回も最後までお読みいただきありがとうございました。
なにか間違えなどございましたらぜひコメント頂ければ幸いです。

はてぶしてもらえるとうれしいです。よろしくです(´・ω・`)