#!/usr/bin/env ruby # -*- coding: utf-8 -*- def levenshtein(string1, string2, memo={}) # レーベンシュタイン距離を計算するメソッド return memo[[string1, string2]] if memo[[string1, string2]] return string2.size if string1.empty? return string1.size if string2.empty? return levenshtein(string1[1..], string2[1..], memo) if string1[0] == string2[0] min = 1 + [ levenshtein(string1[1..], string2, memo), levenshtein(string1, string2[1..], memo), levenshtein(string1[1..], string2[1..], memo) ].min memo[[string1, string2]] = min min end source = File.readlines("shounaiben.txt") # 庄内弁の文章をファイルから読み込み、配列に保存 candidates = File.readlines("kyoutsuugo.txt") # 共通語の訳文をファイルから読み込み、配列に保存 i = 0 while i < source.length # 庄内弁の文章ごとに同じ処理を繰り返す dist_target = levenshtein(source[i].chomp, candidates[i].chomp) # 正解訳文への編集距離の計算 dist_min = dist_target # 最短編集距離の初期値(=正解訳文への編集距離) count_same_or_lower = 0 # 編集距離が正解への距離以下である文章の総数の初期値 best_cand = candidates[i].chomp # 最短編集距離の訳文の初期値(=正解訳文) for cand in candidates # それぞれの共通語の文章への編集距離を調べる dist = levenshtein(source[i].chomp, cand.chomp) if dist < dist_min dist_min = dist best_cand = cand end if dist <= dist_target count_same_or_lower += 1 end end printf("庄内弁の文章: %s\n", source[i].chomp) printf("共通語の訳文(正解): %s\n", candidates[i].chomp) printf("最短編集距離の訳文: %s\n", best_cand.chomp) printf("正解訳文への編集距離: %d\n", dist_target) printf("最短編集距離: %d\n", dist_min) printf("編集距離が正解訳文への距離以下である文章の総数: %d\n", count_same_or_lower) puts i += 1 end