はじめに
english -> イングリッシュ、みたいに英語テキストをカタカナに変換する方法を調べました。
未知語にも強い機械学習ベースの実装として、e2kとenglish2kanaという2つのライブラリを試してみます。
環境
- macOS 14.7
- Python 3.12
- uv
e2k
概要
Wictionaryなどの辞書で学習されたRNNベースのモデルを使用しています。
- インストール: pip install e2k
- ライセンス: Public Domain
- モデル: RNN
- 学習データ: Wiktionary, JMdict, EDICT
- 機能: 文字変換(c2k)以外に音素変換(p2k)、アクセント推定、N-gram推定による未知語処理などが可能
- 精度: BLEUスコアがC2Kで0.92、P2Kで0.89
- 速度: 比較的高速
- URL: https://github.com/Patchethium/e2k
使い方
英単語の読み方は、通常のスペル読み(english -> イングリッシュ)と、アルファベットを1文字ずつ読む綴り読み(MVP -> エムブイピー)の2種類があります。
メインの文字変換クラスC2Kは基本スペル読みをします。そこで、e2kではNGramというクラスによって、どちらの読み方をすべきか判定することができ、これを用いることが推奨されています。
uv add e2k
from e2k import C2K
from e2k import NGram
ngram = NGram()
# characters directly to katakana
c2k = C2K()
def convert(english: str) -> str:
if ngram(english):
return c2k(english)
else:
return ngram.as_is(english.lower()) # 小文字で入力必要
print(convert("english")) # イングリッシュ
print(convert("MVP")) #エムヴィーピー
english2kana
概要
法人名データで学習されたSequence-to-Sequenceモデルを使用しています。
- インストール: pip install english2kana
- ライセンス: MIT
- モデル: Sequence-to-sequence
- 学習データ: 法人名データ(日本の法人番号サイト由来)
- 機能: 文字変換
- 精度: Test Loss: 0.1440、Test Accuracy: 0.9552
- URL: https://github.com/m7142yosuke/english2kana
使い方
english2kana.translateにより変換が可能です。こちらのライブラリではスペル読みか綴り読みかも含めて内部的に判断してくれるようです。
uv add english2kana
from english2kana import english2kana
# Initialize the translator
e2k = english2kana()
# Load the pretrained model
e2k.load_model()
def convert(english: str) -> str:
return e2k.translate(english)
print(convert("english")) # エングリッシュ
print(convert("MVP")) #エムブイピー
比較
方法
両ライブラリを共通の評価データで、精度と速度について比較してみます。
評価データとして、英語とカタカナのペアが多数収録されているbep-eng.dicを用いました。このデータは両ライブラリにおいて学習データに用いられていません。
bep-eng.dicからランダムに100件のデータを取得し、これを正解、出力との完全一致精度、編集距離、カナ類似度を評価します。完全一致精度は正解と出力が完全一致した件数の割合です。本当は完全一致精度だけで評価できると良かったのですが、カナ変換においては例えば「ティ」と「チ」など、どちらが正解とも言いにくいものがあるため、もう少しゆるい指標もあったほうが良いと思われました。そこで、正解と出力の文字ベースの編集距離や母音・子音の類似も考慮した編集距離(カナ類似度)も合わせて観察することにしました。
評価スクリプトは以下に置きました。
結果
Accuracyは高いほど、Average Edit DistanceとAverage Kana Distanceは低いほど優れた指標となります。
| e2k | english2kana | |
|---|---|---|
| 完全一致精度 | 36% | 25% |
| 編集距離 | 0.236 | 0.371 |
| カナ類似度 | 0.1575 | 2.356 |
| 変換速度/1件 | 40 ms | 434 ms |
考察
精度、速度ともにe2kベースのほうが優れている結果となりました。
速度については、e2kの実行時間が約1/10と短く、実行時間に含まれない、モデルロード時間も含めると、e2kに軍配がありそうです。
精度については定量的にはe2kのほうが優れているという結果でしたでしたが、間違い事例を目視してみると、意外と差がないというか、むしろ、english2kanaのほうが感覚に合うのでは、と思う結果もありました。
共通で間違えられた評価アイテムのうちいくつかを記載します。
| 正解 | 1.e 2k | 2. english2kana | 評価者メモ | |
|---|---|---|---|---|
| ANTIBODY | アンティボディー | アンチボディー | アンティボディ | どちらもほぼ正解だが2のほうがより正解に近い |
| INDURATED | インデュレイティドゥ | インドレーテッド | インデュラテッド | どちらもほぼ正解 |
| BOARDED | ボーディドゥ | ボード | ボーデッド | 1の間違え方が激しい。2はほぼ正解 |
| TUCSON | ツーソン | タックスン | ティーユーシーオーエヌオー | 2は誤って綴り読み |
間違え方的にはenglish2kanaのほうが許容しやすいものも多く、実行時間がシビアでない用途であれば、出力傾向の好みを見ながら使い分けるのもありだと思いました。
ちなみに、TUCSONのように、english2kanaではスペル読みすべきものを綴り読みする事例が見られたため、念の為、english2kanaの評価でもe2kのNGramによる判定処理を入れたバージョンでも評価してみました。以下のような結果となりました。数値に表れている通り、数値的な精度向上は特に見られませんでした。
Accuracy: 25.00%
Average Edit Distance: 0.388
Average Kana Distance: 2.459
Time: 0.428 seconds / per item
関連実装
英語-カナ変換は従来だと辞書ベースのものが主流でした。
- CMU辞書でARPABETに変換し、その後ルールベースでIPA -> カナに変換
- bep-eng.dicにより英語をカナに変換
辞書ベース(特にbep-eng.dic)は一般的な単語については感覚にマッチするカナが得られてよいのですが、未知語の対応がネックになります。またbep-eng.dicはGPL v2ライセンスのため、ユースケースによっては採用が難しいこともあります。
比較すると、今回紹介したe2kとenglish2kanaはライセンス的にはOSSで使いやすく、未知語に対してもある程度、感覚にあう推定結果が得られる利点があります。
おわりに
機械学習ベースの英語-カナ変換ライブラリを試してみました。
過去に調べたときは辞書ベースの方法しか見つからなかったのですが、この1年くらいで、機械学習ベースの実装が複数公開されたようです。
e2kとenglish2kanaを比較してみたところ、数値上はe2kのほうが優れていましたが、今回の評価方法がどの程度妥当かは議論の余地があります。実際に結果を眺めると、english2kanaのほうが良いと思える出力も多く、好みやユースケースに応じて使い分けるのが良いかなと思いました。