今、過去のツイートから川柳を作成するアプリを作っています。
アプリの仕組みは大方仕上がったのですが、肝心のツイートを文章化して分析する部分がうまくいきません。エラーが出てうまくいきません。
分析するテキストを引数として直接渡す場合はうまくいくのですが、取得したツイートを.join
とし文章化して引数として渡すとうまくいきません。
このエラーの原因や動作の差異がわかる方いらしましたら教えていただきたいです
error
1no implicit conversion of nil into String
senryu.rb
1 noun = node.surface 2 index = @sent.index(noun) 3error=> read_word = "#{@kana[index]}" + @kana[index + 1] 4 # 文字数を数える 5 if read_word.gsub(/ァ|ィ|ゥ|ェ|ォ|ヵ|ヶ|ャ|ョ/, '').length == 7 6 middle = @sent[index] + @sent[index + 1] 7
ツイートを取得します
tweet.rb
1require 'twitter' 2class Tweet 3 attr_accessor :uid 4 include ActiveModel::Model 5 def initialize(uid) 6 @uid = uid 7 end 8 9 def get_tweet 10 tweets = [] 11 client = client_new 12 @timeline = client.user_timeline(uid) 13 @timeline.each do |tweet| 14 tweets.push(tweet.text) 15 end 16 return tweets 17 end 18 19 private 20 def client_new 21 Twitter::REST::Client.new do |config| 22 config.consumer_key = ENV['APP_ID'] 23 config.consumer_secret = ENV['APP_SECRET'] 24 config.access_token = ENV['ACCESS_TOKEN'] 25 config.access_token_secret = ENV['ACCESS_SECRET'] 26 end 27 end 28end
テキストを575の川柳の形に変えて戻す記述です
senryu.rb
1 require 'active_model' 2 require 'mecab' 3 require 'twitter' 4 class Senryu 5 attr_accessor :text 6 include ActiveModel::Model 7 8 def initialize(text) 9 @text = text 10 end 11 12 def parse 13 -- テキストを分析する基本形 14 @sent = [] 15 mecab = MeCab::Tagger.new("-Ochasen") 16 node = mecab.parseToNode(text) 17 while node 18 @sent.push(node.surface) 19 node = node.next 20 end 21 22 -- @snetのカタカナver. 23 @kana = [] 24 mecab = MeCab::Tagger.new("-Ochasen") 25 node = mecab.parseToNode(text) 26 while node 27 @kana.push(node.feature.split(",")[7]) 28 node = node.next 29 end 30 31 -- 指定した品詞で始まる単語を取り出し、隣の言葉と結合させる 32 -- 川柳に使う候補となる言葉たち 33 @first = [] 34 mecab = MeCab::Tagger.new("-Ochasen") 35 node = mecab.parseToNode(text) 36 37 while node 38 if /^名詞|^動詞|^形容詞|^形容動詞|^副詞|^連体詞 39 |^接続詞|^感動詞|^接頭詞|$接頭詞/ =~ node.feature.split(/,/)[0] 40 noun = node.surface 41 index = @sent.index(noun) 42 read_word = @kana[index].to_s + @kana[index + 1].to_s 43 -- 文字数を数える 44 if read_word.gsub(/ァ|ィ|ゥ|ェ|ォ|ヵ|ヶ|ャ|ョ/, '').length == 5 45 first = @sent[index] + @sent[index + 1] 46 @first.push(first) 47 end 48 end 49 node = node.next 50 end 51 @first_word = @first.sample 52 -- 指定した品詞で始まる単語を取り出し、隣の言葉と結合させる 53 -- 川柳に使う候補となる言葉たち 54 @middle = [] 55 mecab = MeCab::Tagger.new("-Ochasen") 56 node = mecab.parseToNode(text) 57 58 while node 59 if /^名詞|^動詞|^形容詞|^形容動詞|^副詞|^連体詞 60 |^接続詞|^感動詞|^接頭詞|$接頭詞/ =~ node.feature.split(/,/)[0] 61 noun = node.surface 62 index = @sent.index(noun) 63 read_word = "#{@kana[index]}" + @kana[index + 1] 64 -- 文字数を数える 65 if read_word.gsub(/ァ|ィ|ゥ|ェ|ォ|ヵ|ヶ|ャ|ョ/, '').length == 7 66 middle = @sent[index] + @sent[index + 1] 67 @middle.push(middle) 68 end 69 end 70 node = node.next 71 end 72 @middle_word = @middle.sample 73 74 @last = [] 75 mecab = MeCab::Tagger.new("-Ochasen") 76 node = mecab.parseToNode(text) 77 78 while node 79 if /^名詞|^動詞|^形容詞|^形容動詞|^副詞|^連体詞 80 |^接続詞|^感動詞|^接頭詞|^接頭詞/ =~ node.feature.split(/,/)[0] 81 noun = node.surface 82 index = @sent.index(noun) 83 read_word = "#{@kana[index]}" + @kana[index + 1] 84 -- 文字数を数える 85 if read_word.gsub(/ァ|ィ|ゥ|ェ|ォ|ヵ|ヶ|ャ|ョ/, '').length == 5 86 @sent[index + 1] 87 last = @sent[index] + @sent[index + 1] 88 @last.push(last) 89 end 90 end 91 node = node.next 92 end 93 @last_word = @last.sample 94 95 senryu = @first_word + @middle_word + @last_word 96 return senryu 97 end 98 end
controllerでの呼び出し?の記述です
class TweetsController < ApplicationController def get uid = User.where(current_user.uid) @tweet = Tweet.new(uid) @tweets = @tweet.get_tweet.join @senryu = Senryu.new(@tweets) @output = @senryu.parse end end
なにかわかる方いらしましたら教えていただきたいです。
ちなみにエラーの個所の記述を
read_word = @kana[index] + @kana[index + 1]
とするとエラーが
undefined method `+' for nil:NilClass
に代わりました。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。