🎉

[Go] ありそうで(あまり)なかったのでローマ字->ひらがな変換パッケージを作った

2022/08/16に公開

https://github.com/usk81/r2h

作成理由

  • まったくないわけではないが、メンテされてなかったりするので不安
    • gojp/kanaとかメンテされてるものもあることはあるけど、ほしいのとちょっと違った
  • 既存のものは、ローマ字と思われるものを仮名に変換するだけ
    • 大抵の場合は、正規表現等でローマ字と思われるアルファベットの組み合わせを仮名に変換するだけ
    • これだと正しく変換できてるか知りたいときに変換してから仮名以外が含まれてないか判定する必要がある

使用例

package main

import (
	"github.com/usk81/r2h"
)

func main() {
    // romaji
    result, isCompleted := r2h.Convert("konnichiha")
    // result: こんにちは
    // isCompleted: true

    // non-romaji
    result, isCompleted = r2h.Convert("github")
    // result: ぎてゅb
    // isCompleted: false

    // strict: romaji
    result, err := r2h.ConvertStrict("konnichiha")
    // result: こんにちは
    // err: nil

    // strict: non-romaji
    result, err = r2h.ConvertStrict("github")
    // result: (empty)
    // err: b is not romaji
}

インストール

go get github.com/usk81/r2h

処理解説

  • ConvertConvertStrictを作った
    • Convert: 変換の成否問わずとりあえず処理は完走するが、失敗してたらisCompletedfalseになる
    • ConvertStrict: 変換に失敗したら、空文字とエラーを返す
  • 全部かなに仕切れてるか知りたかったので、正規表現ではなく辞書を作って、変換するたびに変換の成否判定を行うようにした
    • 最初は正規表現でやろうとしたけど、それだとローマ字をかなに変換するだけになってしまう
    • 例えばgithubぎてゅbに変換して、正常に変換が終了した気になられても困る
  • 辞書と比較して、対象文字列から3文字 -> 2文字 -> 1文字の順に取得して変換できるまで各文字を変換できるまでループ
    • 変換できなかったらその文字を無変換の状態で返すがその時点で変換ミスのフラグが立つ
      • Convert: isCompletedfalseになる
      • ConvertStrict: エラーになる
  • 同じ文字でかつ子音の場合、長音記号として扱う

残念なところ

機械的に処理している以上、おそらく無理。やるとしたら機械学習で自然言語処理させるとかそういう事になってくると思うので、今回はそこまでやりたくなかった

  • ohおーもしくはおうとできなかった
    • これを許容するとhokkaidoh(ほっかいどう)とかはできる反面、ohayoh(「おはよう」としたい)おうあようになってしまう
  • 母音の場合分けができない
    • gakkouとするとがっこうに変換されるが、がっこうのつもりでgakkoってなっていた場合は、がっこになる

今後対応する予定

  • 長音記号(ā(あー)Ā(あー)みたいなやつ)の対応対応しました
    • そういえばやってなかった
    • 他のパッケージにもなかった気がするからマウント取れそうw

更新情報

  • v0.0.3
    • 長音記号対応
  • v0.0.2
    • Nが続いたときに想定してない変換がされたので修正
      • 例. nennenkororinn
      • 期待値:ねんねんころりん
      • 実際: ねんえんころりん

Discussion