恋するプログラムをSinatraでWebアプリにするPart.9[CHAPTER7 学習のススメ]②
記事の概要
『恋するプログラム』の[CHAPTER7 学習のススメ]を参考に、形態素解析器の機能を呼び出せるRubyモジュールを作成します。
目次
開発環境
- OSX 10.11.2 El Capitan
- テキストエディタ: MacVim
- ターミナルエミュレータ: Macターミナル
- シェル: zsh
- パッケージマネージャ: Homebrew
- ブラウザ: Firefox - Ruby 2.0.0p645
- バージョンマネージャ: rbenv
- Webフレームワーク: Sinatra - MeCab 0.996
- 日本語辞書: IPA辞書
参考記事
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
を作成しました。
サンプルプログラムでは形態素解析器の茶筌を使用していましたが、Homebrew
でMacへの導入が可能な上に、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については、こちらの記事を参考にさせていただきました。
- Rubyの入門や書き捨てアプリを作る場合は sinatraがオススメ! - むかぁ~ どっと こむ
- SinatraとjQueryでおよそ100行で作るAjax掲示板アプリケーション - gaaamiiのブログ
- Sinatra: README (Japanese)
関連記事
- 恋するプログラムを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[おわりに]