概要
自作 Android キーボード Sumire では、英語予測変換を 1 つの LOUDS Trie だけで実装していました。そのため github と入力しても GitHub のような途中に大文字を含む単語を候補に出せませんでした。
目指したこと
Mozc が採用する 読み用 Trie・単語用 Trie・Token 配列 の 3 層構造を応用し、アルファベット入力から CamelCase(途中大文字)単語も正確に提示できるようにすること。
WikiText
WikiPedia の文章をベースにした言語モデリング用コーパスを利用してユニグラム、品詞とスコアを付与したテキストファイルを作成しました。約217,000 の単語を取得することができました。そのうち CamelCase の英単語は約 3,400 でした。
手順 | 内容 |
---|---|
① コーパス取得 | HuggingFace から WikiText-103 をダウンロード |
② 1-gram 抽出 | spaCy(NER 有効)で約 217,000 語を取得 |
③ スコア計算 | 出現確率 P(word) から score = −log P を算出 |
④ 辞書生成 | 読み LOUDS(小文字)、単語 LOUDS(CamelCase)、Token 配列へ変換 |
⑤ 自動化 | GitHub Actions で TSV → LOUDS/Token を生成し Release に公開 |
input_word output_word pos_tag score
new New GPE 2920
time Time WORK_OF_ART 3319
game Game ORG 4113
LOUDS と Token 配列
Mozc のかな漢字変換に使用されているデータ構造は、読みと単語の Trie と Token の配列から構成されています。読みの Trie に小文字の文字列を、単語の Trie にはCamelCase の英単語を登録すれば良いと考えました。また単語の Trie にはCamelCase の英単語のみを登録して、小文字、大文字、一番目の文字が大文字の単語は Token のなかに同値表現を示すフラグのみを保持して圧縮するようにしました。
ファイル | サイズ | 備考 |
---|---|---|
1-grams_score_cost_pos_combined_with_ner.txt | 6.3 MB | 1-gram+スコア+品詞 |
読み LOUDS | 2.3 MB | 小文字のみ |
単語 LOUDS | 37 kB | CamelCase のみ |
Token 配列 | 1.4 MB | 大小・同値表現をフラグ化 |
まとめ
githu と入力すると GitHub と予測変換で表示することができて打ち間違えることがなくなった!
成果物
- https://github.com/KazumaProject/english_dictionary_builder
- https://github.com/KazumaProject/kotlin-louds-english