🎉
[Go] ありそうで(あまり)なかったのでローマ字->ひらがな変換パッケージを作った
作成理由
- まったくないわけではないが、メンテされてなかったりするので不安
-
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
処理解説
-
Convert
とConvertStrict
を作った-
Convert
: 変換の成否問わずとりあえず処理は完走するが、失敗してたらisCompleted
がfalse
になる -
ConvertStrict
: 変換に失敗したら、空文字とエラーを返す
-
- 全部かなに仕切れてるか知りたかったので、正規表現ではなく辞書を作って、変換するたびに変換の成否判定を行うようにした
- 最初は正規表現でやろうとしたけど、それだとローマ字をかなに変換するだけになってしまう
- 例えば
github
をぎてゅb
に変換して、正常に変換が終了した気になられても困る
- 辞書と比較して、対象文字列から3文字 -> 2文字 -> 1文字の順に取得して変換できるまで各文字を変換できるまでループ
- 変換できなかったらその文字を無変換の状態で返すがその時点で変換ミスのフラグが立つ
-
Convert
:isCompleted
がfalse
になる -
ConvertStrict
: エラーになる
-
- 変換できなかったらその文字を無変換の状態で返すがその時点で変換ミスのフラグが立つ
- 同じ文字でかつ子音の場合、長音記号として扱う
残念なところ
機械的に処理している以上、おそらく無理。やるとしたら機械学習で自然言語処理させるとかそういう事になってくると思うので、今回はそこまでやりたくなかった
-
oh
をおー
もしくはおう
とできなかった- これを許容すると
hokkaidoh(ほっかいどう)
とかはできる反面、ohayoh(「おはよう」としたい)
がおうあよう
になってしまう
- これを許容すると
- 母音の場合分けができない
-
gakkou
とするとがっこう
に変換されるが、がっこう
のつもりでgakko
ってなっていた場合は、がっこ
になる
-
今後対応する予定
-
長音記号((対応しました)ā(あー)
やĀ(あー)
みたいなやつ)の対応そういえばやってなかった他のパッケージにもなかった気がするからマウント取れそうw
更新情報
- v0.0.3
- 長音記号対応
- v0.0.2
- Nが続いたときに想定してない変換がされたので修正
- 例. nennenkororinn
- 期待値:ねんねんころりん
- 実際: ねんえんころりん
- Nが続いたときに想定してない変換がされたので修正
Discussion