あかんわ

覚えたことをブログに書くようにすれば多少はやる気が出るかと思ったんです

恋するプログラムをSinatraでWebアプリにするPart.9[CHAPTER7 学習のススメ]②

記事の概要

『恋するプログラム』の[CHAPTER7 学習のススメ]を参考に、形態素解析器の機能を呼び出せるRubyモジュールを作成します。

目次

開発環境

参考記事
Rubyの開発環境構築は、こちらの記事を参考にさせていただきました。

形態素解析器のMeCabを使う

形態素解析器のMeCabを呼び出すモジュールを作成し、Ruby形態素の解析をします。

アプリケーションディレクトリの構成
~/programinlove
    |- proto.rb                 // CUIチャットボットのメインファイル
    |- unmo.rb                  // チャットボットオブジェクトのモデル
    |- responder.rb             // 応答オブジェクトのモデル
    |- dictionary.rb            // 辞書を読み込み管理するクラス
    |- mecab_natto.rb           // 形態素解析器MeCabを使うためのモジュール
    |- log.txt                  // ユーザの入力履歴を保存するログファイル
    |- /dics                    // 辞書ファイルを格納するディレクトリ
    |     |- random.txt         // ランダムな応答を返すための辞書
    |     |- pattern.txt        // パターンに合った応答を返すための辞書
    |- noby.rb                  // Webアプリのメインファイル
    |- /views                   // ビューのテンプレートを配置するディレクトリ
    |     |- index.erb          // チャットのインターフェースを表示するビュー
    |- /public                  // 静的ファイルを配置するディレクトリ
          |- nobycanvas.js      // キャラクターの画像をアニメーションさせるJavascript
          |- styles.css         // チャットのインターフェースをレイアウトするcss
          |- /img               // 画像ファイルを格納するディレクトリ
               |- /normal       // 平常時の画像を格納するディレクトリ
               |- /blink        // 瞬きの画像を格納するディレクトリ
               |- /lookaround   // 周囲を見回す画像を格納するディレクトリ
               |- /talk         // 喋る画像を格納するディレクトリ
               ~ 以下に表情ごとの画像を格納するディレクトリを配置
ソースコード

形態素解析器の和布蕪を使い、mecab_natto.rbを作成しました。

サンプルプログラムでは形態素解析器の茶筌を使用していましたが、HomebrewMacへの導入が可能な上に、gemnattoのおかげでRubyからの呼び出しも楽にできるため、和布蕪を使うことにしました。

mecab_natto.rb
require 'natto'

module MeCabNatto

  def setarg(opt)
    @mecab_natto = Natto::MeCab.new(opt)
  end

  def analyze(text)
    @mecab_natto.enum_parse(text)
  end

  module_function :setarg, :analyze
end

# モジュール単体テスト用のスクリプト
if $0 == __FILE__

  # 出力フォーマットを指定して和布蕪納豆を作る
  MeCabNatto::setarg('-F%m\s%F-[0,1,2]')

  # 標準入力を取得
  while line = gets() do
    line.chomp!
    break if line.empty?

    # 解析する
    enum = MeCabNatto::analyze(line)

    # 解析結果を表示
    enum.each do |n|
      puts n.feature
    end
  end
end

このコードのコミットには、[chapter7-2]のタグが付いてます。

実行結果

ターミナルでmecab_natto.rbを動かし、解析したい文を入力します。

~/programinlove
$ruby mecab_natto.rb  
あたしはプログラムの女の子です
あたし 名詞-代名詞-一般
は 助詞-係助詞
プログラム 名詞-サ変接続
の 助詞-連体化
女の子 名詞-一般
です 助動詞
EOS

ぱっと見た感じ、サンプルプログラムと似たような出力を得ることが出来ます。

参考書籍

参考記事

Sinatraについては、こちらの記事を参考にさせていただきました。

関連記事

- 恋するプログラムをSinatraでWebアプリにするPart.0[はじめに]
- 恋するプログラムをSinatraでWebアプリにするPart.1[CHAPTER3 ほんとに無能]
- 恋するプログラムをSinatraでWebアプリにするPart.2[CHAPTER4 あこがれのGUI]①
- 恋するプログラムをSinatraでWebアプリにするPart.3[CHAPTER4 あこがれのGUI]②
- 恋するプログラムをSinatraでWebアプリにするPart.4[CHAPTER4 あこがれのGUI]③
- 恋するプログラムをSinatraでWebアプリにするPart.5[CHAPTER5 辞書を片手に]
- 恋するプログラムをSinatraでWebアプリにするPart.6[CHAPTER6 感情コントロールの魔術師]①
- 恋するプログラムをSinatraでWebアプリにするPart.7[CHAPTER6 感情コントロールの魔術師]②
- 恋するプログラムをSinatraでWebアプリにするPart.8[CHAPTER7 学習のススメ]①
- 恋するプログラムをSinatraでWebアプリにするPart.10[CHAPTER7 学習のススメ]③
- 恋するプログラムをSinatraでWebアプリにするPart.11[CHAPTER8 文章を作り出す]
- 恋するプログラムをSinatraでWebアプリにするPart.12[CHAPTER9 ノビィ、ネットワークにつながる]
- 恋するプログラムをSinatraでWebアプリにするPart.13[おわりに]