# shonaiben_translator.rb

[[ RAW TEXT(DOWNLOAD here) ]]

    #!/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