このページでは、PRIMEのクライアントを作成することを目的にした 通信プロトコルの説明します。
クライアントが PRIME サーバと通信する方法はいくつかの方法がありますが、 現状では標準入出力を介した方法が一般的です。コマンドラインから実際に 関数を実行してみれば、挙動をすべて把握することが可能です。
PRIMEの入出力フォーマットは、基本的には改行とタブで区切られたテキスト データです。
行末に改行を含む一行が基本単位です。一行には、関数とその関数の引数が 含まれます。関数と引数のそれぞれはタブで区切られます。
たとえば、ヘルプを表示する場合は "help\n" (引数なし) と、 カタカナ入力モードにするには "edit_set_mode\t1\tkatakana\n" と入力します。 ("1" は後述するセッション ID)
以降、可読性のために "edit_set_mode\t1\tkatakana\n" を "edit_set_mode ( '1', 'katakana' )" のように表します。
以下はコマンドラインから実行した場合の出力フォーマットの例です。
~% prime version ←入力 ok 0.9.3 taiyaki ←入力 error Unknown command: taiyaki Try `help' for protocol information. lookup taiyaki ←入力 ok たいやき たいやき priority=10124 part=名詞 base=たいやき basekey=たいやき
出力フォーマットも基本的に入力フォーマットと同様に改行とタブで区切られます。 出力データは複数行である可能性がありますが、出力データの最終行のみが空行で あることが保証されています。そのため、空行を検出すれば、データの取得が 完了したこと判定できます。
出力データには正常な出力と、エラーの二種類があります。正常な出力は 最初の行は "ok\n" であり、エラーの場合は "error\n" です。
全体のながれとしては、まず最初に、クライアントはクライアントごとの セッション ID を取得します。その後プリエディションに関するやりとりを 行います。プリエディションとは、ローマ字からひらがなに変換する部分のことを 指します。次にメインである単語候補を取得します。そして場合によっては 単語の学習を行います。
処理のながれを擬似的な言語で書き表すと以下のようになります。
session-id = session_start ( )
context = ""
loop {
ユーザから入力文字列 string の取得
edit_insert ( session-id, string )
query = edit_get_query_string ( session-id )
set_context ( context )
words = lookup ( query )
words からユーザの選択した単語データ、key value part suffix rest を取得
learn_word ( key value part context suffix rest )
edit_erase ( session-id )
context = value + suffix + rest
}
session_end ( session-id )
PRIME サーバは、セッション ID を用いてクライアントごとのデータを管理します。 セッション ID はクライアントごとに一意に割り当てられた文字列です。
現在セッションは、プリエディションにのみ利用されていますが、今後、 単語候補の取得など全般に渡って利用される予定です。
プリエディションとは、ローマ字からひらがなに変換する部分のことを指します。 PRIME 0.8.5 / 0.9.3 以降では、サーバ側がこの機能を受け持ちます。 従来と同様にクライアント側で行うことも可能です。
プリエディションの編集用関数を実行したあとも、edit_get_preedition と 同様の返り値が返ります。
カーソル移動を行った後も、edit_get_preedition と同様の返り値が返ります。
入力モードとは、ひらがな入力、カタカナ入力、直接入力などのことです。
メインの処理となる部分です。候補データの文字列処理が面倒ではありますが、 内容自体は平易です。
lookup hennkann ←入力 ok へんかんが 変換が priority=15867 part=未知語 base=変換が basekey=へんかんが へんかん 変換 priority=15867 part=サ行(する)&名詞 base=変換 basekey=へんかん
出力フォーマットは一行につき一候補で、優先順位の高い順位に ソートされています。
各行はタブによってデータが区切られています。各データは、第一項が候補の読み、 第二項が変換結果です。それ以降のデータは "キー=データ" というように キーとデータが "=" で結ばれています。データの順番は保証されていません。 これらのデータは学習で使用しますので、いったんクライアント側で 保持しておく必要があります。(今後はセッションで管理され、 クライアント側での管理は必要なくなる予定です)。
第三項以降のデータで、"usage" や "annotation" というキーが含まれる 単語候補もあります。 "usage" は「看ると診るの違い」といった単語の用例を、 "annotaion" は「ー(長音)と-(半角マイナス)の違い」といった文字種を表します。 活用しなくても実害はありません。残りのデータは、現在のところ、主に 学習用に使われます。
PRIME は単語候補を予測するために、コンテキストの提供をクライアントに 要求します。コンテキストは、現時点では直前に入力した単語の文字列と 同じですが、将来的には使用しているアプリケーションなども 受け付けるようにする予定です。
uim では context が別の意味で使用されていますので、uim のソースコードでは prime-context という名前で、このコンテキストが処理されています。
単語の学習では、変換処理の時に取得したデータを利用します。 単語候補に含まれる、basekey, base, part, conjugation, rest と コンテキストを引数に指定します。
単語を新規に登録する場合と、学習の場合との違いはありません。
| key | 語幹の読み (basekey) |
|---|---|
| base | 語幹 (base) |
| part | 品詞 |
| context | コンテキスト |
| suffix | 送りがな (conjugation) |
| rest | 送りがな以降の文字列 (rest) |