メインコンテンツまでスキップ

俺の日本語入力が火を噴くぜ

職業柄これまで日本語を書く機会があまりなく, 大半の時間をコードを書くことに費してきました.
ところが最近はAIにコードを書いてもらう機会が増えたことにより, 日本語を書く機会が増えました.

AIにコードを書いてもらう場合, 人間は指示をするのが主な仕事になるので, コードを書く時間は短く, 自然言語を書く時間は長くなります.
自然言語と長時間向き合った結果, 標準的な日本語入力環境への不満が高まり, 結果として過剰に改善された状態を実現できたので, ここにまとめます.

言語について

ちょっと前までは, AIへの指示は英語で書かないと精度が低くて問題がありました.
ただここ最近は, 日本語で指示しても問題を感じません.
翻訳・曖昧表現の解釈能力自体が自分より上という体感です.

英語というスキルについて

身の回りでTOEICが流行った際に900ぐらいまでスコアを上げたのですが, 一瞬でAIに抜かれた感があります.
こんなに早く 多少英語が出来る というスキルが陳腐化するとは予測してなかったです.
スプラトゥーンをプレイした時間 > 英語学習に費やした時間 なので時間の無駄とかあんまり言えない気もしますが, この未来が見えてたら英語学習はせずに違うことをしてたような気もします.

採用IME(日本語入力ソフト)の変遷​

より良い日本語入力環境を求めて以下の変遷を辿り, 現在に至ります.

macOS標準の日本語IM​

まずライブ変換が受け入れられませんでした. 打ちながら考えていることとは別の変換候補が次々と出てくるので, 考えていることが揮発してしまう感じがありました.
ライブ変換を使いこなしている人もいるのは認識しているので, これは自身のADHD的性質も多分に影響しているのかなとは思っています.

ライブ変換を無効化したら問題無くなるかと思いきや, 珍しい読みを強気にタイポ判定してくる変換にやられてしまい, ダメでした.

今後人間がやることについて

LLM技術の進歩により, 今後人間が知的産業に於いて担っていくことと, 委譲していくことの見極めが難しいなと日々思っています. 感覚値ですが, 思考の純度についてはまだ訓練された人間の仕事だなと思っているので, 細かいところでもノイズを減らしていくのは大切だなと考えています.

Google日本語入力​

変換精度に関しては, macOS標準の日本語IMと比較してかなりの向上を感じました.
カスタマイズ性も高く, 結構長いこと気に入って使っていたのですが, Markdownを書く際に半角全角を切り替える回数が多過ぎる という課題感が募ってきました.

Markdownを書く際, 見出しや書式の設定をする際は半角記号で入力しなければならないのですが, IMEを有効にしているとまず半角記号がスムーズに出てきません.
設定でデフォルトの記号を半角にすることは出来るのですが, それでも変換待ちの網掛け状態で入力されてしまうので, 英語でドキュメント書く時のダイレクト感からは程遠い体験になってしまいます.

macSKK ← いまここ​

この時点で, 自分がIMEに求める要件が定まってきました.

  • 変換結果が予測可能であること.
  • 記号類をストレスなく入力できること.

そんなものがあるのかという気もしますが, あります. SKKです.
以降基本的にはSKK道を進んでいく話しになります.

SKK = Simple Kana to Kanji conversion program​

詳しくはWikipediaの記事などをどうぞ.
SKKにはざっくり以下の特徴があります.

  • 基本動作は無変換. 打ったものがそのまま出力される. 変換は明示的に指定する必要がある.
    • 例えば通常のIMEで okuri と打った場合, おくり という読みでの変換が自動で始まる
    • SKKの場合は okuri と打った場合, 単に おくり  という文字が直接入力される
      • 変換したかったら先頭を大文字で始める. つまり Okuri と打つ必要がある.
      • なおかつ送り仮名も同様に自分で指定する必要がある. つまり最終的には OkuRi と打つことで, 初めて変換が出来る.
  • モーダルなIMEである
    • カタカナを打つためのモードなど, 通常のIMEでは変換を介して行うものが, モードを切り替えて行うことになる.
  • 非常に簡単に辞書登録ができる. 辞書は自分で育てるもの.
激推しのabbrevモード

