1 名前:デフォルトの名無しさん mailto:sage [2009/08/08(土) 08:21:23 ] プログラミング言語Rubyについての、初心者向けスレです。質問・要望・雑談などどうぞ。 ★注意★ Ruby 1.9.1 は初心者には時期早尚です。初心者には Ruby 1.8.7 を強くお勧めします。 (理由:現時点では多くの有名ライブラリやアプリが 1.9.1 に未対応であるためです。) なお 1.8.7 でも 1.9 系に導入された新機能のいくつかが利用可能なため、1.8.7 で勉強すれば将来スムーズに 1.9 系に移行できるでしょう。 関連スレやURLは>>2-5 あたりを見てください。Ruby on Rails の質問は Webプログラミング板の Rails スレへ。 ■質問する人へ 質問する前に次の3つをすること。ここで回答を待つよりそのほうが早い。 ・モジュール名やエラーメッセージでググる ・マニュアルで引っかかったクラスの記述を探す www.ruby-lang.org/ja/man/ ・FAQを一応読む www.ruby-lang.org/ja/man/?cmd=view;name=Ruby+FAQ 質問には以下を書くこと。へたくそな質問は再提出を要求される。 ・詳しい内容(「動きません」「うまくできません」では回答しようがない) ・エラーメッセージ(自力で訳さずなるべくそのままで) ・実行環境(OS名、Rubyのバージョン(ruby -v でわかる)) ・最終的にやりたいこと(もっとよい方法がある場合が多いので) 回答してくれた人には「ありがとう」のひとことをいってあげて。 ■回答する人へ 相手は初心者、根気よく育てるつもりで。質問がへたくそなのも大目にみてあげる。 それができないならこないこと(だって初心者スレだもん)。 ・既出な質問やFAQは「XXXを読め」でいいので、叩かない&怖がらせない。 ・わけわかな質問にもエスパー発揮で。できれば質問の仕方を教えるぐらいで。 ・自信がない回答ならその旨表明すること。誤った回答は初心者じゃ見抜けない。
181 名前:デフォルトの名無しさん [2009/08/17(月) 21:54:05 ] cmplact?
182 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 21:54:11 ] length厨はマジでどうにかならんものか
183 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 21:58:14 ] size の方が好きなのけ?
184 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 21:58:26 ] >>170 sizeを調べる「しかない」わけではない。 cnt = 0 array.each {|x| cnt += 1 if some_condition(x) }
puts cnt あまり美しくないけど、どうぞ。
185 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 22:12:45 ] 質問です。 SGEをダウンロードしたいのだけれども、 www.etek.chalmers.se/~e8cal1/sge/index.html がNOT FOUNDになります。 いま、SGEはどこでダウンロードできますか?
186 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 22:27:53 ] 用途によって変えるっていう当たり前の答えが返ってくるとは思うけど・・・・ ary=["hage","hige","huge","hege","hoge"] の要素数を出力したいときに p ary.size これはaryを後で別の処理が行われると思われる場合でしょ んで、 p ["hage","hige","huge","hege","hoge"].size これは確認したい時だけでしょ んで、 ary_num=ary.size p ary_num ってやってる人がいるんだけど,これは変数が説明になってるってこと? どの段階で処理したものを変数に入れるかってのがわかんない。好き好きかな?
187 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 22:44:15 ] >aryを後で別の処理が行われると思われる場合 これは ["hage","hige","huge","hege","hoge"] の要素数を出力したいときに ary = ["hage","hige","huge","hege","hoge"] p ary.size という感じ aryに代入するのが前提なら、一番目は最も素直 二番目は主に説明・動作確認・デバッグで使われる 代入するのもめんどくさいとかスペース減らしたいとかそういうのが主な理由 三番目は正直くどい でも説明以外にも値をキャッシュしておきたいケースはあるし、そういう時には避けられない
188 名前:デフォルトの名無しさん mailto:sage [2009/08/17(月) 22:45:40 ] 二番目は説明というかスレや記事とかでの解説だった
189 名前:186 mailto:sage [2009/08/17(月) 23:03:10 ] >>187-188 2番めと3番めの説明がわかりやすかったです。ありがとうございます。
190 名前:デフォルトの名無しさん [2009/08/18(火) 00:40:37 ] >>180 低脳死ね。タイプ量が多い s/l//
191 名前:デフォルトの名無しさん [2009/08/18(火) 00:54:11 ] >>190 低脳死ね。置換できてない。 cmplact => cmpact 正しくは compact ^
192 名前:チンパンジー愛ちゃん [2009/08/18(火) 02:24:08 ] >>191 うきっきーきーきぃっ
193 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 05:15:32 ] >>185 質問するスレ間違ってね? まあいいや、ここ行ってみ ttp://www.archive.org/
194 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 09:49:05 ] >>175 C:\> dir a.txt (略) 2009/08/18 09:46 0 a.txt (略) C:\> ruby -e "open('a.txt:foo', 'w'){|f| f.write 'abc'}" C:\> dir a.txt (略) 2009/08/18 09:46 0 a.txt (略) C:\> ruby -e "p IO.read('a.txt:foo')" "abc"
195 名前:デフォルトの名無しさん [2009/08/18(火) 14:13:54 ] くだらない質問だと思いますが、文字列 a = "001011" b = "000111" から c = "000011" を求める(論理積?)にはどうしたら良いのでしょうか?
196 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 14:25:39 ] irb> a = "001011" irb> b = "000111" irb> ax = a.split(//n) irb> bx = b.split(//n) irb> p (0..5).to_a.map{|i| ax[i].to_i & bx[i].to_i}.join "000011"
197 名前:チンパンジー愛ちゃん [2009/08/18(火) 14:30:51 ] def and_str(a, b) return (Integer(a) & Integer(b)).to_s(2) end
198 名前:チンパンジー愛ちゃん [2009/08/18(火) 14:33:05 ] def and_str(a, b) return (Integer("0b" + a) & Integer("0b" + b)).to_s(2) end
199 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 14:38:04 ] >>196 1.9 だけでいいなら a[i] で分割いらないんだけどな どっちでも動作させるならまだ split がスレ的に無難か めんどい負の遺産じゃのう
200 名前:195 mailto:sage [2009/08/18(火) 14:45:00 ] >>196-199 ありがとうございました! 196が自分には理解しやすい一方、 198の方が速そうに見えるのですが(こちらはpaddingが必要ですね) 大量のデータを処理する際には、違いが出るでしょうか。
201 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 14:56:25 ] 100万桁を0.5秒で処理しないと銃殺されるとかそういう時にはチェックが必要
202 名前:195 mailto:sage [2009/08/18(火) 15:03:24 ] そこまで深刻じゃないので、また両方試してみます!
203 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 15:21:38 ] ハッシュがよくわからなくなったので質問させていただきます h={"ja"=>{"a"=>1,"b"=>1,"c"=>0}, "usa"=>{"a"=>0,"b"=>0,"c"=>0} } となって次に "usa"=>{"a"=>1,"b"=>1,"c"=>0}が出たら h={"ja"=>{"a"=>1,"b"=>1,"c"=>0}, "usa"=>{"a"=>1,"b"=>1,"c"=>0} } となってほしいのですが,どうすればいいでしょうか? 説明が分かり辛いですが・・・ ループ内にハッシュのキーが一致したら加算していってほしいのです
204 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 15:25:02 ] >>170 1.8.7以降なら Enumerable#count(obj)
205 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 15:29:26 ] >>203 とりあえず usa = {"a"=>1,"b"=>1,"c"=>0} を h["usa"] に加算する場合 h["usa"].merge!(usa) { |k, s, d| s += d } { "usa" => {"a"=>1,"b"=>1,"c"=>0} } でやりたいなら適当にネストさせて
206 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 15:30:16 ] 代入いらねーよorz h["usa"].merge!(usa) { |k, s, d| s + d }
207 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 15:37:29 ] >>198 def and_str(a, b) sprintf("%.*b", [a.length, b.length].max, (a.to_i(2) & b.to_i(2))) end
208 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 15:43:26 ] >>203 最初はとにかくやりたいことをそのまま書くといい 多くの場合、そのまま実行しても充分に速い def add(base, key, val) if tgt = base[key] val.each_pair do |k,v| if tgt[k] then tgt[k] = tgt[k] + v else tgt[k] = v end end else base[key] = val end end h={"ja"=>{"a"=>1,"b"=>1,"c"=>0}, "usa"=>{"a"=>0,"b"=>0,"c"=>0} } add(h, 'usa', {"a"=>1,"b"=>1,"c"=>0}) p h {"ja"=>{"a"=>1, "b"=>1, "c"=>0}, "usa"=>{"a"=>1, "b"=>1, "c"=>0}}
209 名前:203 mailto:sage [2009/08/18(火) 16:27:26 ] >>205-206 ,>>208 ありがとうございます。mergeを使ったりやaddを定義するのですね。 本当は require 'pp' ary=%w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4) window =6 hout=Hash.new ary.size.times{ |i| hin=Hash.new(0) hc =Hash.new(0) b= ary[i+1,window].select { |word| word =~ /[^#{ary[i]}]/ } pp b b.each {|count| hin[count] +=1} hout[ary[i]] = hin puts "@@@" pp hout puts "@@@" } pp hout こんなことをやってます。 最後の pp houtが自分の思ったものと違っていて悩んでいます. 完全質問だと悪いと思って203で質問しました。
210 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 19:12:53 ] ghoti.rb:30:in `initialize': Wrong arguments for overloaded method 'Tagger.new'. (ArgumentError) どうしたらいいんでしょう><
211 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 20:02:54 ] >>210 正しいMeCabバインディングを使う Taggerは今SourceForgeにあるMeCabバインディングをそもそも知らない
212 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 20:48:35 ] >>211 hm.. ってことはMeCabがバージョン9.07ではダメってことで、 古いバージョンのMeCabでおk って解釈でいいんですかね?
213 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 21:08:14 ] 6年前のな
214 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 21:17:36 ] MeCab本体とMeCabライブラリは違う
215 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 21:25:58 ] ghoti.rb:30:in `initialize': Wrong arguments for overloaded method 'Tagger.new'. (ArgumentError) Possible C/C++ prototypes are: Tagger.new(char const *argc) Tagger.new() 少しいじった結果エラーログがこうなりました・・。 これはスクリプト書き換えとかで回避できないんでしょうか?
216 名前:203 mailto:sage [2009/08/18(火) 21:30:24 ] >>205->>206 ,>>208 さんのもの自体は理解できたのですが, やはり>>209 での問題が解決しませんでした. ハッシュのハッシュのvalueを加算していきたいのですが助言お願いします.
217 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 21:57:11 ] どんな値が返ってくれば正解なのかすら知らせずに丸投げとな require 'pp' ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4) window = 6 hout = Hash.new ary.size.times do |i| b = ary[i + 1, window].delete_if{|w| /#{ary[i]}/ =~ w} b.each do |w| hout[w] = 0 unless hout[w] hout[w] += 1 end end pp hout {"w1"=> 10, "w2"=> 9, "w3"=> 11, "w4"=> 9, "w5"=> 6}
218 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 22:02:04 ] require 'pp' ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4) window = 6 hout = Hash.new ary.size.times do |i| ary[i+1, window].each do |w| next if /#{ary[i]}/ =~ w hout[w] = 0 unless hout[w] hout[w] += 1 end end pp hout
219 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 22:28:25 ] require 'pp' ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4) window = 6 hout = Hash.new(0) ary.size.times do |i| ary[i+1, window].reject{|w| w == ary[i]}.each{|w| hout[w] += 1} end pp hout
220 名前:203 mailto:sage [2009/08/18(火) 22:30:53 ] >>217->>218 すいません。欲しい出力を書いていませんでした。申し訳ありません。 {"w1"=>{"w2"=>4, "w3"=>4, "w4"=>3, "w5"=>2}, "w2"=>{"w1"=>4, "w3"=>5, "w4"=>2, "w5"=>1}, "w3"=>{"w1"=>4, "w2"=>2, "w4"=>3, "w5"=>2}, "w4"=>{"w1"=>2, "w2"=>2, "w3"=>1, "w5"=>1}, "w5"=>{"w1"=>0, "w2"=>1, "w3"=>1, "w4"=>1}} と出力して欲しいのです。
221 名前:チンパンジー愛ちゃん [2009/08/18(火) 23:01:40 ] require 'pp' def hash_add(base, add) ret = add.each do |nest_key, nest_value| if base[nest_key] nest_value.each do |add_key, add_value| base[nest_key][add_key] += add_value end else base[nest_key] = nest_value end end return base end h1 = { "ja"=>{"a"=>5,"b"=>7,"c"=>9}, "usa"=>{"a"=>4,"b"=>2,"c"=>1} } # $(B$H$J$C$F<!$K(B h2 = { "ja"=>{"a"=>3,"b"=>8,"c"=>4}, "usa"=>{"a"=>14,"b"=>8,"c"=>5} } # $(B$,=P$?$i(B pp hash_add(h1, h2) # h1.inspect h = { "ja"=>{"a"=>1,"b"=>1,"c"=>0}, "usa"=>{"a"=>1,"b"=>1,"c"=>0} }
222 名前:デフォルトの名無しさん mailto:sage [2009/08/18(火) 23:07:58 ] require 'pp' ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4) zero = ary.uniq.inject(Hash.new){|h,w| h[w] = 0 ; h } window = 6 hout = Hash.new ary.each_with_index do |key,i| (hout[key] = zero.dup).delete(key) unless hout.key?(key) ary[i+1,window].select{|e| e != key }.each {|word| hout[key][word] += 1 } end
223 名前:チンパンジー愛ちゃん [2009/08/18(火) 23:25:03 ] 核と思われる部分だけを抜き出すとこんなことになるんだけど、 問題をうまくまとめれてないんじゃない? もうちょっと整理してから再度質問して。 require 'pp' ary = %w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4) window =6 ary.size.times { |i| j = i + 1 p [":ary[#{j},#{window}]", ary[j, window]] } t217.3.rb [utf-8][unix] :!ruby t217.3.rb [":ary[1,6]", ["w2", "w3", "w4", "w2", "w3", "w1"]] [":ary[2,6]", ["w3", "w4", "w2", "w3", "w1", "w1"]] [":ary[3,6]", ["w4", "w2", "w3", "w1", "w1", "w5"]] [":ary[4,6]", ["w2", "w3", "w1", "w1", "w5", "w2"]] [":ary[5,6]", ["w3", "w1", "w1", "w5", "w2", "w3"]] [":ary[6,6]", ["w1", "w1", "w5", "w2", "w3", "w4"]] [":ary[7,6]", ["w1", "w5", "w2", "w3", "w4"]] [":ary[8,6]", ["w5", "w2", "w3", "w4"]] [":ary[9,6]", ["w2", "w3", "w4"]] [":ary[10,6]", ["w3", "w4"]] [":ary[11,6]", ["w4"]] [":ary[12,6]", []]
224 名前:チンパンジー愛ちゃん [2009/08/18(火) 23:25:52 ] ary[12, 6]がおかしいと思わない?
225 名前:203 mailto:sage [2009/08/18(火) 23:44:32 ] >>221->>224 ありがとうございます。 hout=Hash.new ary.size.times{ |i| hin=Hash.new(0) でhinを初期化しているから同じkeyが来たときに上書きされてしまっているのが一つ問題と 同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする方法がわからないのがもう一つの問題です。 mergeの方法は>>205-206 ,>>208 さんのやり方になるのかなと思ってます。 >>224 ary[12,6]はそれでもOKだと思ってます。 そこは加算しなくていいよーということで。だめなんでしょうか?
226 名前:チンパンジー愛ちゃん [2009/08/18(火) 23:45:41 ] >>215 @mecab = MeCab::Tagger.new([$0]) ってかいてあるところに @mecab = MeCab::Tagger.new("arg1 arg2 arg3 arg4 ...") みたいな感じで直接Mecab用のオプション書けばうまくいくよ
227 名前:チンパンジー愛ちゃん [2009/08/18(火) 23:53:51 ] >>225 ary[12, 6]をきちんと認識しているのなら何も問題はないでふ ただ、ここがバグの原因じゃないかな?と思っただけで。 Hash.new(0) してあるんだから、 「同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする」 は、 h["unknown_value"] += unknown_value_key と直接書けばよいでしょ。 以下のコードの実行結果の予想つく? h0 = Hash.new(0) hash = {} p h0[:unknown_keh0 = Hash.new(0) hash = {} p h0[:unknown_key] p h0[:unknown_key] += 5 p hash[:unknown_key] p hash[:unknown_key] += 5 y] p h0[:unknown_key] += 5 p hash[:unknown_key] p hash[:unknown_key] += 5
228 名前:チンパンジー愛ちゃん [2009/08/18(火) 23:55:27 ] 上のはゴミコードが入っちゃった。ごめん。 こっちのコードの実行結果の予想つく? h0 = Hash.new(0) hash = {} p h0[:unknown_key] p h0[:unknown_key] += 5 p hash[:unknown_key] p hash[:unknown_key] += 5
229 名前:チンパンジー愛ちゃん [2009/08/18(火) 23:57:18 ] rails仙人やーい
230 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 00:04:07 ] >>228 0 5 0 5 では・・・・ないんですか?すいません。 あと:unknownという表記になれていませんのでそこがわかりません。
231 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 00:10:07 ] windows用に作られたRubyファイルを動かしたいのですが、ディレクトリがDOSの¥が使われていてファイルを指定できません・・。 No such file or directory - .\/log.txt (Errno::ENOENT) このようになります。 ディレクトリ指定をLinux用の表現にしたいんですけど、ソースを見てもまったくわかりません。 その部分を書き換えられれば動くと思うんですが、何をどう書き換えればいいかご教授いただけないでしょうか
232 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 00:14:36 ] >>226 @mecab = MeCab::Tagger.new("arg1 arg2 arg3 arg4 ...") と書いてみましたが・・。 何を見て何のオプションを書き加えていけばいいんでしょうか・・?
233 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 00:16:04 ] >>231 原因がわかってるように見えるので、むしろ何がわからないのかわかりません 適当な、それっぽいコード塊でも提示すれば何か答えようがあるかもだけど
234 名前:チンパンジー愛ちゃん [2009/08/19(水) 00:16:39 ] >>230 :aaaとかはシンボルっていうんだけど、 シンボルが難しいんならいいや以下のコードで考えて。 h0 = Hash.new(0) hash = {} # Hash.new と等価 p h0["unknown_key"] p h0["unknown_key"] += 5 p hash["unknown_key"] p hash["unknown_key"] += 5 実行結果の予想は間違ってるよ。 0 5 nil h.rb:6: undefined method `+' for nil:NilClass (NoMethodError) 自分で確認してね。 あとさ、Hash.newの挙動が分かってないので、Hashの初期化について学んで来てください。
235 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 00:16:56 ] >>231 それで躓くとなるとRubyどころかプログラム自体初心者じゃないかと思う でなければよほど面倒なことをしてるソースか どちらにせよソース提示が必要かと
236 名前:チンパンジー愛ちゃん [2009/08/19(水) 00:27:23 ] >>232 ええーっ! @mecab = MeCab::Tagger.new("arg1 arg2 arg3 arg4 ...") ってほんとうに実行したの? argの意味が分からない系のヒトなのか チンパンジー愛ちゃんでもできたのにねー まあ、いいや。 OSとOSのバージョン・種類、rubyのバージョン、 mecabのバージョン、mecab-rubyのバージョン、mecab用辞書のバージョン @mecab = MeCab::Tagger.newとして実行ときのエラーメッセージ これらすべてを答えてね。 # 個人的な興味として何でghotiなんて使おうと思ったの?
237 名前:チンパンジー愛ちゃん [2009/08/19(水) 00:28:38 ] 追加で、ruby, mecab, mecab-ruby, mecab用辞書 これらすべてのインストール方法も書いてね。
238 名前:203 mailto:sage [2009/08/19(水) 00:30:44 ] >>234 ありがとうございます。シンボルですか。了解です。 h0 = Hash.new(0) #ハッシュh0を作り初期値は0 hash = {} # Hash.new と等価 #ハッシュhashを作成(ハッシュの箱を作っただけ) p h0["unknown_key"] #h0のkeyをunknown_keyとしてそのvalueを出力->初期値0 p h0["unknown_key"] += 5#↑のkeyのvalueに5加算 p hash["unknown_key"] #hashのkeyをunknown_keyとしてそのvalueを出力->でも中身が入ってないからnil p hash["unknown_key"] += 5 #↑中身がわかってないのに5たしてんじゃねーよ ということですね。少しわかりました。
239 名前:231 mailto:sage [2009/08/19(水) 00:30:53 ] エラーの行は from ******.rb:444:in `open' from ******.rb:444:in `store_text' def store_text(lines) ary = [] lines.each do |line| ary << line.gsub(/\s+/, ' ').strip ←ココ 444行目 end ary.each do |line| @text << line end File.open(@text_filename, 'a') do |fp| ary.each do |line| line.chomp! fp.puts line end
240 名前:231 mailto:sage [2009/08/19(水) 00:31:59 ] from ******.rb:239:in `memorize' def memorize(lines) @dic.store_text(lines) ←ココ239行目 if @dic.learn_from_text @dic.save_dictionary end end from ******.rb:779 require 'readline' ←779行目 ****** = ******.new(".\\") puts "Welcome to The ******" while (str = Readline.readline("> ", true)) break if /^(exit|quit)?$/.match(str) ******.memorize(str) res = ******.talk puts res end ******はファイル名です。
241 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 00:37:06 ] >>236 OS Ubuntu9.04 ruby 1.84 mecab 0.97 インスコ方法とかは ttp://d.hatena.ne.jp/shohu33/20090216/1234781661このページを参考に。というより、コピペでコンソールに張り付けて実行してインスコしていきました・・。 rubyなどは全部apt-getです。 ghotiでtwitter用のBOT作るんだ><
242 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 00:38:20 ] >>231 =>>239-240 @text_filename この中身をセットしている所をチェックしてみれば? もしくは単純に、 File.open(@text_filename, 'a') do |fp| の直前で、 p @text_filename してみるとか。 まあごっつい原始的なデバグ法で気が引けるが。
243 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 00:41:00 ] 人工無脳流行ってんの? >>240 その*****とやらのクラスのinitializeの第一引数どうなってる? >****** = ******.new(".\\") の .\ に log.txt を結合してるんだと思う
244 名前:242 mailto:sage [2009/08/19(水) 00:42:50 ] >>243 をお。 ちゃんと読めばそこまで読み取れるのか。斜め読みいくないね。人口無能レベルのレススマソ
245 名前:195 mailto:sage [2009/08/19(水) 00:49:25 ] 流れをぶったぎってすみません。ちょっと質問。 配列のデフォルト値の指定ってできますか? ハッシュ(デフォルト値==0)だったら hoge = Hash.new(0)だけど 配列は同じ構文で要素数指定になりますよね。 ary = [] ary.default(0) ary[3] #=> 0 みたいなことがやりたいのです。
246 名前:231 mailto:sage [2009/08/19(水) 00:51:06 ] def initialize(dirname) def initialize(dirname=nil) def initialize(buf) def initialize(ary=nil) 第一引数がわかりません>< ruby難しいですorz
247 名前:チンパンジー愛ちゃん [2009/08/19(水) 00:51:50 ] >>239 なんだー?それは。 ghoti.rbが実行できないわけではないのか。 ココ444行目とかかかれても何のエラーか分かんねーよ。 どーせnilがsub呼んだってエラーだろーけどなー 239行目は分からない、でも@dicをみるにmecabの辞書をインストールしてないんでしょ。 779行目はreadlineっていうライブラリがないってだけでしょ。 で、そういうライブラリなし・辞書なしとかのエラーだと予想したからこそ、 >>236-237 の OSとOSのバージョン・種類、rubyのバージョン、 mecabのバージョン、mecab-rubyのバージョン、mecab用辞書のバージョン @mecab = MeCab::Tagger.newとして実行ときのエラーメッセージ これらすべてを答えてね。 追加で、ruby, mecab, mecab-ruby, mecab用辞書 これらすべてのインストール方法も書いてね。 って質問を書いておいたんだけどな。 どうやってインストールされていたか分からないなら分からないと正直に書いて。 とりあえず答えてくれれば解決方法を伝えるようにがんばるけど答えないなら知らない。諦めてね。 >>203 (208) >>227 で愛ちゃんが書いた以下のコードを理解してもらいたくって >>228 , >>234 を書いたってことを理解してね。 ------------------------------------- Hash.new(0) してあるんだから、 「同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする」 は、h["unknown_value"] += unknown_value_key と直接書けばよいでしょ。
248 名前:チンパンジー愛ちゃん [2009/08/19(水) 00:53:11 ] およよ、書かれてた。ごめんね。 リロードせずに書いちゃった。 >>247 はとりあえずキャンセル
249 名前:チンパンジー愛ちゃん [2009/08/19(水) 00:59:00 ] 質問者が入り乱れてて分け分からなくなってきた。 チンパンジーの限界か! >>232 の質問の続きだと思って>>239 のレスに答えてた。 >>232 には>>247 で悪いことをした。ごめんね
250 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 01:00:32 ] 愛ちゃんかわいいよ愛ちゃん てかコテハンうぜぇw
251 名前:231 mailto:sage [2009/08/19(水) 01:09:23 ] ****** = ******.new (".\\")→(ARGV[0] || "data")でいいんですかね・・
252 名前:231 mailto:sage [2009/08/19(水) 01:10:30 ] むりですね。。
253 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 01:14:25 ] >>251-252 なんか吹いた ******.new (".\\") のコード(initialize)を出せって言われとろーがwww 大体その******は、全部同じものか?違うなら、HogeとかPageとか適当に分けやがれw
254 名前:チンパンジー愛ちゃん [2009/08/19(水) 01:15:11 ] >>247 何でUbuntu9.04にruby1.84が入っているんだ。 私も9.04使ってるけどruby1.87が入ってたけどな。 それとリンク先はpythonの説明だったぞ。 なぜruby使いにpythonの記事を読ませた!死罪也! まさかとは思うけど、pythonとrubyの区別がついてなくて リンク先の記事はrubyの解説だと思っているってことはないよね? @mecab = MeCab::Tagger.new って実行してエラーメッセージを貼ってね。 個人的にはmecab用の辞書入れていないことが問題だと思っているけどね。 あと、mecab-ruby, mecab用辞書のバージョンもちゃんと書いてね。
255 名前:231 mailto:sage [2009/08/19(水) 01:25:16 ] >>253 ******は同じ文字列です。。 コードのだしかたが・・。 module ****** def ******.new(*args) ******::Core.new(*args) end def ******.init_dictionary(dirname) dic = Dictionary.new(dirname) dic.load_text dic.learn_from_text(true) dic end class Dictionary TEXT_FILENAME = '******.txt' DIC_FILENAME = '******.dic' def Dictionary.load(dirname) dic = Dictionary.new(dirname) dic.load_text dic.load_dictionary dic end こうですか?わかりません><
256 名前:203 mailto:sage [2009/08/19(水) 01:25:22 ] >>247 >Hash.new(0) >してあるんだから、 >「同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする」 >は、h["unknown_value"] += unknown_value_key >と直接書けばよいでしょ。 すいません。ここが理解できてないです。 hout=Hash.new ary.size.times{ |i| hin=Hash.new(0) b= ary[i+1,window].select { |word| word =~ /[^#{ary[i]}]/ } b.each {|count| hin[count] +=1} pp hin puts "@@@" pp hout puts "@@@" } pp hout ------- hout[ary[i]] += hin.valuesだとhoutは初期値がないから undefined method `+' for nil:NilClass (NoMethodError) ですもんね・・・・。
257 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 01:27:53 ] >>255 おk。わかった。 とりあえず、>>231 に戻って ******.new (".\\") を ******.new (".") にしてみろ。 それでダメなら、ちゃんとソース嫁。
258 名前:231 mailto:sage [2009/08/19(水) 01:29:39 ] >>257 ネ申 ありがとうございます。ありがとうございます。
259 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 01:34:02 ] >>258 怖い、怖いよw 本当にそれでいいか、一度ソースを読むことを激しくお勧めする。 てかRubyほとんど関係ねえ!
260 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 01:37:44 ] >>259 文字化けしますが、文字コードの謎の不具合のせいなので調整すれば大丈夫そうです。 あとはPerlでの作業なのでなんとかなるでしょう。。 Ruby難しいです・・。ソース読めません・・。
261 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 01:42:18 ] >>203 >>222 だけどあれじゃだめなの?それとも途中経過の出力が必要? ary.each_with_index do |key,i| (hout[key] = zero.dup).delete(key) unless hout.key?(key) ary[i+1,window].select{|e| e != key }.each {|word| hout[key][word] += 1 } pp hout[key],'@@@',hout,'@@@', end pp hout
262 名前:203 mailto:sage [2009/08/19(水) 01:47:10 ] >>222 ありがとうございます。出力結果はOKですし、ソースも読解します。 でも、まず、自分が書いた奴がなぜ結果まで持って行けないかわかってないので チンパンさんに教えてもらっている感じです。
263 名前:チンパンジー愛ちゃん [2009/08/19(水) 01:57:45 ] >>256 「同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算して、なければmergeする」 以下の時にA.B.と分けて考えよう。 h1 = hash.new(0) h1 = h1.merge({"a" => 2, "b" => 3})# h1.merge!({"a" => 2, "b" => 3})でも可 h2 = {"a" => 3, "c" => 8} A.同じkeyが来たときにそのvalueの中にあるハッシュで同じモノがあれば加算 B.なければmergeする A.これは、以下のままでよいから特に難しくないね。 h1["a"] += h2["a"] B.は h1["c"] += h2["c"] と等価なんだよね。 p h1["unknown_key"] += 5 を思い出してね。 すると、A.Bの時に場合分けは特に必要なく、 h["unknown_value"] += unknown_value_key のコードで事足りるよね。
264 名前:203 mailto:sage [2009/08/19(水) 02:16:49 ] >>263 A,Bの場合分けが入らないのは理解しました。 h["unknown_value"] += unknown_value_key これは ハッシュhにunknownのvalueをkeyとしたものに unknownのvalueのkeyのvalueを足しているということでいいんですか? アンダースコアをどのように使っているかわかりません。 hout[ary[i]] とやらないと w1"=>{"w2"=>4, "w3"=>4, "w4"=>3, "w5"=>2} のw1=>が得られないと思っているのですが、それもちがいますか?
265 名前:231 mailto:sage [2009/08/19(水) 02:19:29 ] else chr = /./m.match(str)[0] result << chr if num str = Regexp.last_match.post_match end この部分で ぬるぽ って言われるんですが。 NilClass (NoMethodError) 単なる文法間違いですか・・?
266 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 02:19:39 ] >>262 「自分で書いた」ってのは>>209 の事かな あれがうまく行かないのはこの行で前のループのデータを上書きしてる為。 hout[ary[i]] = hin ここに>>208 氏のメソッドを使えば>>220 に近い結果が出せた。 add(hout,ary[i],hin) マージに拘りすぎ、普通に枚挙すれ
267 名前:チンパンジー愛ちゃん [2009/08/19(水) 02:30:13 ] >>264 アンダースコアは気にしないで。単語の区切りに使っただけ。 こっちの方が迷わなくていいかな。 ×h["unknown_value"] += unknown_value_key ○h["unknownkey"] += unknownvalue これはhのハッシュに存在していないキーのことをいいたかったんだけど、 愛ちゃんの変数名の付け方がおかしかったね。ごめんね。 > これは ハッシュhにunknownのvalueをkeyとしたものに > unknownのvalueのkeyのvalueを足しているということでいいんですか? 話がややこしくなってるね。変な変数名でごめんね。 > hout[ary[i]] とやらないと... これは正しいよ。そうしないと得られないよ。
268 名前:203 mailto:sage [2009/08/19(水) 03:10:28 ] >>266 ありがとうございます。上書きしていたのは気がついたのですがそのように書くしか思いつかなかったので手がでませんでした。 addでやったところvalueが0の所は出力されていませんが、欲しいモノで出力されました。 >>267 変数名に関して理解しました。 しかし、hout[ary[i]] = hinの所をどのようにh["unknownkey"] += unknownvalue と結びつけるかわかりません。 h["unknownkey"] += unknownvalue はhinの方ですよね。
269 名前:チンパンジー愛ちゃん [2009/08/19(水) 03:51:55 ] > しかし、hout[ary[i]] = hinの所をどのようにh["unknownkey"] += unknownvalue と > 結びつけるかわかりません。h["unknownkey"] += unknownvalue はhinの方ですよね うんにゃ、違うよ。hinじゃないよ。 h["unknownkey"] += unknownvalue と結びつけて考えないといけないのは以下の箇所 hout[ary[i]] = hin# ここを以下のように変更すれば期待通りに動くはず hin.each do |key, value| hout[ary[i]][key] += value end
270 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 04:43:35 ] 的確なレスもできないくせにコテうぜえ
271 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 05:30:04 ] ナツノオモイデ君はどこでも厄介だ >>265 本当に何も考えていないWindows用スクリプトなのなら日本語はShiftJIS決め打ちだろ 入力する日本語を全部ShiftJISにして$KCODE相当もShiftJISにしてみ
272 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 06:01:39 ] >>245 arr = Array.new p arr[3] #=> nil これを「nil ではなく 0」にしたいのだと推測 できません 「arr[3] が nil なら 0 を代入」という手順を経るのが通例です この明示的な動作で要素3までの配列が確定され、「空」だった要素にはnilが代入されます 配列の自動初期値設定というのはあったらあったで便利っぽい機能なんですが、おそらくは 「nil以外のオブジェクトが勝手に若い要素全てに代入される」 という動作が Ruby 添付クラス的にキモいということで嫌われたのでしょう もし必要なサイズがあらかじめわかっているのなら、その大きさの配列を作って Array#fill で埋めるか arr = Array.new(5) arr.fill{ 0 } p arr[3] #=> 0 p arr #=> [0, 0, 0, 0, 0] あるいは new のときにやっちゃってください arr = Array.new(5){ 0 } p arr[3] #=> 0 p arr #=> [0, 0, 0, 0, 0] [] メソッドで参照しただけで若い要素が 0 で埋まる配列クラスと言うのを自作しても構いませんが、多分動作遅いと思われます
273 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 11:00:07 ] >>245 Rubyの配列にはそういう機能がないです。残念でした。 代替案としては arr[x] で参照するかわりに (arr[x] ||= 0) とするとか。 たとえば arr = [1, 2, 3] puts (arr[5] ||= 0) + 1 みたいな。 あとは Array#[] を上書きすればいいのかなー class Array def [](x) val = super(x) val = self[x] = 0 if val.nil? return val end end とか。
274 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 11:12:08 ] >>231 めんどくせぇソース全文うpってくれ
275 名前:203 mailto:sage [2009/08/19(水) 11:43:54 ] >>263 遅くなってすいません。こうですか? require 'pp' ary=%w(w1 w2 w3 w4 w2 w3 w1 w1 w5 w2 w3 w4) window =6 hout=Hash.new ary.size.times{ |i| hin=Hash.new(0) b= ary[i+1,window].select { |word| word =~ /[^#{ary[i]}]/ } b.each {|count| hin[count] +=1} #hout[ary[i]] = hin hin.each do |key, value| hout[ary[i]][key] += value end } pp hout 実行すると at.rb:12: undefined method `[]' for nil:NilClass (NoMethodError) from mat.rb:11:in `each' from mat.rb:11 from mat.rb:5:in `times' from mat.rb:5 となってしまいます。
276 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 12:01:02 ] >>275 自分で考えてほしいからエラーのヒントだけ >hout=Hash.new >#hout[ary[i]] = hin >hout[ary[i]][key] += value >at.rb:12: undefined method `[]' for nil:NilClass (NoMethodError)
277 名前:203 mailto:sage [2009/08/19(水) 12:32:53 ] >>276 hout[ary[i]][key] Hashが二つ[][]を取っているのが気持ち悪いですし、それがundefined method `[]' for nil:NilClass (NoMethodError) を起こしているのだと思いますが・・・・。そうだとしても解決がわからないです。
278 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 12:44:23 ] >>277 >hout[ary[i]][key] k = ary[i] x = hout[k] y = x[key] と同じ で、このときのxはなんだとおもう?
279 名前:203 mailto:sage [2009/08/19(水) 12:50:17 ] >>278 xはhout[ary[i]]ですか? ということはhout[ary[i]]が一つのハッシュでhout[ary[i]][key]だとそれのキーということですか?
280 名前:デフォルトの名無しさん mailto:sage [2009/08/19(水) 12:58:15 ] なんどめだナウシカ ハッシュの h[key] は、「ハッシュ機構」という特殊なものがあるわけじゃなくて 「オブジェクト h の [] メソッドに引数 key を渡している」 という処理を簡単に表記できるように特別扱いされたものに過ぎない h = {'one' => 1'} p h['one'] #=> 1 p h.[]('one') #=> 1 つまり、h['one']['two'] という表記があったなら、それは h.[]('one').[]('two') というメソッドチェーンを表しているに過ぎない メソッドチェーンだから、[]('two') のレシーバ、つまりドットの前の、h.[]('one') の返り値、 が nil だと普通に NoMethodError になる そんだけ
281 名前:203 mailto:sage [2009/08/19(水) 12:58:33 ] あぁ、hout[ary[i]][key]はhout[ary[i]]のkeyがkeyの時のvalueですね