Ruby:Chatterbot无法加载机器人数据

时间:2015-03-03 09:20:21

标签: ruby yaml

我正在学习ruby语言并且在玩我开发的chatterbot时遇到困难。我在Click here 已经提出了类似的问题,我做了他们建议改变救援的内容,以便查看完整的信息。但这似乎不对,我在basic_client.rb正在运行rubybot目录和fred.bot也在该目录中生成。请参阅下面的错误消息:非常感谢您的帮助。

Snailwalkers-MacBook-Pro:~ snailwalker$ cd rubybot
Snailwalkers-MacBook-Pro:rubybot snailwalker$ ruby  basic_client.rb
/Users/snailwalker/rubybot/bot.rb:12:in `rescue in initialize': Can't load bot data because: No such file or directory - bot_data (RuntimeError)
    from /Users/snailwalker/rubybot/bot.rb:9:in `initialize'
    from basic_client.rb:3:in `new'
    from basic_client.rb:3:in `<main>'

basic_client.rb

require_relative 'bot.rb'

bot = Bot.new(:name => 'Fred', :data_file => 'fred.bot')

puts bot.greeting

while input = gets and input.chomp != 'end'
    puts '>> ' + bot.response_to(input)
end

puts bot.farewell

bot.rb:

require 'yaml'
require './wordplay'

class Bot
  attr_reader :name

  def initialize(options)
    @name = options[:name] || "Unnamed Bot"
    begin
      @data = YAML.load(File.read('bot_data'))
    rescue => e
      raise "Can't load bot data because: #{e}"
    end
  end

  def greeting
    random_response :greeting
  end

  def farewell
    random_response :farewell
  end

  def response_to(input)
    prepared_input = preprocess(input).downcase
    sentence = best_sentence(prepared_input)
    reversed_sentence = WordPlay.switch_pronouns(sentence)
    responses = possible_responses(sentence)
    responses[rand(responses.length)]
  end

  private

  def possible_responses(sentence)
    responses = []

    @data[:responses].keys.each do |pattern|
      next unless pattern.is_a?(String)

      if sentence.match('\b' + pattern.gsub(/\*/, '') + '\b')
        if pattern.include?('*')
          responses << @data[:responses][pattern].collect do |phrase|
            matching_section = sentence.sub(/^.*#{pattern}\s+/, '')
            phrase.sub('*', WordPlay.switch_pronouns(matching_section))
          end
        else
          responses << @data[:responses][pattern]
        end
      end
    end

    responses << @data[:responses][:default] if responses.empty?
    responses.flatten

  end

  def preprocess(input)
    perform_substitutions input
  end

  def perform_substitutions(input)
    @data[:presubs].each {|s| input.gsub!(s[0], s[1])}
    input
  end

  # select best_sentence by looking at longest sentence
  def best_sentence(input)
    hot_words = @data[:responses].keys.select do |k|
      k.class == String && k =~ /^\w+$/
    end

    WordPlay.best_sentence(input.sentences, hot_words)
  end

  def random_response(key)
    random_index = rand(@data[:responses][key].length)
    @data[:responses][key][random_index].gsub(/\[name\]/, @name)
  end
end

1 个答案:

答案 0 :(得分:1)

我假设您正在尝试加载传递给:data_file的{​​{1}},但现在您每次都静态加载Bot.new文件。您从未在问题中提及bot_data。所以,如果我是对的,它应该是这样的:

bot_data

而不是:

 @data = YAML.load(File.read(options[:data_file]))