2012-02-08 13 views
1

私はcardmagicクラシファイアgemを使用してクラシファイアを作成しようとしています。これは私のコードです:nilクラスエラーの未定義メソッドをどのようにデバッグできますか?

require 'classifier' 

classifications = '1007.09', '1006.03' 
traindata = Hash["1007.09" => "ADAPTER- SCREENING FOR VALVES VBS", "1006.03" => "ACTUATOR- LINEAR"] 

b = Classifier::Bayes.new classifications 

traindata.each do |key, value| 
b.train(key, value) 
end 

しかし、私はこれを実行すると、私は次のエラーを取得:

# Provides a general training method for all categories specified in Bayes#new 
# For example: 
#  b = Classifier::Bayes.new 'This', 'That', 'the_other' 
#  b.train :this, "This text" 
#  b.train "that", "That text" 
#  b.train "The other", "The other text" 
def train(category, text) 
    category = category.prepare_category_name 
    text.word_hash.each do |word, count| 
    @categories[category][word]  ||=  0 
    @categories[category][word]  +=  count 
    @total_words += count 
    end 
end 

私は失われています:これは宝石コードからソースです

Notice: for 10x faster LSI support, please install http://rb-gsl.rubyforge.org/ 
c:/Ruby192/lib/ruby/gems/1.9.1/gems/classifier-1.3.3/lib/classifier/bayes.rb:27:in `block in train': undefined method `[]' for nil:NilClass (NoMethodError) 
    from c:/Ruby192/lib/ruby/gems/1.9.1/gems/classifier-1.3.3/lib/classifier/bayes.rb:26:in `each' 
    from c:/Ruby192/lib/ruby/gems/1.9.1/gems/classifier-1.3.3/lib/classifier/bayes.rb:26:in `train' 
    from C:/_Chris/Code/classifier/smdclasser.rb:13:in `block in <main>' 
    from C:/_Chris/Code/classifier/smdclasser.rb:11:in `each' 
    from C:/_Chris/Code/classifier/smdclasser.rb:11:in `<main>' 

をこのエラーをトラブルシューティングするには、次のステップは何ですか?

+0

私は私のコードで何らかの問題を処理するときにデバッガを使用することを大いに信じています。 Rubyの 'rdebug'はとてもいいですし、私が開発しているときにそのレベルで一度も検査されないコードはありません。私は肛門ですが、結果としてバグ報告が低くなります。 Ruby 1.8では 'gem install rdebug'、1.9.2では' gem install rdebug19'をチェックしてください。 –

+0

私はデバッガを使ったことが一度もありません。私はこれをaptanaスタジオで書いています。通常、私はバグがあるとき、私はコードに従って、セマンティクスと構文の知識を使って問題を見ています。私はスタックするか、エラーメッセージのためにgoogleに来る。 – holaSenor

答えて

5

Classifier::Bayes.newは、単一のパラメータではなく、値の分解された配列を必要とします。

b = Classifier::Bayes.new 'This', 'That', 'the_other' 

いうより:たとえば、サンプルコードを使用することに注意してくださいあなたのclassifications配列のスプラットバージョンで

b = Classifier::Bayes.new ['This', 'That', 'the_other'] 

パスとそれが動作するはずです:

b = Classifier::Bayes.new *classifications 
+0

別の質問、私のtraindataハッシュでは、複数の文の値で '1007.09'という分類を訓練したいのですが?ハッシュは一意のキーのみを許可し、重複するキーを追加する場合は、traindata.lengthを使用して1つを数えます。私は単純に新しいハッシュを作成し、一度に1つのハッシュを使ってそれを訓練するのではなく、各ハッシュでそれを訓練しますか? – holaSenor

+0

はい、 '{" 1007.09 "=> ["最初の文 "、" 2番目の文 "]}'のようなものです。また、 'each'ループを更新して各配列値を繰り返し処理する必要があります。 –

関連する問題