くりーむわーかー

プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。

Ruby

ruby cssの解析

前にちょっと書いた、エクセルの表をTextile形式に変換する奴をRedmineプラグインにしておこうと思い立ちまして、調べてたんですよ。

そしたら、RubyにはCSSそのものを解析するライブラリってなさそう?nokogiriってHTMLの解析のみなのかしら?公式のDOCとか落ちてるサンプル見てるとそんな気がしてならない。。。

ちょろちょろ検索してみたけど、出てくるのはHTMLのパースのみ。そーじゃないんだ。

探し方が悪いんだろうけども。んーいちからやるのはきついのであります。

と思ったら、「css_parser」っていうのがありましたね。よかったよかった。

MecabをRubyから呼び出すお手軽方法

Rubyから呼び出す方法はいくつかあるみたいだけど、設定とかハマりまくった覚えがあるので、お手軽版。ただし、一番遅いと思う。まぁ、膨大なデータを解析するわけじゃなければ気にならない遅さなので十分かと。Mecabをコマンドプロンプトで実行するのと同じ事をRubyで書くだけです。コマンドの文字列作ってopen3で投げる感じ。後はその結果を受け取ってるだけです。

require "open3"

mpath       = "\"C:\\Program Files\\MeCab\\bin\\mecab.exe\"" # MeCabへのパス
arg         = ""#Mecabにオプション渡したい場合
target_file = "hoge.txt"#解析対象のファイル
cmd_string = [mpath, arg, target_file].join(" ")

out, err, status = Open3.capture3(cmd_string)
out.split("\n").each  do |wkStr|
  p wkStr.split("\t")
end

↓実行結果サンプル

["この", "連体詞,*,*,*,*,*,この,コノ,コノ"]
["サイト", "名詞,一般,*,*,*,*,サイト,サイト,サイト"]
["について", "助詞,格助詞,連語,*,*,*,について,ニツイテ,ニツイテ"]
["EOS"]
["個人", "名詞,一般,*,*,*,*,個人,コジン,コジン"]
["情報", "名詞,一般,*,*,*,*,情報,ジョウホウ,ジョーホー"]
["保護", "名詞,サ変接続,*,*,*,*,保護,ホゴ,ホゴ"]

わかち書きにしたい場合はオプションに「-O wakati」をセットしてあげる。

・・・
arg         = "-O wakati"#Mecabにオプション渡したい場合
・・・

実行結果サンプル↓

["この サイト について "]
["個人 情報 保護 "]

わかち書きをさらに単語にばらしたい場合はwkStr.split(' ')みたいにして空白でsplitしてあげる。

ちなみに、参考にしたサイトではopen3じゃなくて、「IO.popen」を使ってた。↓の感じ。

io = IO.popen(cmd_string, "r")
until io.eof?
  word_list.concat io.gets.split(' ')
end

これで問題なく動くように見えるけど、数百ファイル以上を処理しようとすると、何故かたまに処理が止まる。理由は不明。ふらっと調べた感じではバグ?らしい。なので今は「open3」使えという事らしいので、素直に従って書いてます。

あとは、上記の結果の戻りをHashなり配列なりで戻すClassにしておけば、色々使い回せます。

問合せ