今回の更新で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 |
少し会話らしくなってきた気がしないでもない。語彙やパターン数を増やしていけば更に良くなるかも。