今回の更新でKotz’ijは単語帳にある名詞を認識し、一度入力された名詞がもう一度入力された場合は、初めて入力された時のフレーズを用いる仕様にしてみた。
名詞かどうかの判定は、単語帳に品詞の情報を加えることにより実現。
単語帳に含まれている単語は今のところ全て名詞だけど動詞や前置詞等を保存することももちろん可能。
今回、大幅な追加・変更があったのはやはり辞書関連のコード。名詞を認識するためのメソッドを新たに作成。キチェ語は英語やスペイン語等と同様に単語と単語を空白で離すため、単語の認識自体は楽。
Dictionary.rb
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | require 'csv' # added 20170523 class Dictionary   def initialize     @random = []     open('dictionaries/list02.txt') do |f|       f.each do |line|         line.chomp!         next if line.empty?         @random.push(line)       end     end     @pattern = []                                      open('dictionaries/patterns02.txt') do |f|       f.each do |line|         pattern, phrases = line.chomp.split("\t") #split by tab         next if pattern.nil? or phrases.nil?         @pattern.push(PatternItem.new(pattern, phrases))       end     end 	@vocabularyList = CSV.read('./dictionaries/VocabularyList.csv')# added 20170523   end   def study(input)     return if @random.include?(input) 	@random.push(input)   end   def save     open('dictionaries/list02.txt', 'w') do |f| 	  f.puts(@random) 	end   end ################################################################   def analyze(input)     return if @pattern.include?(input)     @vocabularyList.each do |t1, t2| 	  if input.match(t1) && t2.match("noun") then 	    #@pattern.push(PatternItem.new(t1, input)) 		@pattern.push(PatternItem.new(t1, input)) 	  end     end   end   def savePatterns     open('dictionaries/patterns02.txt', 'w') do |f| 	  @pattern.each{|patternItem| f.puts(patternItem.makeLine)} 	end   end #################################################################   attr_reader :random, :pattern             end class PatternItem   SEPARATOR = /^((-?\d+)##)?(.*)$/         def initialize(pattern, phrases)           SEPARATOR =~ pattern     @modify, @pattern = $2.to_i, $3          @phrases = []                            phrases.split('|').each do |phrase|       SEPARATOR =~ phrase       @phrases.push({'need'=>$2.to_i, 'phrase'=>$3})     end   end   def match(str)                             return str.match(@pattern)   end   def choice(mood)                           choices = []     @phrases.each do |p|       choices.push(p['phrase']) if suitable?(p['need'], mood)     end     return (choices.empty?)? nil : randomSelect(choices)   end   def suitable?(need, mood)                  return true if need == 0     if need > 0       return mood > need     else       return mood < need     end   end ################################################################   def makeLine     pattern = @modify.to_s + "##" + @pattern 	phrases = @phrases.map{|p| p['need'].to_s + "##" + p['phrase']} 	return pattern + "\t" + phrases.join('|')   end ################################################################     attr_reader :modify, :pattern, :phrases end | 
少し会話らしくなってきた気がしないでもない。語彙やパターン数を増やしていけば更に良くなるかも。
 
							



























