0

私は非常に苛立たしい問題を抱えています。私はruby1.8.7を使用して自宅のマシンにubuntu12.04を持っており、自宅のマシンで完全にコンパイルおよび実行されるプロジェクトをほとんど完了していませんが、大学のラボに移植したとき(グレードを取得するにはコンパイルする必要があります) 、ruby 1.8.7も実行しています)次のエラーが発生します:

`require': no such file to load -- bigdecimal (LoadError)

私が必要としているBigDecimalクラスは、プロジェクトの対数計算で浮動小数点の精度を上げるために必要なクラスです。なぜこれが問題になるのかを誰かが私に解読するのを手伝ってもらえますか?BigDecimalクラスは1.8.7のrubyコアライブラリに含まれていると思いましたか?ここで何かが足りませんか?編集:コンパイルされているコード。

  `#this is the language model generator
    require "trainer"
    require "bigdecimal"

class Model
    attr_accessor :frequency_tables

def initialize(trainer, test_file)
@trainer = trainer
@frequency_tables = []
@frequency_tables[0] = trainer.corpus
@frequency_tables[1] = trainer.freq
@frequency_tables[2] = trainer.bifreq
@frequency_tables[3] = trainer.trifreq
@frequency_tables[4] = trainer.word_count()
@frequency_tables[5] = trainer.vocab_count()
end

def unigram_count(string)
string.upcase!
return @frequency_tables[1][string]
end
def bigram_count(string)
string.upcase!
return @frequency_tables[2][string]
end
def trigram_count(string)
string.upcase!
return @frequency_tables[3][string]
end

def round(float)
return ((float * 10000).round.to_f) / 10000 
end

def process_unigram(sentence)
probability = BigDecimal.new("1") 
sen_arr = sentence.split(" ")
sen_arr.each { |word|
#  binding.pry
  probability *= (BigDecimal.new(unigram_count(word).to_s()) / BigDecimal.new(@frequency_tables[4].to_s())) 
}
unless probability.eql? 0
    val= ((Math.log(probability)/Math.log(2))) 
    return retval = round(val)  
end
return "undefined" 
end

def process_bigram(sentence)
probability = BigDecimal.new("1")
sen_arr = sentence.split(" ")
for i in (0..(sen_arr.length-1))
  unless i == 0
  denom = BigDecimal.new(unigram_count(sen_arr[i-1]).to_s())/BigDecimal.new(@frequency_tables[4].to_s())
    unless denom.eql? 0
      probability *= (BigDecimal.new(bigram_count(sen_arr[i-1]+" "+sen_arr[i]).to_s()) / BigDecimal.new(@frequency_tables[4].to_s()))/denom  
     else
      probability = 0
     end
  else
  probability *= (BigDecimal.new(bigram_count("PHI "+sen_arr[i]).to_s()) / BigDecimal.new(@frequency_tables[4].to_s())) / (BigDecimal.new(unigram_count("PHI").to_s())/BigDecimal.new(@frequency_tables[4].to_s()))   
  end
end
unless probability.eql? 0
    val= ((Math.log(probability)/Math.log(2))) 
    retval = round(val) 
    return retval
end
return "undefined"
end

def process_trigram(sentence)
probability = BigDecimal.new("1")
sen_arr = sentence.split(" ")
for i in (0..(sen_arr.length-1))
  if i >= 2
  denom = (BigDecimal.new(bigram_count(sen_arr[i-2]+" "+sen_arr[i-1]).to_s()))
      unless denom.eql? 0
      probability *= (BigDecimal.new(trigram_count(sen_arr[i-2]+" "+sen_arr[i-1]+" "+sen_arr[i]).to_s()))/denom   
      else
    probability *= 0
      end
  elsif i == 1
  denom = (BigDecimal.new(bigram_count("PHI "+sen_arr[i-1]).to_s()))
      unless denom.eql? 0
      probability *= (BigDecimal.new(trigram_count("PHI "+sen_arr[i-1]+" "+sen_arr[i]).to_s()))/denom  
      else
      probability = 0
      end
  else
  probability *= (BigDecimal.new(trigram_count("PHI PHI "+sen_arr[i]).to_s())) / (BigDecimal.new(unigram_count("PHI").to_s()))   
  end
end
unless probability.eql? 0 
    val= ((Math.log(probability)/Math.log(2))) 
    retval = round(val) 
    return retval
end
return "undefined"
end

def process_smooth_bigram(sentence)
probability = BigDecimal.new("1")
sen_arr = sentence.split(" ")
for i in (0..(sen_arr.length-1))
  unless i == 0
  bigram_c = bigram_count(sen_arr[i-1]+" "+sen_arr[i])+1
  ugram_c = unigram_count(sen_arr[i-1])+@frequency_tables[5]
  probability *= (BigDecimal.new(bigram_c.to_s()))/(BigDecimal.new(ugram_c.to_s()))   
  else
  probability *= (BigDecimal.new((bigram_count("PHI "+sen_arr[i])+1).to_s())) / (BigDecimal.new((unigram_count("PHI")+@frequency_tables[5]).to_s()))   
  end
end
unless probability.eql? 0
    val= ((Math.log(probability)/Math.log(2))) 
    retval = round(val) 
    return retval
end
return "undefined"
end

def process_smooth_trigram(sentence)
probability = BigDecimal.new("1")
sen_arr = sentence.split(" ")
for i in (0..(sen_arr.length-1))
  if i >= 2
  denom = (BigDecimal.new((bigram_count(sen_arr[i-2]+" "+sen_arr[i-1])+@frequency_tables[5]).to_s()))
  probability *= (BigDecimal.new((trigram_count(sen_arr[i-2]+" "+sen_arr[i-1]+" "+sen_arr[i])+1).to_s()))/denom   
  elsif i == 1
  denom = (BigDecimal.new((bigram_count("PHI "+sen_arr[i-1])+@frequency_tables[5]).to_s()))
  probability *= (BigDecimal.new((trigram_count("PHI "+sen_arr[i-1]+" "+sen_arr[i])+1).to_s()))/denom  
  else
  probability *= (BigDecimal.new((trigram_count("PHI PHI "+sen_arr[i])+1).to_s())) / (BigDecimal.new((unigram_count("PHI")+@frequency_tables[5]).to_s()))   
  end
end
unless probability.eql? 0 
    val= ((Math.log(probability)/Math.log(2))) 
    retval = round(val) 
    return retval
end
return "undefined"
end
end`
4

2 に答える 2

0

私にとってはうまくいきます。おそらく構文エラーです。コードを追加して更新します。

ruby-1.8.7-p334 :001 > require 'bigdecimal'
 => true 

ruby-1.8.7-p334 :002 >  BigDecimal("1.0e+25") - BigDecimal("9999999999999999900000000.0")
 => #<BigDecimal:10035f970,'0.1E9',9(45)> 
于 2012-09-29T08:06:30.390 に答える
0

私が使用していたラボのマシンには、知らないうちに複数のバージョンのRubyがインストールされていたことがわかりました。IRBは他のバージョンの情報を使用していたので、Rubyコマンドだけで使用せずにbigdecimalを使用できたと思います。インストールされた他のバージョンのRubyを使用した後、正常に動作しました。

于 2012-10-09T00:50:57.737 に答える