Newer
Older
Ruby / shonaiben_translator.rb
@MURATA Yoshifumi MURATA Yoshifumi on 1 Feb 2 KB 2024-02-01 18:42:54
#!/usr/koeki/bin/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_dist = 1 + [levenshtein(string1[1..], string2, memo),
		  levenshtein(string1, string2[1..], memo),
		  levenshtein(string1[1..], string2[1..], memo)
		 ].min
  memo[[string1, string2]] = min_dist
  min_dist
end

source = File.readlines("shounaiben.txt")                             # 庄内弁の文章をファイルから読み込み、配列に保存
candidates = File.readlines("kyoutsuugo.txt")                         # 共通語の訳文をファイルから読み込み、配列に保存

i = 0
while i < source.length                                               # 庄内弁の文章ごとに同じ処理を繰り返す
  dist2target = levenshtein(source[i].chomp, candidates[i].chomp)     # 正解訳文への編集距離の計算
  min_dist = dist2target                                              # 最短編集距離の初期値(=正解訳文への編集距離)
  count_same_or_lower = 0                                             # 編集距離が正解への距離以下である文章の総数の初期値
  best_cand = candidates[i].chomp                                     # 最短編集距離の訳文の初期値(=正解訳文)
  for cand in candidates                                              # それぞれの共通語の文章への編集距離を調べる
    dist = levenshtein(source[i].chomp, cand.chomp)
    if dist < min_dist
      min_dist = dist
      best_cand = cand
    end
    if dist <= dist2target
      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", dist2target)
  printf("最短編集距離: %d\n", min_dist)
  printf("編集距離が正解訳文への距離以下である文章の総数: %d\n", count_same_or_lower)
  puts
 
  i += 1
end