質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

1回答

12415閲覧

[ruby]Floatエラー

kamatmt

総合スコア25

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

1グッド

1クリップ

投稿2016/01/24 04:59

編集2022/01/12 10:55

`*': nil can't be coerced into Float (TypeError)
このエラーが出るときはどんなことが考えられますか?

計算の途中経過として

0.045,
0.045,
0.111,
...

5.575,
3.01,
3.625,
...

このような結果からさらに①とⅠを掛け算したいところで
`*': nil can't be coerced into Float (TypeError)
こちらのエラーがでてきます。
①、Ⅰいずれもround()によって少数点まで含まれると思います。
また、①、Ⅰ内の値の数も同じになっています。

考えられることとしてどういったことがありますか?

追加.........................................................
元のプログラムです。
長く汚いプログラムで申し訳ないです。
116:in `*': nil can't be coerced into Float (TypeError)
このようなエラーがでています。
最終的には類以度を出したいです。
手詰まり状態で困っています。

ruby

1#encoding: utf-8 2 3require "MeCab" 4require "kconv" 5require "nkf" 6 7########### 8 9def hinsi(sentence) 10 11 mecab = MeCab::Tagger.new 12 node = mecab.parseToNode(sentence) 13 word = [] 14 begin 15 node = node.next 16 data="#{node.surface.toutf8},#{node.feature.toutf8}" 17 if data.split(",")[1].toutf8 == "名詞" then 18 if data.split(",")[2].toutf8 =~ /一般|固有名詞/ then 19 word.push("#{node.surface.toutf8}") 20 21 end 22 end 23 end until node.next.feature.include?("BOS/EOS") 24 25return word 26end 27 28################### 29#出現回数 30def cou(ta) 31hash = Hash.new 32q =0 33ta.each{|line| 34 array = line.split("\t") 35 tarm = array[0] 36 q += 1 37 if hash.include?(tarm) then 38 hash[tarm] += 1 39 else 40 hash[tarm] = 1 41 end 42# print array[0], "\n" 43} 44 45a = hash.values 46b = hash.keys 47 return a,q.round(3),b 48 49end 50 51##################### 52 53# tf 54def tf_(situgen,meitan) 55c = situgen.length #単語の種類の数 56tf = [] 57for n in 0..c-1 do 58 tf[n] = situgen[n] / meitan 59 tf[n] = tf[n].round(3) 60end 61 62return tf 63end 64 65################## 66 67#df 68def df_(w,at) 69hash = Hash.new 70q =0 71 72for n in w do 73 for m in at do 74 pos=m.include?(n) 75 if pos == true then 76 array = n.split("\t") 77 tarm = array[0] 78 q += 1 79 if hash.include?(tarm) then 80 hash[tarm] += 1 81 else 82 hash[tarm] = 1 83 end 84 end 85 end 86end 87a = hash.keys 88b = hash.values 89 90return a,b 91end 92 93#################### 94#idf 95def idf_(df_t,alt) 96c=df_t.length 97d=[] 98idf=[] 99for i in 0..c-1 do 100 d[i]=df_t[i].round(2) 101 idf[i] = Math.log(alt.length/d[i])+1 102 idf[i]= idf[i].round(3) 103end 104 105return idf 106end 107 108################### 109 110#tf-idf 111def tfidf_(tf_t,idf_t) 112t = tf_t.length 113 114tfidf=[] 115for i in 0..t-1 do 116 tfidf[i]=tf_t[i] * idf_t[i] 117 tfidf[i]=tfidf[i].round(3) 118end 119 120return tfidf 121end 122 123############################ 124 125#単語ごとのベクトル 126def coscount(b1,b2,co1,co2) 127al=[] 128al += b1 129al += b2 130 131a = al.uniq #種類の数 132x = b1.length 133y = b2.length 134z = a.length 135 136array1 =[] 137for i in 0..z-1 do 138 array1[i] = 0 139end 140 141array2 =[] 142for i in 0..z-1 do #s:種類の数 143 array2[i] = 0 144end 145 146for n in 0..z-1 do 147 for m in 0..x-1 do 148 if a[n] == b1[m] then 149 array1[n]=co1[m] 150 end 151 end 152 for l in 0..y-1 do 153 if a[n] == b2[l] then 154 array2[n]=co2[l] 155 end 156 end 157 158end 159 160return a,array1,array2 161end 162 163 164#################################### 165 166 #類似度 167 def cosine_similarity(vector1,vector2) 168 dp = dot_product(vector1, vector2) 169 nm = normalize(vector1) * normalize(vector2) 170 dp / nm 171 end 172 173 def dot_product(vector1, vector2) 174 sum = 0.0 175 vector1.each_with_index{ |val, i| sum += val*vector2[i] } 176 sum 177 end 178 179 def normalize(vector) 180 Math.sqrt(vector.inject(0.0){ |m,o| m += o**2 }) 181 end 182 183 184 185##################### 186 187def main(t1,t2,k1,k2) 188#形態素解析a 189 190w1=[] 191for j in 1..k1-1 do 192 if t1[j] != nil then 193 w1[j]=hinsi(t1[j]) 194 end 195end 196 197#形態素解析b 198w2=[] 199for j in 1..k2-1 do 200 if t2[j] != nil then 201 w2[j]=hinsi(t2[j]) 202 end 203end 204 205#################### 206 207#出現回数a 208c1 =[] 209ac1= [] 210bc1=[] 211for j in 0..k1-1 do 212 if w1[j] != nil then 213 c1[j],ac1[j],bc1[j] = cou(w1[j]) 214 end 215end 216 217#出現回数b 218c2 =[] 219ac2= [] 220bc2=[] 221for j in 0..k2-1 do 222 if w2[j] != nil then 223 c2[j],ac2[j],bc2[j] = cou(w2[j]) 224 end 225end 226 227######################## 228 229#tf a 230tf1=[] 231for j in 0..k1-1 do 232 if c1[j] != nil then 233 tf1[j] = tf_(c1[j],ac1[j]) 234 end 235end 236 237 238#tf b 239tf2=[] 240for j in 0..k2-1 do 241 if c2[j] != nil then 242 tf2[j] = tf_(c2[j],ac2[j]) 243 end 244end 245 246############################### 247 248#df a 249key1=[] 250df1 =[] 251 252for j in 0..k1-1 do 253 if w1[j] != nil then 254 key1[j],df1[j] = df_(w1[j],t1) #key1:単語 df1:ある単語がでる文書の数 255 end 256end 257 258 259#df b 260key2=[] 261df2 =[] 262for j in 0..k2-1 do 263 if w2[j] != nil then 264 key2[j],df2[j] = df_(w2[j],t2) 265 end 266end 267 268################################# 269 270#idf a 271idf1=[] 272for j in 0..k1-1 do 273 if df1[j] != nil then 274 idf1[j] = idf_(df1[j],t1) 275 end 276end 277 278#idf b 279idf2=[] 280for j in 0..k2-1 do 281 if df2[j] != nil then 282 idf2[j] = idf_(df2[j],t2) 283 end 284end 285 286 287########################## 288#tfidf a 289tfidf1=[] 290for j in 0..k1-1 do 291 if tf1[j] != nil && idf1[j] != nil then 292 tfidf1[j] = tfidf_(tf1[j],idf1[j]) 293 end 294end 295 296tfidf2=[] 297for j in 0..k2-1 do 298 if tf1[j] != nil && idf1[j] != nil then 299 tfidf2[j] = tfidf_(tf2[j],idf2[j]) 300 end 301end 302 303#puts tfidf1 304#puts tfidf2,key2 305####################### 306#カウント 307 308l=0 309cosrui=[] 310a=[] 311ara1=[] 312ara2=[] 313 314for j in 0..k1-1 do 315 for i in 0..k2-1 do 316 a[l],ara1[l],ara2[l] =coscount(bc1[j],bc2[i],tfidf1[j],tfidf2[i]) 317 l+=1 318 end 319end 320 321#類似度 322for j in 0..l-1 do 323 cosrui[j] = cosine_similarity(ara1[j],ara2[j]) 324 #h.puts "類似度",cosrui[j] 325end 326 327 328##################### 329 330 331z = 0 332cos=[] 333if cosrui[0]>=cosrui[1] then 334 cos=cosrui[0] 335 z = 0 336else 337 cos=cosrui[1] 338 z = 0 339end 340 341for n in 2..j-1 do 342 if cos <= cosrui[n] then 343 cos=cosrui[n] 344 z = n 345 end 346end 347 348 349return cos 350 351end 352 353########################################## 354 355#ファイル入力 356def read_data_file(filename) 357 sentence=[] 358 f=File.open("#{filename}","r:UTF-8") 359 f.each{|data| 360 sentence.push(data) 361 } 362k= sentence.length 363t=[] 364for j in 0..k-1 do 365 t[j]=NKF.nkf("-Xw",sentence[j]) 366end 367t.uniq! 368return t,k 369end 370 371 372#ファイル数 373puts "ファイルb" 374fb=gets.to_i # 375 376puts "ファイルa" 377fa=gets.to_i # 378 379 380si=[] 381 382for n in 1..fb do 383 si[n]="/usr/home/ru/tweet_html/si#{n}.txt" 384end 385 386 387chan=[] 388for n in 1..fa do 389 chan[n]="/usr/home/ru/tweet_html/r#{n}.txt" 390end 391 392 393############## 394 395a=[] 396b=[] 397i=1 398data=[] 399cosr=[] 400for n in 1..fb do 401 for m in 1..fa do 402 if si[n] != nil && chan[m] != nil then 403 d1,ke1 = read_data_file(si[n]) 404 d2,ke2 = read_data_file(chan[m]) 405 406 cosr[i]=main(d1,d2,ke1,ke2) 407 a[i]=n 408 b[i]=m 409 i+=1 410 end 411 end 412end 413 414 h=File.open("w.txt","w:UTF-8") 415 416 417for n in 1..i-1 do 418 h.puts "類似度",cosr[n] 419 h.puts a[n],b[n],"\n" 420end 421 422
DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Floatと演算しようとした相手が、数値で無くnilになっているというエラーです。
原因は、プログラムを見ないと何とも。

投稿2016/01/24 05:13

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kamatmt

2016/01/24 08:18

少し長めで汚いプログラムだとは思いますが、編集しますのでみてもらってもいいですか?
otn

2019/06/09 13:22

116行目付近しか見てませんが、 idf_t[i] がnilなので、 def tfidf_(tf_t,idf_t) puts "tfidf_: #{tf_t.length},#{idf_t.length}" とか入れて調べては?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問