新しいプロダクトパートナーを募集しています

モードを選ばせない:意図を推測する検索

三つの文字体系を受け取る辞書は、ユーザーに選ばせることも、自分で判断することもできます。選ばせるほうがつくるのは楽で、使うのは悪い。その推測を信頼できるものにした方法。

KoiSpeak は一つの入力欄で三種類の入力を受け取ります。ベトナム語、ピンイン、漢字です。当たり前の設計はモード切り替えでしょう。私たちは意図的にそれをつくりませんでした。その理由は辞書をはるかに超えて一般化します。

モード切り替えが失敗する理由

切り替えスイッチは無害に見えます。ユーザーのコストはタップ一回。しかしそれは毎回かかりますし、非常に具体的で腹立たしい壊れ方をします。モードが間違っていると結果はゼロ件になり、ゼロ件は「この語は存在しない」と見分けがつきません。

ユーザーの実際の心的モデルは「私はいまピンイン検索を実行している」ではありません。「これはどういう意味か」です。その意図と答えのあいだに挟まるインターフェース要素はすべて摩擦であり、1 日に 40 回開かれる道具では摩擦が積み上がります。

ここには一般則が隠れています。入力から判断できることを、システムはユーザーに尋ねるべきではありません。 モード切り替えは、インターフェースが「その仕事をやりたくない」と認めた印です。

三つの文字体系は見た目より分離している

良い知らせは、これらが占める空間がほとんど重ならないことです。

漢字の検出は自明なほど簡単

漢字は既知の Unicode ブロックにあります。主に CJK 統合漢字の U+4E00 から U+9FFF で、拡張は別の場所にあります。入力にその範囲の文字が含まれていれば、ユーザーが打ったのは中国語です。これは推測ではなくほぼ確実な判定です。

ベトナム語にはピンインが使わない記号がある

ベトナム語はラテン文字で書かれ、独自の記号を持ちます。ホーン (ơ, ư)、サーカムフレックス (â, ê, ô)、ブレーヴェ (ă)、横棒付きの đ、そしてドット下 (ạ) やフック上 (ả) を含む声調記号です。

ピンインが使うのはマクロン、アキュート、カロン、グレーヴで、しかも a, e, i, o, u, ü の上だけです。二つの集合はほとんど重なりません。đ、ơ、ư、あるいはドット下を含む文字列はベトナム語で、それ以外にありえません。

ピンインは小さな閉じた集合

ここが過小評価される部分です。普通話に合法な音節は数百しかありません。zhangxueqiong は合法で、blorpstrem は違います。

つまり検証できます。入力を合法なピンイン音節に分割してみるのです。きれいに分割できれば、ピンインである可能性が非常に高い。これは声調記号なしのピンインも捕まえます。実際に多くの人が打つのはそちらです。

難しいのは重なりの部分

明快な場合の検出は簡単で、曖昧な場合こそ面白い。実際に衝突するのは:

  • どちらでもある短い文字列。 ma は合法なピンインであり、同時に合法なベトナム語の語です。bacocan も同様。
  • 記号なしのベトナム語。 かなりの人が記号なしでベトナム語を打ち、それは最強の手がかりを消し去ります。
  • 英語。 学習者は英単語を打ちますが、英語はあなたの三言語のどれでもありません。

ルールを増やして解こうとするのは負け戦です。ルールは長くなり、互いに矛盾し、それでも間違えます。

分類するのをやめ、全部検索して順位づける

実際に機能した設計は、これを分類問題として扱うのをやめることでした。

入力が何であるかを決めて一つの索引を引くのではなく、クエリをすべての解釈に対して走らせ、各解釈のもっともらしさを織り込んだスコアで結果をマージします。

おおまかには:

  1. 各解釈にスコアをつける。漢字を含むか、ベトナム語固有の記号を持つか、合法なピンインとして分割できるか。
  2. それらの解釈が指す索引を引く。
  3. マージし、解釈のスコア、一致の厳密さ、語の頻度で重みづけする。

ユーザーに見えるのは一つのリストです。ma ならピンインの結果とベトナム語の結果が一緒に、よく使う語から順に並び、どちらを求めていたにせよ答えは画面上にあります。曖昧さはエラー状態ではなく、順位づけられたリストになります。

分類は間違いうる決定を強います。順位づけは、不確かなままで役に立つことを許します。システムが確信を持てないときは、「自信を持った一つの誤答」ではなく「もっともらしい複数の答え」へ劣化する設計を選んでください。

その代償

取引について正直に言えば、キーストロークごとに走らせるクエリは増えます。それは事実であり、だからこの設計は性能次第で生きも死にもします。

成立させたのは次の点です。

  • 安い解釈を先に。 漢字検出は先頭数文字の範囲チェックだけです。当たればそれ以降は全部飛ばします。
  • 文字体系ごとの接頭辞索引。 個々のクエリが走査ではなく安価な探索になります。
  • 頻度を索引に焼き込む。 順位づけのために結果をもう一周する必要がなくなります。
  • デバウンスし、入力が変わったら実行中のクエリを取り消す。 大半のキーストロークは完了した検索を生みません。

それでも非常口が要る場所

自動判別が唯一の経路であってはいけません。別の手段が本当に必要な場合が二つあります。

  • そもそもその字が打てない。 そのために手書き入力と部首検索があります。
  • 方向を強制したい。 ときにユーザーは本当にベトナム語から中国語だけを求めます。方向を指定するコントロールは用意していますが、それは最初に強いる決定ではなく、必要なときに使える上書きとしてです。

この順序こそが本当の原則です。既定ではうまく推測し、その推測を人が正せるようにする。 推測を拒否して全員に申告させる、ではなく。

一般化できる教訓

どんなプロダクトにも、いちばん楽な実装がシステム自身で答えられたはずの質問をユーザーに投げる瞬間があります。ファイル形式。国。通貨。検索モード。

ひとつひとつは小さい。合わさると、それは「考えずに手が伸びる道具」と「操作しなければならない道具」の差になります。

UX エンジニアリング 検索