個人的にはモードの一つである, abbrevモードが一番手放せない機能だと思っています.
abbrevモードを使うと例えば, mode → モード, import → インポート や version → バージョン といった, 英単語からカタカナへの変換が可能になります.
(自分は子音が p とか b の前の ン が特に苦手で, 頻繁に m で誤爆してしまう. コードでよく打つ英単語をカタカナ入力するのがかなり負荷高い.)

より良い入力環境を目指して​

SKK自体にまずは慣れようと思ったので, macSKKを導入してからしばらくは通常の使い方を続けました.
使っている内にいくつかのエッジケースを踏んだりして, ちょこちょこPull Requestを投げたりもしました.

大分慣れたところで, もう一段階上を目指せるなと思い, さらに以下の改善を行いました.

連文節変換​

通常のIMEは連文節変換というものを行います.
これは何かというと, たとえばこういうながいぶんしょうをへんかんするさい に たとえば こういう ながい ぶんしょう を へんかん する さい のように, 自動的に分かち書きを行った上で変換することです.

対してSKKはそのシンプルさ故に, 連文節変換を行わないので, 文節から送り仮名に至るまで, 全てユーザーが指定しなければいけません.
そのシンプルな挙動が変換の予測可能性を上げており, 長所でもあるのですが時々煩わしいこともあります.

長い文章の連文節変換であっても, 変換結果が予測可能であることはままあるなと感じており, 選択的に連文節変換を行えたら便利だろうなと思いました.
幸いSKKには skkserv という仕組みがあり, 変換を別サーバーに委譲することができます.
そこに着目し, 連文節変換を行うサーバーを実装しようと思い立ちました.

お察しかもしれませんが

当初は手段であった日本語入力環境の改善が, 既に目的化しています.

azoo-key-skkserv = skkserv ❤️AzooKeyKanaKanjiConverter​

というわけで作ったものがこちらです.
手前味噌ですが詳しくはGitHubのREADMEをどうぞ.

変換エンジンに AzooKeyKanaKanjiConverter を使わせていただいているのですが, これがまためちゃ面白いプロダクトです.
Zenzai というニューラルかな漢字変換システムで, AI時代の日本語変換を切り拓いています.
仕組みについての記事などもまとめてくださっていて, 読み応えあります.

そんなこんなでシンプルをモットーにしたSKKが, skkservを介して超ハイテクな変換エンジンと悪魔合体を果たしました.
自分で作って自分で使い続けてますが, めちゃ体験良いです. みんなにおすすめ.

かなテーブルの拡張​

自分はローマ字入力で日本語を打っているのですが, ローマ字にはマッピングされていないアルファベットの組み合わせが大量にあります.
例えば kz と打ってもローマ字では解釈できないし, tp と打っても解釈できません.
そういったローマ字だとdeadな組み合わせに対して, 頻出の二重母音を割り当てるかなテーブルが考案されています.

AZIK = ああ、ずっといい感じ​

詳しくはAZIK総合解説書などをどうぞ.
AZIKを導入すると, 上記例の kz は かん に, tp は とう になります.
つまり 関東 と入力したくて kantou と打っていたものが, kztp で済むようになります.
これ慣れると快適で, 早く打てるのもありますが, 右手の人差し指を温存できるメリットも大きいです.
上記の例でも n と u で, 右手人差し指の打鍵を2回節約できてますね.

覚えるのが大変そうな雰囲気がありますが, 通常のローマ字をベースにそれぞれmnemonicを交えながら頻出の二重母音に対応するよう拡張されていて, 割とすんなり入ってくる印象です. ただ一部のマッピングがどうしても誤爆が減らなかったので, ちょこちょこ本家AZIKからいじってはいます. (対応単語数を犠牲に特殊拡張周りを汎化したのと, abbrevモードを前提に一部マッピングを削除し, 代わりに母音始まりの二重母音のマッピングを追加したりしています.)

変換中のスタイルを変える​

wezterm上で変換する際, 変換中のスタイルが網掛けになっててちょっと落ち付かなかったので, 下線になるようにしました.
どうもその部分が設定可能ではなかったので, 直接コードを書き換えてビルドしたものを使っています.

まとめ​

ちゃんと日本語入力環境を整えれば, 日本語を打つのは楽しい.
でも日本語入力環境を整えるのは, 日本語を打つのよりもっと楽しい.