2012-09-29 54 views
0

我有一个非常令人沮丧的问题。我使用ruby 1.8.7在家用机器上安装了Ubuntu 12.04,而且我几乎没有完成一个项目,它可以在我的家用机器上完美编译和运行,但是当我将它移植到我的大学实验室时(它必须为我编译以获得一个等级他们还运行红宝石1.8.7)我得到以下错误:需要bigdecimal loaderror ruby​​

`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])[email protected]_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")[email protected]_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])[email protected]_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])[email protected]_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")[email protected]_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` 
+0

你的'require'语句在哪里? –

回答

0

原来我使用的实验室机器上安装了多个版本的Ruby,但我不知道。我认为IRB正在使用来自其他版本的信息,因此我可以使用bigdecimal而不使用Ruby命令。使用安装的其他版本的Ruby后,它工作正常。

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)> 
+0

当我进入irb时,我可以做'bigdecimal'以及我变得真实,然后我也可以操作这个类。 WTF?我会在一些代码中编辑我的原始文章。 – noname

+0

如果将模型直接复制/粘贴到“irb”中,会发生什么情况?它识别它还是错误? –

相关问题