Windows上でRuby+libmecab.dllを使ってマルコフる
現状の「だべさ」は文字ベースの連鎖なので、ちゃんとMeCabを使った仕組みに変えるべく、構造を検討...したかったのだが、現在手元にはWindowsしかないので、Windows上でRubyとMeCabを使って動くスクリプトを作ってみた。
環境構築手順は以下の通り。ActiveScript Rubyは既に導入済みでした。
・MeCab: Yet Another Part-of-Speech and Morphological AnalyzerからMeCab-Win32(0.98pre3)をダウンロード。
・言語処理関連のプログラム類の「windowsのrubyからlibmecab.dllを呼び出す」からmecab.rbをダウンロード。
スクリプトのソース。
環境構築手順は以下の通り。ActiveScript Rubyは既に導入済みでした。
・MeCab: Yet Another Part-of-Speech and Morphological AnalyzerからMeCab-Win32(0.98pre3)をダウンロード。
・言語処理関連のプログラム類の「windowsのrubyからlibmecab.dllを呼び出す」からmecab.rbをダウンロード。
スクリプトのソース。
#!ruby -Ks
require "mecab"
begin
hash = Hash.new
ary = Array.new
mess = ""
m=Mecab.new("")
# 元となるデータファイルを取得
data = Array.new
open("data.txt",'r') do |file|
while line = file.gets
if line != "\n" then data.push(line) end
end
end
# データからマルコフテーブル作成
data.each do |line|
line.chop!
node = m.sparse_tonode(line)
node = node.next
while node.hasNext
hash = Hash.new
hash["1"] = node.surface
node = node.next
if node.hasNext == true then
hash["2"] = node.surface
else
hash["2"] = nil
end
ary.push(hash)
end
end
# 連鎖する
post = ary[0]
mess.concat(post["1"])
while post["2"] != nil do
rndline = Array.new
i = 0
ary.each do |line|
if post["2"] == line["1"] then
rndline.push(line)
i = i + 1
end
end
post = rndline[rand(i)]
mess.concat(post["1"])
end
puts mess
rescue
m.destroy
print "RuntimeError: ", $!, "\n";
end