diff options
Diffstat (limited to 'doc')
-rw-r--r-- | doc/00INDEX | 29 | ||||
-rw-r--r-- | doc/DICLIB | 34 | ||||
-rw-r--r-- | doc/DICUTIL | 65 | ||||
-rw-r--r-- | doc/ELISP | 105 | ||||
-rw-r--r-- | doc/GLOSSARY | 164 | ||||
-rw-r--r-- | doc/GRAMMAR | 56 | ||||
-rw-r--r-- | doc/GUIDE | 35 | ||||
-rw-r--r-- | doc/GUIDE.english | 41 | ||||
-rw-r--r-- | doc/ILIB | 300 | ||||
-rw-r--r-- | doc/LEARNING | 36 | ||||
-rw-r--r-- | doc/LIB | 213 | ||||
-rw-r--r-- | doc/MISC | 198 | ||||
-rw-r--r-- | doc/Makefile.am | 3 | ||||
-rw-r--r-- | doc/Makefile.in | 322 | ||||
-rw-r--r-- | doc/POS | 148 | ||||
-rw-r--r-- | doc/SPLITTER | 132 | ||||
-rw-r--r-- | doc/TESTING | 36 | ||||
-rw-r--r-- | doc/protocol.txt | 130 |
18 files changed, 2047 insertions, 0 deletions
diff --git a/doc/00INDEX b/doc/00INDEX new file mode 100644 index 0000000..451cc4f --- /dev/null +++ b/doc/00INDEX @@ -0,0 +1,29 @@ +**This document is written in Japanese.** + +このディレクトリにあるドキュメントのファイル一覧とその説明です + ドキュメントは不完全だったり現実と食い違っていたりする場合は + 遠慮せずに連絡をお願いします + +ユーザー向けのドキュメント + *GUIDE 利用可能な機能の説明です + *ELISP EmacsからAnthyを使用するための方法をまとめています + +開発者向けのドキュメント + *DICUTIL 辞書管理コマンドの仕様 + *GLOSSARY 用語の意味の説明など + *ILIB Anthy(入力)ライブラリの仕様書 + *LIB Anthy(変換エンジン)ライブラリの仕様書 + *DICLIB Anthy(個人辞書)ライブラリの仕様書 + *MISC 雑多なドキュメント + *POS 品詞分類について(Part Of Speech) + *SPLITTER 文節境界の検出モジュールの概要 + *LEARING 各学習機構についての説明 + *TESTING テストの方法について + *GUIDE.english Guide for non Japanese people + *protocol.txt EGG 対応プロトコルの仕様と説明 + *GRAMMAR 日本語文法のうちanthyでの扱いが難しいor微妙なもののメモ + +00INDEXというファイル名はlsした時に最初に出てくるように +という意図をもって名付けてあります。linuxにも + linux/Documentation/00INDEX というファイルが +あります。 diff --git a/doc/DICLIB b/doc/DICLIB new file mode 100644 index 0000000..f60f0a2 --- /dev/null +++ b/doc/DICLIB @@ -0,0 +1,34 @@ +* Anthy個人辞書ライブラリの使用方法の説明 * + +ライブラリのオプション -lanthydic +(もしくはpkg-configでanthyを指定する) +インクルードファイル anthy/dicutil.h + anthy/anthy.h (エンコーディングの定数のため) + +* データ型 * + +* 関数の概説 * +初期化関数 + anthy_dic_util_init 個人辞書ライブラリの初期化 + anthy_dic_util_quit 個人辞書ライブラリの終了 + anthy_dic_util_set_personality パーソナリティの設定 + anthy_dic_util_set_encoding エンコーディングの設定 +単語の選択 + anthy_priv_dic_select_first_entry 最初の単語の選択 + anthy_priv_dic_select_next_entry 次の単語の選択 + anthy_priv_dic_select_entry (not implemented) +単語の情報の取得 + anthy_priv_dic_get_index 見出し語の取得 + anthy_priv_dic_get_freq 頻度の取得 + anthy_priv_dic_get_wtype 品詞の取得 + anthy_priv_dic_get_word 単語の取得 +単語の登録 + anthy_priv_dic_add_entry 単語の登録 + anthy_priv_dic_delete 単語の削除 +その他 + anthy_dic_search_words_file 単語の検索 + anthy_dic_util_get_anthydir (unstable API) + +* 各関数の説明 * +void anthy_dic_util_init(void) +void anthy_dic_util_quit(void) diff --git a/doc/DICUTIL b/doc/DICUTIL new file mode 100644 index 0000000..d6aab10 --- /dev/null +++ b/doc/DICUTIL @@ -0,0 +1,65 @@ +*辞書管理 + +辞書を管理するためのコマンドとして anthy-dic-tool が +インストールされます. +anthy-dic-toolはユーザーの辞書を人間に読める形式(以下これを外部形式と呼ぶ)で +標準出力したり,外部形式をユーザの辞書に取り込む機能を持っています. + + anthy-dic-tool はコマンドラインのオプションは以下のとおりです + --help + --version + --dump + --load + --append + --personality + +*--help + 使いかたを表示します. + 表示される内容は anthy/src-util/dic-tool-usage.txt のファイルの内容で, + このファイルは ${prefix}/share/anthy/dic-tool-usage.txt に + インストールされます. + +*--version + バージョンを表示します + +*--dump + 標準入力に辞書の外部形式を出力する + +*--load + 標準入力から辞書の外部形式を読み込んで,自分の辞書を更新する + +*--append + 標準入力から辞書の外部形式を読み込んで,自分の辞書に追加する + +*--utf8 + UTF8エンコーディングを用いる + +*--personality=name + --persnoalityをnameに設定する + + +品詞可能な品詞の一覧 + +名詞(一般名詞) +品詞 = 名詞 +な接続 = y/n +さ接続 = y/n +する接続 = y/n +語幹のみで文節 = y/n +格助詞接続 = y/n + +副詞 +品詞 = 副詞 +と接続 = y/n +たる接続 = y/n +する接続 = y/n +語幹のみで文節 = n/n + +人名 +品詞 = 人名 + +地名 +品詞 = 地名 + +形容詞 +品詞 = 形容詞 diff --git a/doc/ELISP b/doc/ELISP new file mode 100644 index 0000000..03cebd0 --- /dev/null +++ b/doc/ELISP @@ -0,0 +1,105 @@ +This document is written in Japanese. + +EmacsからAnthyの各機能を用いる方法を記述したドキュメントです + + +(1)ソフトウェアの構成 +(2)使いはじめるために +(3)日本語入力の方法 +(4)設定項目 +(5)Quick Guide +(6)技術的な詳細 + + + + +(1)ソフトウェアの構成 + Anthyのemacs対応は日本語入力部と個人辞書の管理の + 二つの部分で構成されています。 + どちらの部分もelispで記述されたフロントエンドから + コマンドを起動して、パイプで通信することによって + 動作します。これによってクリーンな実装と一定の + セキュリティとプライバシー保護を実現しています。 + + + +(2)使いはじめるために + *まずAnthyを通常にインストールしてください。 + *次にemacs lispをロードする設定をします。 + 一般的には ~/.emacs に + (load-library "anthy") + という行を追加します + *そして使用するinput-methodとしてAnthyを選択します + これも一般的には ~/.emacs に + (setq default-input-method 'japanese-anthy) + という行を追加することによって行います + *emacsのインストールされている場所とanthyの + インストールされている場所が異なる場合には + ~/.emacs に下記の行を追加してください + (setq load-path + (cons "/usr/local/share/emacs/site-lisp/anthy/" load-path)) + emacsをインストールした先のprefixとanthyをインストールした先のprefixが + 違う場合は + ~/.emacs に下記の行を追加してください + (load-file "/usr/local/share/emacs/site-lisp/anthy/leim-list.el") + + +(3)日本語入力の方法 + キーバインド + 入力モードへの移行 + +C-\ anthy-modeのon-off + 入力モード + +/ 英数モードとの一時的なトグル + `/'そのものを入力したい場合は`/'を2回打ってください + +l 英数モードへの変更(プリエディットの無い状態で有効) + +C-j 日本語モードへの変更 + +q ひらがなカタカナのトグル(プリエディットの無い状態で有効) + 編集モード + +C-i 文節の短縮 + +C-o 文節の拡大 + +C-f 右文節 + +C-b 左文節 + +C-n, space 次候補 + +C-p 前候補 + +C-j 確定 + +return 確定 + + + +(4)設定項目 + *~/.emacsに記述することによって設定が可能です. + +(anthy-change-hiragana-map key str) + ひらがなのmapを変更する + 例 + (anthy-change-hiragana-map "," "、") + 「.,」を「.,」に割り当てる場合は + (anthy-load-hiragana-map anthy-alt-char-map) + +(anthy-set-break-into-roman 't) + ローマ字入力中にバックスペースを押すと文字単位ではなくローマ字を消す. + たとえば「か」でバックスペースを押すと「k」が残る + +(anthy-kana-map-mode) + かなキーボード打ちモードに変更する + +(6)Quick Guide + ~/.emacsに追加する内容の説明です + 日本語をデフォルトにする + (set-language-environment "Japanese") + anthy.el をロードできるようにする + (push "/usr/local/share/emacs/site-lisp/anthy/" load-path) + anthy.elをロードする + (load-library "anthy") + japanese-anthy をデフォルトのinput-methodにする + (setq default-input-method 'japanese-anthy) + + + +(6)技術的な詳細 + *src-util/anthy.elがemacs用のanthyのフロントエンドです。 + *src-util/anthy-dic.elがemacs用のanthyのフロントエンドです。 + *emacsのsite-lispのディレクトリにインストールされます。 + *emacs20.7などで動作します。 + *leimのAPIにも準拠しています。 + *anthy.el は同梱されているanthy-agentというコマンドを起動して + パイプで通信をすることによって変換の動作を行います。 + *anthy-dic.el は同梱されているanthy-dic-toolというコマンドを + 起動してパイプで通信を行うことによって、個人辞書にアクセスします。 diff --git a/doc/GLOSSARY b/doc/GLOSSARY new file mode 100644 index 0000000..552c246 --- /dev/null +++ b/doc/GLOSSARY @@ -0,0 +1,164 @@ +** GLOSSARY ** +ator allocatorの略 + allocatorは一般にはメモリの管理を行う機構のことを指し、 + メモリの確保だけではなく解放も管理する。 + +candidate 候補 + +candsort 候補の評価並び換えを行うモジュール + +candswap 候補の優先順位の交換を行うモジュール + +cc(conjugate class) どの活用か (何行何段とか) + +commit(コミット) 入力の確定 + +compose: + 品詞を割当てられた文節に対して候補を割当てる + +conjugate: + 活用(infectionの方が適切かも) + +context: + 入力コンテキスト 変換する文字列一つに対応する + +corpus: + 例文 + +cos(class of speech): + 副品詞 + +ct(conjugate type): + 活用形 (未然、連用、、) + +declinable: + 用言 <-> 体言 indeclinable + +depword: + 付属語 + +dic_session_t: + 辞書のセッション + +dtor: + destructorの略 + +ent: + entry + +feature: + 素性、0,1の値を取る関数 + +feature_set: + 素性の集合、二値のベクトルもしくは素性番号のリストとして扱える + +file_dic: + ファイル辞書 + +gang look up: + 複数の検索キーに対する検索を一度に行う + +lattice: + 束、集合論の概念 + +metaword: + 文節を複数まとめたもの + +mmap: + OSの機能 + ファイルの内容をプロセスのアドレス空間に見えるようにする + +nr: + NumbeR。nr_?? でなにかの数を意味する + +ochaire(お茶入れ): + 文節の組をそのまま学習するための機構 + +personality: + ユーザを識別するための文字列 + +pos(part of speech): + 品詞 + +quit: + モジュール自体の終了(関数の命名に使ってる) -> release + +ratio: + RATIO_BASEを分母とする比率 + +release : + モジュールのデータ(構造)の解放(関数の命名に使ってる) -> quit + +scos(sub cos): + 副副品詞 + +seg: + -> segment + +seq_ent_t: + 辞書上の見出語 + +segment: + 文節(国文法の文節では無い) + +segstruct: + 文節を構成する単語に対しルール基づいてに品詞を割当てる + +splitter: + ひらがな列を文節に分割する + +trie: + n-way tree 一般的には256などを用いる + 文字列やIPアドレス等の高速検索に用いられる + +word_list: + 文節を構成する単位、自立語を一つ含む + +wordseq: + 自立語に対して付属語を付けてゆく + +wordsplit: + 文節の境界を検出する + +wtype: + 単語の型情報 -> doc/POSを見よう + +xchar: + 文字(EUC-JPのコード) + +xstr: + 文字列(長さとxcharへのポインタを持つ) + +ビタビアルゴリズム: + viterbi algorithm、動的計画法の一種 + + +** xchar ** +anthyではxcharという独自の文字型を作って文字を扱うようにしている。 +xcharは現時点では32bitでUCS4もしくはASCIIのコードが入っている。 + + +** context ** +Anthyは同時に複数の入力を行うことをサポートするために、 +複数の各入力をコンテキストというオブジェクトに対応させて、 +ユーザによる操作をそれぞれのコンテキストへの操作という +形で行うようにしています。 + +** seq_ent ** +文字列のハンドルです。 +personalityごとに辞書は用意されるので、異なるpersonalityにおいては +同じ文字列でも異なる値を取ります。 + +** xstr ** +typedef struct xstr_{ + xchar *str; + int len; +}xstr; +普通の文字列のように\0終端にすると部分を取り出すなどの操作が +複雑になるので、開始点へのポインタと文字数を持つ構造体によって +文字列を表現している。 + +** personality ** +学習の内容などを識別するための名前 +各コンテキストは一つのpersonalityを参照する。 +特に指定しなければdefault personality ""(空文字)が使用される。 diff --git a/doc/GRAMMAR b/doc/GRAMMAR new file mode 100644 index 0000000..fc1d634 --- /dev/null +++ b/doc/GRAMMAR @@ -0,0 +1,56 @@ +日本語文法のうちanthyでの扱いが難しいor微妙なものをメモ + +*文節クラス + 主語 + 〜が、〜は + 述語 + 動詞終止形 + 連体修飾語 + 連用修飾語 + 〜を + 接続語 +(連用修飾語 述語) + +動詞終止形は述語と連用修飾語のどちらにもなる +動く、動く人 + +*ややこしい付属語 +が + 格助詞 「わたしが」 + 接続助詞 「たべたが」 + +た + 助動詞 食べた、死んだ + 助詞 私のだ + +で + 助動詞 死んで @だ(助動詞音便) + 助詞 〜しないで 私で + 口語 食べるで + +と + 格助詞 〜と言う + 接続助詞 私と君 + +さ + 「寒さ」 + 「〜さ(口語)」 +の + 〜のなら + +な + 連体修飾 きれいな + 言い切り 〜だな + +や + 並列 aやb + 間投助詞 〜や + +*その他 + +*単語のクラス +[時間]+ 頃 + +いる + 必要の「いる」 + 存在の「いる」 diff --git a/doc/GUIDE b/doc/GUIDE new file mode 100644 index 0000000..a9a8bfb --- /dev/null +++ b/doc/GUIDE @@ -0,0 +1,35 @@ +**This document is written in Japanese.** + +** 各ユーザの設定の保存 ** +ユーザの入力から学習されたデータ及び登録された単語は +ホームディレクトリの~/.anthyに保存されます。 +バージョンやOS間でも互換性があるので、コピーすることで別の環境でも +利用することができます。 + + +** 単語登録 ** +辞書APIを用いたツール(anthy-dic-tool等)を利用してください。 +その他に下記に述べるように ~/.anthy/ 以下のファイルを +直接編集することで、単語登録を行う機能も実現しています。 +-- + ~/.anthy/imported_words_defaultもしくはディレクトリ + ~/.anthy/imported_words_default.d/以下の任意の名前に +utf8で各行「よみ #T35 単語」の形式でソートされたテキストを +置くことで、変換時に利用されるようになります。 + + +** historyファイル ** +変換の履歴を保存する機能です。 +環境変数ANTHY_HISTORY_FILEにファイル名を指定すると、 +以降の変換の結果がファイルとして保存されます。 +ファイルサイズが上限の100KBに達すると保存は行われなくなります。 +chmod 6が行われますが、これは不注意な設定に対する +気安めでしかありません。 +このファイルを整形して例文として追加することで性能が向上する +可能性があります。場合によっては開発元に送付することも検討してください。 + + +** 共通の設定 ** +anthy-confに変数名、内容を記述します +anthy-confは典型的には /usr/local/etc/ にインストールされます +変数名には ANTHYDIR, DIC_FILE, INDEPWORD, DEPWORD, (ZIPDICT_EUC) diff --git a/doc/GUIDE.english b/doc/GUIDE.english new file mode 100644 index 0000000..8f1c275 --- /dev/null +++ b/doc/GUIDE.english @@ -0,0 +1,41 @@ +*This document is a simple guide for non Japanse people to use Anthy. + +*Correction for my poor English is welcome. +*Many part of this document is not yet written. +-- -- -- -- +*How to INSTALL +*Why conversion system? +*How to USE + +-- -- -- -- +*How to INSTALL + You can use .rpm or .deb to install Anthy. + You also can install Anthy from source package + $ ./configure; make ;make install + shared libraries, utility commands, and grammer definition + files will be installed. + +-- -- -- -- +*Why conversion system? + Japanese text contains both phonetic characters and + ideographic characters. There are two classes of phonetic + symbols, Hiragana and Katakana. Ideographic + symbol in Japanese is called Kanji. + Japanese also uses English alphabet to type an + unix command, to write a program and so on, + thus generally input method systems have ability + to enable or disable itself easily. + + Class of characters in Japanese texts. + With Japanese input method enabled + -phonetic character + -ideographic character + With Japanese input method disabled + -English(Latin) character +-- -- -- -- +*How to USE + Anthy's conversion system is implemented as a library, + so you should use a software (e.g. XIM server to input on + an X application) which uses the library. + This package contains an utility command and Emacs lisp files + to use Anthy from Emacs. diff --git a/doc/ILIB b/doc/ILIB new file mode 100644 index 0000000..2b19146 --- /dev/null +++ b/doc/ILIB @@ -0,0 +1,300 @@ +* Anthy Input ライブラリの使用方法の説明 * + + * 今からアプリケーションを書く場合にはuimの利用をお薦めします。 + +ライブラリのオプション -lanthyinput -lanthy -lanthydic +インクルードファイル anthy/anthy.h anthy/input.h + (anthy/anthy.h を先にインクルードすること) + +* データ型の概説 * +anthy_input_config ローマ字変換の設定などに用いる。 +ライブラリのユーザは中身をみてはいけない。 +anthy_input_context 入力のコンテキストを識別するために用いる。 +ライブラリのユーザは中身をみてはいけない。 +anthy_input_preedit ライブラリからプリエディットを得るときに用いられる。 +プリエディット全体を表す。 +anthy_input_segment ライブラリからプリエディットを得るときに用いられる。 +候補を得るときにも用いられる。文節を表す。 + +char * エンコードにはEUC-JPを利用する。 + +* 関数の概説 * +初期化関数など + anthy_input_init ライブラリの初期化 + anthy_input_set_personality パーソナリティの設定 +コンテキストの管理 + anthy_input_create_context 入力コンテキストの作成 + anthy_input_free_context 入力コンテキストの解放 +設定 + anthy_input_create_config デフォルトの設定の作成 + anthy_input_free_config デフォルトの設定の解放 + anthy_input_edit_toggle_config 英数との一時的トグルに使うキーの変更 + anthy_input_edit_rk_config キーと文字の対応の変更 + anthy_input_clear_rk_config キーと文字の対応をデフォルトに戻す + anthy_input_change_config 設定の変更の通知 +コンテキストの操作(直接的な操作) + anthy_input_str 文字列の追加 + anthy_input_next_candidate 次の候補(選択中の文節に適用) + anthy_input_prev_candidate 前の候補(選択中の文節に適用) + anthy_input_quit 変換をキャンセル(1段階) + anthy_input_erase_prev カーソル前の文字を削除 + anthy_input_erase_next カーソル後の文字を削除 + anthy_input_commit 確定 + anthy_input_move カーソル、選択中文節を移動 + anthy_input_resize 選択中文節の長さを変更 + anthy_input_beginning_of_line プリエディット先頭に移動 + anthy_input_end_of_line プリエディット末尾に移動 + anthy_input_cut 文字列の切り取り +コンテキストの操作(キーに対応した動作) + anthy_input_key 1文字の追加 + anthy_input_space スペースまたは変換(コンテキスト依存) +コンテキストの操作(その他) + anthy_input_get_state 現在の状態の取得 + anthy_input_get_preedit プリエディットを得る + anthy_input_map_select ローマ字仮名変換マップの切替え + anthy_input_get_selected_map 現在のローマ字仮名変換マップの取得 + anthy_input_get_candidate 候補番号を指定して候補を得る + anthy_input_select_candidate 候補番号を指定して候補を選ぶ + anthy_input_free_preedit プリエディットの解放 + (属する文節構造体も同時に解放する) + anthy_input_free_segment 文節の解放 +設定の変更 + anthy_input_map_edit ローマ字仮名変換マップの編集(未対応) + +* 状態 * + 待機状態(1) プリエディットは存在しない + 編集中状態(2) ローマ字入力中の状態。 + カーソル位置の文節に文字列がない。 + 選択中文節はカーソル位置の文節を指している。 + 変換中状態(3) 変換中の状態。 + 文節伸縮状態(4) 文節伸縮中の状態。 + 選択中文節以降はすべて平仮名になる。 + 選択中文節より後ろは全てまとめて一文節になる。 + +* 各関数の説明 * + int anthy_input_init(void); + 引数: 無し + 返り値: 0 なら成功 -1 なら失敗 + ライブラリを初期化する。anthyライブラリも初期化する。 + + struct anthy_input_config* anthy_input_create_config(void); + 引数: 無し + 返り値: 設定構造体のポインタ + 設定構造体を得る。設定構造体はデフォルト値で初期化されている。 + + void anthy_input_free_config(struct anthy_input_config* cfg); + 引数: 設定構造体のポインタ + 返り値: 無し + 設定構造体を解放する。この設定を共有する全ての入力コンテキ + ストを事前に解放する事。 + + anthy_input_set_personality(char *personality); + 引数: personality パーソナリティの名前 + 返り値: 無し + + struct anthy_input_context* + anthy_input_create_context(struct anthy_input_config* cfg); + 引数: cfg 設定構造体のポインタ + 返り値: 入力コンテキストのポインタ + 入力コンテキストのポインタを得る。引数に与えた設定構造体に + 適用した操作は、入力コンテキストを作った後にでも、すぐに入 + 力コンテキストに反映される。 + コンテキストは待機状態で作成される。 + + void anthy_input_free_context(struct anthy_input_context* ictx); + 引数: ictx 入力コンテキスト + 返り値: なし + 入力コンテキストを解放する。 + + void anthy_input_str(struct anthy_input_context* ictx, char* str); + 引数: ictx コンテキスト構造体 + str 追加する文字列 + 返り値: 無し + 追加する文字列はローマ字(半角)で入力する。 + 待機状態と編集中状態ではプリエディットに文字列を追加する。 + 変換中状態と文節伸縮状態ではプリエディットをその状態で確定して、 + 新たにstrだけを持つプリエディットを作る。 + 呼出後は編集中状態になる。 + + void anthy_input_next_candidate(struct anthy_input_context* ictx); + 引数: ictx コンテキスト構造体 + 返り値: 無し + 編集中状態では全文節を変換し、変換中状態にはいる。 + 変換中状態では選択中文節の候補を次の候補にする。 + 文節伸縮状態では選択中文節以降を変換し、変換中状態に入る。 + + void anthy_input_prev_candidate(struct anthy_input_context* ictx); + 引数: ictx コンテキスト構造体 + 返り値: 無し + 編集中状態では全文節を変換し、変換中状態にはいる。 + 変換中状態では選択中文節の候補を前の候補にする。 + 文節伸縮状態では選択中文節以降を変換し、変換中状態に入る。 + + void anthy_input_quit(struct anthy_input_context* ictx); + 引数: ictx コンテキスト構造体 + 返り値: 無し + 編集中状態では待機状態になる。 + 編集中状態と文節伸縮状態では編集中状態になる。 + + void anthy_input_erase_prev(struct anthy_input_context* ictx); + 引数: ictx コンテキスト構造体 + 返り値: 無し + 編集中状態だけで有効。 + カーソルの前1文字を消す。 + 消した結果プリエディットがなくなれば、待機状態になる。 + + void anthy_input_erase_next(struct anthy_input_context* ictx); + 引数: ictx コンテキスト構造体 + 返り値: 無し + 編集中状態だけで有効。 + カーソルの後1文字を消す。 + 消した結果プリエディットがなくなれば、待機状態になる。 + + void anthy_input_commit(struct anthy_input_context* ictx); + 引数: ictx コンテキスト構造体 + 返り値: 無し + 現在のプリエディットの状態で確定する。 + 待機状態に戻る。 + + void anthy_input_move(struct anthy_input_context* ictx, int lr); + 引数: ictx コンテキスト構造体 + lr 移動方向 + 返り値: 無し + 編集中状態ではカーソルを移動する。 + 変換中状態では選択文節を移動する。 + 文節伸縮状態では変換中状態に戻り、選択文節を移動する。 + lr = -1 で左移動、 lr = 1 で右移動。 + + void anthy_input_resize(struct anthy_input_context* ictx, int lr); + 引数: ictx コンテキスト構造体 + lr 伸縮方向 + 返り値: 無し + 変換中状態では選択文節を伸縮させ、文節伸縮状態になる。 + 文節伸縮状態では選択文節を伸縮する。 + lr = -1 で縮小、 lr = 1 で伸長。 + + void anthy_input_beginning_of_line(struct anthy_input_context* ictx); + 引数: ictx コンテキスト構造体 + 返り値: 無し + 編集中状態だけで有効。 + カーソルをプリエディットの先頭に移動させる。 + + void anthy_input_end_of_line(struct anthy_input_context* ictx); + 引数: ictx コンテキスト構造体 + 返り値: 無し + 編集中状態だけで有効。 + カーソルをプリエディットの末尾に移動させる。 + + void anthy_input_cut(struct anthy_input_context* ictx); + 引数: ictx コンテキスト構造体 + 返り値: 無し + 編集中状態だけで有効。 + カーソル以降の文字列を消す。消した文字列は記憶している。 + + void anthy_input_str(struct anthy_input_context* ictx, char c); + 引数: ictx コンテキスト構造体 + c 追加する文字 + 返り値: 無し + anthy_input_key とほぼ同じ。ただし、 1 文字だけ追加する。 + + void anthy_input_space(struct anthy_input_context* ictx); + 引数: ictx コンテキスト構造体 + 返り値: 無し + コンテキストに応じて空白の追加、変換のどちらかになる。 + + struct anthy_input_preedit* + anthy_input_get_preedit(struct anthy_input_context* ictx); + 引数: ictx コンテキスト構造体 + 返り値: 現在のプリエディット + 現在のプリエディットを得る。得たプリエディットを書き換えてはいけない。 + プリエディットの中身は後述。 + + int anthy_input_map_select(struct anthy_input_context* ictx, int map); + 引数: ictx コンテキスト構造体 + map マップ番号 + 返り値: 成功 0 失敗 それ以外 + ローマ字からの変換マップを変更する。 map に指定できるのは以下の定数 + MAP_HIRAGANA ひらがな + MAP_KATAKANA かたかな + MAP_ALPHABET アルファベット + MAP_WALPHABET 全角アルファベット + + struct anthy_input_segment* + anthy_input_get_candidate(struct anthy_input_context* ictx, int cand_no); + 引数: ictx コンテキスト構造体 + cand_no 候補番号 + 返り値: 目的の候補を含んだ文節構造体 + 変換中状態でだけ有効。 + 選択中文節の指定した番号の候補を得る。 + 次に anthy_input_get_candidate でプリエディットを要求した時は、 cand_no + の次の候補が返される。 + + int anthy_input_select_candidate(struct anthy_input_context* ictx, int cand); + 引数: ictx コンテキスト構造体 + cand_no 候補番号 + 返り値: 成功 0 失敗 それ以外 + 変換中状態でだけ有効。 + 選択中文節の指定した番号の候補を選択し、選択中文節を右の文節に移動させる。 + + void anthy_input_free_preedit(struct anthy_input_preedit* pedit); + 引数: pedit プリエディット構造体 + 返り値: 無し + プリエディット構造体を解放する。 + + void anthy_input_free_segment(struct anthy_input_segment* cand); + 引数: cand 文節構造体。 + 返り値: 無し + 文節構造体を解放する。 + +* データ型の説明 * +struct anthy_input_preedit { + int state; /* 状態 */ + + char* commit; /* 確定文字列 */ + char* cut_buf; /* 切り取った文字列 */ + + struct anthy_input_segment* segment; /* 文節リスト */ + struct anthy_input_segment* cur_segment; /* 選択中の文節 */ +}; + + state: 現在の状態 + ST_NONE 待機状態 + ST_EDIT 編集中状態 + ST_CONV 変換中状態 + ST_CSEG 文節伸縮状態 + commit: NULL でなければ、確定された文字列が入っている。 + commit は一度 anthy_input_get_preedit すると消える。 + cut_buf: NULL でなければ、 anthy_input_cut により消された文字列が入っている。 + cut_buf は一度 anthy_input_get_preedit すると消える。 + segment: 変換中、文節伸縮状態では文節のリスト + 編集中状態では、カーソル前文字列、ローマ字文字列、空文節、 + カーソル後文字列のリスト + cur_segment: カーソルのある文節 + +struct anthy_input_segment { + char* str; /* 文字列 */ + int cand_no; /* 候補番号 */ + int noconv_len; /* 無変換状態でのバイト数 */ + int nr_cand; /* 候補数 */ + int flag; /* フラグ */ + + struct anthy_input_segment* next; /* 次の文節 */ +}; + str: 現在の候補の文字列 + (編集中状態の、カーソルを表す文節では NULL になっている) + cand_no: 候補番号 (0 〜 nr_cand - 1, + 候補の割り当てられた文節でないときと無変換候補のときは -1) + noconv_len: 無変換状態での文節の文字列の長さ (バイト数) + nr_cand: 全候補数 (候補の割り当てられた文節でないときは -1) + flag: 文節の種類を表すフラグ + SF_CURSOR カーソルまたは選択中文節 + SF_ENUM 数回連続で変換キーが押されるなどしたので、 + 候補一覧を表示することをライブラリが提案している。 + これを受け取ると、 anthy_input_get_candidate + を使って候補一覧を表示するのが望ましい。 + SF_ENUM_REVERSE 逆方向の候補一覧を表示することをライブラリが + 提案している + SF_EDITTING 編集中状態の文字列 + SF_PENDING まだローマ字のままで、仮名にもなっていない文字列 + SF_FOLLOWING 文節伸縮状態で、選択中文節より後ろの文字列 + を 1 文節にした文節 diff --git a/doc/LEARNING b/doc/LEARNING new file mode 100644 index 0000000..a405141 --- /dev/null +++ b/doc/LEARNING @@ -0,0 +1,36 @@ +****学習機構の説明**** + +文節の境界の決定及び候補の順序の決定の際に次のルールが適用されます。 + +*[お茶入れ]学習 + 連続する文節の区切り方と候補をそのまま覚える + 学習 src-ordering/commit.c + 利用 src-splitter/metaword.c + セクション OCHAIRE + MAX_OCHAIRE_ENTRY_COUNT 100 + +*文節の拡張の学習 + 候補が確定された際に最初に出した文節が右どなりの文節を含むほど + 拡大された際にそれを学習する. + 学習 src-splitter/splitter.c + 利用 src-splitter/metaword.c + セクション EXPANDPAIR + MAX_EXPAND_PAIR_ENTRY_COUNT 1000 + +*候補交換の学習(自立語部) + 2番め以降に出した候補が確定されたときに自立語部を覚える + 学習,利用 src-ordering/candswap.c + セクション INDEPPAIR + MAX_INDEP_PAIR_ENTRY 100 + +*履歴の学習 + 学習、利用 src-ordering/candhistory.c + セクション CAND_HISTORY + HISTORY_DEPTH 8 + MAX_HISTORY_ENTRY 200 + +*未知語の学習 + 学習 src-worddic/priv_dic.c + 利用 src-worddic/commit.c + セクション UNKNOWN_WORD + MAX_UNKNOWN_WORD 100 @@ -0,0 +1,213 @@ +* Anthyライブラリの使用方法の説明 * + +ライブラリのオプション -lanthy -lanthydic +(もしくはpkg-configでanthyを指定する) +インクルードファイル anthy/anthy.h ++anthy_ で始まる関数名はライブラリ内部の使用のために予約されている + +* データ型 * +anthy_conv_stat 現在の変換の状態を得るために用いる + 文がいくつの文節に分割されたかを得ることができる +anthy_segment_stat 文節の状態を得るために用いる + 文節がいくつの変換候補を持っているかを得ることができる + 文節の長さを得ることができる(テスト用) +anthy_prediction_stat 予測候補の数を得ることができる +anthy_context_t 変換のコンテキストを識別するために用いる + ポインタ型である +char * デフォルトではエンコードにはEUC-JPを利用する。 + +* 関数の概説 * +初期化関数 + anthy_init Anthyの初期化 + anthy_conf_override 設定の更新 + anthy_set_personality パーソナリティの設定 + anthy_quit Anthyの終了 +コンテキストの管理 + anthy_create_context 変換コンテキストの作成 + anthy_reset_context 変換コンテキストのリセット + anthy_release_context 変換コンテキスト解放 +コンテキストに対する操作 + anthy_set_string 変換文字列の設定 + anthy_resize_segment 文節の伸縮 +変換結果の取得 + anthy_get_stat 変換結果の文節数の取得 + anthy_get_segment_stat 文節に対する候補数の取得 + anthy_get_segment 候補の取得 +結果のコミット + anthy_commit_segment 変換結果のコミット +予測入力 + anthy_set_prediction_string 予測入力の文字列の設定 + anthy_get_prediction_stat 予測入力の状態の取得 + anthy_get_prediction 予測文字列の取得 + anthy_commit_prediction 予測文字列の確定 +逆変換 + anthy_set_reconversion_mode 逆変換モードの設定 +エンコーディング + anthy_context_set_encoding エンコーディングの設定 +その他 + anthy_print_context 変換コンテキストの内容の表示 + anthy_get_version_string Anthyのバージョンを取得する + anthy_set_logger ログ出力用の関数をセットする + +* 各関数の説明 * + int anthy_init(void) + 引数: 無し + 返り値: 0 なら成功 -1なら失敗 + anthy全体の初期化を行う。anthy_conf_override()以外の関数は + 初期化してから呼ばないといけない。 + + + void anthy_conf_override(char *var, char *val); + 引数: var 変数名 + val 値 + 返り値: 無し + *各変数については述べない。 + *anthy_initの前に呼ぶことによって、動作を変えることもできる。 + + + int anthy_set_personality(char *id); + 引数: var 変数名 + 返り値: 成功時には0、失敗時には-1 + *カレントpersonalityを変更する。最初にcontextを作成するまでに + 一度だけ設定できる。 + *使用できる文字はファイル名に使える文字と同じ + + + void anthy_quit(void); + 引数: 無し + 返り値: 無し + *Anthy library内で確保したメモリなどのリソースを解放する + *現時点では実装されていない + *アプリケーション終了時に呼出す必要は無い + + + anthy_context_t anthy_create_context(void); + 引数: 無し + 返り値: 作成したコンテキスト 失敗なら0 + *変換コンテキストを作成する。 + + + void anthy_reset_context(anthy_context_t ac); + 引数: ac コンテキスト + 返り値: 無し + *変換コンテキストをリセットする。 + + + void anthy_release_context(anthy_context_t ac); + 引数: ac コンテキスト + 返り値: 無し + *変換コンテキストを解放する。 + *このコンテキストはそれ以降使えない。 + + + int anthy_set_string(anthy_context_t ac, char *str); + 引数: ac コンテキスト + str 変換対象の文字列 + 返り値: 成功時には0、失敗時には-1 + *変換コンテキストに文字列を設定する。 + *そのコンテキストに関連するそれまでの情報は破棄される。 + *strはEUC-JPで与える。 + *漢字かな混じり文を渡した場合、各漢字を一旦ひらがなに変換した上で + 再変換を行う。 + + + void anthy_resize_segment(anthy_context_t ac, int nth, int resize); + 引数: ac コンテキスト + nth 文節のインデックス 0から始まる + resize 文節を何文字伸ばすか。 + 返り値: 無し + *文節を伸縮する。 + *resizeに負の数を与えることによって文節を縮めることができる。 + *無効な操作の場合は無視される。 + + + int anthy_get_stat(anthy_context_t ac, struct anthy_conv_stat *cs); + 引数: ac コンテキスト + cs anthy_conv_stat + 返り値: 成功の場合は0 + *現在のコンテキストの状態を取得する。 + *コンテキストに設定した文字列がいくつの文節に分割されたかを知ることができる。 + + + int anthy_get_segment_stat(anthy_context_t ac, int n, struct anthy_segment_stat *ss); + 引数: ac コンテキスト + n 文節の番号 0から始まる + ss anthy_segment_stat + 返り値: 成功の場合は0 + *現在のコンテキストのn番目の文節の状態を取得する。 + *その文節にいくつの候補があるかを知ることができる。 + + + int anthy_get_segment(anthy_context_t ac, int s, int n, char *buf, int len); + 引数: ac コンテキスト + s 文節の番号 0から始まる + n 候補の番号 0から始まる + buf 候補の文字列を取得するバッファ + len バッファの長さ + nにNTH_UNCONVERTED_CANDIDATEを指定すると + 変換前のひらがな文字列を得ることができる(再変換 + (anthy_set_string参照)を行なった場合、一度ひらがなに + 変換された文字列が対象となる) + 他にも次の候補番号が指定できる + NTH_KATAKANA_CANDIDATE カタカナの候補 + NTH_HIRAGANA_CANDIDATE 平仮名の候補 + NTH_HALFKANA_CANDIDATE 半角カナの候補 + NTH_HALFKANA_CANDIDATEに限り確定しても学習は行われない。 + 返り値: 失敗の場合は -1、成功の場合は文字数(nullは含まない)を返す + *s番目の文節のn番目の候補を取得することができる。 + *結果はbuf中に最後のnull terminateまで含めてlenバイトまで確保される。 + *もしbuf が nullであれば結果のコピーは行われない。 + (これを利用して確保すべきバッファのサイズを取得すると良い) + + + int anthy_commit_segment(anthy_context_t ac, int s, int n); + 引数: ac コンテキスト + s 文節の番号 + n 候補の番号 + *コンテキスト中のs番目の文節をn番目の候補で確定する。 + *すべての文節が確定したときに学習などがおこなわれる。 + + + int anthy_set_prediction_string(anthy_context_t ac, const char *str); + int anthy_get_prediction_stat(anthy_context_tm struct anthy_prediction_stat *aps); + int anthy_get_prediction(anthy_context_t ac, int nth, char *buf, int buf_len); + int anthy_commit_prediction(anthy_context_t ac, int nth); + + + int anthy_set_reconversion_mode(anthy_context_t ac, int mode); + 引数: ac コンテキスト + mode 逆変換のモード + modeには次の定数が指定できる。 + ANTHY_RECONVERT_AUTO 漢字が混じっている場合に逆変換を行なう + ANTHY_RECONVERT_DISABLE 常に順変換を行なう + ANTHY_RECONVERT_ALWAYS 常に逆変換を行なう + デフォルトではANTHY_RECONVERT_AUTOを指定した状態で動作する + 返り値: 設定されたモード + *指定したコンテキストの逆変換の利用方法を設定する。 + + + int anthy_context_set_encoding(anthy_context_t ac, int encoding); + 引数: ac コンテキスト + encoding エンコーディング + encodingには次のいずれかの定数を指定する。 + ANTHY_COMPILED_ENCODING (現時点では動作は不定) + ANTHY_EUC_JP_ENCODING EUC-JPを使用します + ANTHY_UTF8_ENCODING UTF8を使用します + 返り値: 設定されたエンコーディング + *変換コンテキストのAPI呼び出しに使用する文字列のエンコーディングを + 指定する。 + *デフォルトではANTHY_EUC_JP_ENCODINGが指定された状態で動作する + + + int anthy_print_context(anthy_context_t ac); + 引数: ac コンテキスト + 変換コンテキストの内容を標準出力に書き出す + 形式は実装依存 + + + char *anthy_get_version_string (void); + 返り値: Anthyのバージョンを表す文字列 + Anthyのバージョンを取得する + + + void anthy_set_logger(anthy_logger logger, int level); diff --git a/doc/MISC b/doc/MISC new file mode 100644 index 0000000..9d4347f --- /dev/null +++ b/doc/MISC @@ -0,0 +1,198 @@ +This document is written in Japanese. + +Anthy + +** 本ドキュメントの構成 ** +Anthyのドキュメントはパッケージの doc/ 以下に置かれ、 +ドキュメントの目次は doc/00INDEX にあります。 + + + +** 本ソフトウェアの構成 ** +Anthyは変換エンジンの機能などを持つライブラリと、それを利用 +するためのいくつかのコマンドなどから構成されています。 + + + +** 変換エンジンの構成 ** +Anthyはおおまかにわけて次の5つのモジュールで構成されています。 + *データ型モジュール src-diclib/ + *単語辞書モジュール src-worddic/ + *文節境界のモジュール src-splitter/ + *候補の順序の決定のモジュール src-ordering/ + *フロントエンド(変換コンテキストの管理等) src-main/ + +日本語にはある読みに対して複数の意味や品詞がある同音異義語が +多数存在します。これを扱うために、変換元の文字列(つまり同音の +文字列)を代表するためのデータ型を用意しています。 +このデータ型を用いたプログラムの典型的な流れを次に示します。 + +int n, i; + /* ある読みに対応するハンドルを取得する */ +seq_ent_t seq = anthy_get_seq_ent_from_xstr(yomi_string); + /* いくつの同音異義語が存在するかを取得 */ +n = anthy_get_nr_dic_ents(seq, NULL); + /* 各異義語に対して */ +for (i = 0; i < n; i++) { + /* 単語を取得する */ + anthy_get_nth_dic_ent_str(seq, NULL, i, &str); + /* 品詞を取得する */ + anthy_get_nth_dic_ent_wtype(seq, NULL, i, &wt); + .. +} + +同音異義語の中には同じ品詞のものや異なる品詞をもつものもあり、 +活用する単語の各種の活用形が含まれます。上記のプログラムでは +いくつの同音異義語があるかを取得したあとに、インデックスを用い +て各種の情報を取得しています。 + +かな漢字変換の各モジュールはこの辞書ライブラリからデータを +取得することによって動作します。次に各モジュールのおおまかな +構成を説明します。 + +Anthyライブラリの動作はユーザが変換前の(主に平仮名で構成される) +文字列を渡すことによって開始されます。変換の動作は文節の境界の +検出と候補の生成の2つにわかれます。 +文節の境界はユーザが変更することがあるので、境界検出モジュールは +ユーザが設定した境界を制約条件として動作します。最初に文字列を +設定した際にはこの制約条件は無い状態です。 +最初に文字列を設定した際に、文字列中の全ての部分文字列に対し +それが自立語かどうかをチェックして自立語ならば接頭辞や接尾辞 +付属語を追加したパターンが文中にあるかどうかをチェックして +struct word_listというデータ構造を構成します。 +どのような付属語が接続するかは自立語の品詞によって異なり、 +そのデータは定義ファイルに記述されています。 + +候補の生成は上の分割の際に与えられた品詞をもとにして +行われます。 + + +** 例文の利用 ** +パラメータ計算の際には例文を変換し、その際に変換結果だけでなく、グラフ中の +通過したエッジの情報も出力します。 +(文節区切りの際にはグラフの形はlatticeになります) +変換結果を正解と比較することにより、エッジの種類毎に正解になる確率および +誤変換になる確率を求めます。 +変換の結果が正解であればその分母と分子に加算し、誤変換であれば分母のみに +加算するという手法を取っています。 +ソースのディレクトリで make update_params を実行することで +例文の変換とパラメータの更新が行われます。 + + +** 文節区切りのアルゴリズム ** +分節の区切りは、基本的にはlatticeを構成し、スコアが最小となるパスを +viterbiアルゴリズムで検索することで行います。 +スコアは確率を基本としていますが、その他にも各種のバイアスをかけています。 + + +** 変換モジュールの構成 ** + +文節境界の設定 +(文節中の単語境界の検索) +候補の列挙 +候補のソート + + +*変換パイプライン ( コアは src-main/ 以下にある ) + context 変換コンテキスト + 文節境界の検出 ( src-splitter/ 以下にある ) + depgraph + metaword + evalborder + lattice + compose 文節構造の解析 + 候補の順序決定 ( src-ordering/ 以下 ) + candsort 候補の並びかえ + candhistory + commit + candswap + infosort + relation + personality パーソナリティの管理 +*辞書ライブラリ + conf グローバルな設定 + file_dic 辞書ファイル + mem_dic メモリ上の辞書 + record ユーザごとの設定 + alloc メモリアロケータ + logger + dic_session 辞書エントリのbook keeping + xchar 文字型 + xstr 文字列 + wtype 品詞 + ext_ent 候補の生成 + ruleparser 設定ファイルの解析 + dic_util 辞書管理プログラムのための関数群 + + +** seq_entについて ** +anthyではひらがな列(読み)に対応するデータ構造として、seq_entという +構造体を用います。この構造体はdiclibの中で管理されており、 +フロントエンド側からは適切なAPIでアクセスすることができます。 +seq_entは同音異義語の配列を持っています。 + seq_entの主要メンバ + * str: 読み + * id: 辞書中のインデックス + * seq_type: ST_ のフラグ + * dic_ents: 単語(or複合語)の配列 + + +** 辞書ファイルの形式 ** +辞書ファイルはエンディアンやバイナリフォーマットの異なるマシン間で +共有できるような形式とする。 +辞書のセクションは次のようなものがある +*ヘッダ +*辞書のエントリ +*辞書のエントリへのインデックス +*辞書のインデックス +*辞書のインデックスへのインデックス + + +** 辞書ファイルアクセスの手法 ** +複数の文字列の検索を同時に行うことで効率を高めることを狙っています。 +変換対象の文字列の部分文字列を列挙してソートし、それを辞書ファイル内の +ソートされた文字列と比較します。 +例えば、「わたし」という文字列を検索する際には部分文字列 +「わ」「わた」「わたし」「た」「たし」「し」を列挙し、それをソートした列 +「し」「た」「たし」「わた」「わたし」を辞書ファイルの最初から順に +スキャンします。 +ただし、システム辞書については、他の工夫も含めて検索の高速化を図っています。 + + +** デバッグの方法 ** +anthy-agentは標準入力でユーザとやりとりすることを +利用して次のようなスクリプトを書きます. +-- +#! /bin/sh + +anthy-agent <<EOF +aho +(space) + PRINT_CONTEXT +EOF +-- +このスクリプトを実行すると手元のanthyでは次のような出力が得られます. +-- +(2 ((UL) "あほ" -1 -1) cursor) +(3 ((UL RV) "アホ" 0 3)) +|あほ +あほ(アホ:(1N,256)22,485 ,阿呆:(1,256)22,357 ,あほ:(1N,256)22,229 ,): +-- +これはemacsでahoと入力して変換動作をする(スペースを押す)操作をしたあとで +コンテキストを表示するコマンドを入れています. + +出力の1行目と2行目はプリエディットの変化を表しています. +3行目と4行目はPRINT_CONTEXTの結果です. + + 文全体 -> |あほ + 一文節目 -> あほ(アホ:(1N,256)22,485 ,阿呆:(1,256)22,357 ,あほ:(1N,256)22,229 ,): + +各候補は 変換結果:(候補のタイプ,文節構造のスコア)文節のスコア +という形式をしています. + +anthyのソース中にはanthy_print_*() 系の関数がコメントアウトされている部分が +たくさんあるので,それを有効にして同じことをやると変換パイプラインでどんな +データが流れるかがわかると思います. + +ちなみに,デバッグプリントなどを有効にしてmake installすると +anthy.elとのプロトコルに反するので注意しましょう. diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 0000000..348a4b3 --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,3 @@ +EXTRA_DIST =\ + 00INDEX POS LIB SPLITTER DICUTIL ELISP GLOSSARY GRAMMAR\ + MISC ILIB DICLIB LEARNING TESTING GUIDE GUIDE.english protocol.txt diff --git a/doc/Makefile.in b/doc/Makefile.in new file mode 100644 index 0000000..30c8d56 --- /dev/null +++ b/doc/Makefile.in @@ -0,0 +1,322 @@ +# Makefile.in generated by automake 1.9.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = doc +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +ELISP_FALSE = @ELISP_FALSE@ +ELISP_TRUE = @ELISP_TRUE@ +EMACS = @EMACS@ +EMACSLOADPATH = @EMACSLOADPATH@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +GREP = @GREP@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +lispdir = @lispdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +EXTRA_DIST = \ + 00INDEX POS LIB SPLITTER DICUTIL ELISP GLOSSARY GRAMMAR\ + MISC ILIB DICLIB LEARNING TESTING GUIDE GUIDE.english protocol.txt + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu doc/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-libtool + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ + uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: @@ -0,0 +1,148 @@ +Anthyの品詞分類について。 + + +Anthyでは品詞をwtype_tという型で扱う +wtype_tは + *品詞(名詞、動詞、、) + *副品詞(名詞における地名、人名、、などの分類) + *副副品詞(人名の姓名、数字の位など) + *活用クラス(5段、上一、サ変、、) + *活用形(未然、連用、、) + *副活用形(品詞、活用形が同じものを接続で分類する) + *オプション(自立語かどうか?連体形が名詞化するか?など) +の7つのパラメータを含んでいる。 +各パラメータはワイルドカードとして +任意のものにマッチするものをとることができ、*であらわす。 +この7つ組の組み合わせのうち、いくつかは文字列による名前を +持っており、文法の定義の時などに使われる。 +例 + "名詞" -名詞-*-*-*-*-*- + "動詞未然形D" -動詞-*-*-*-未然形-デフォルト- +品詞の比較にはオプションを除く6つのパラメータを比較して +すべてのパラメータの対が等しい、もしくは比較の基準側がワイルドカード +であるときに対象側は基準側に含まれる。 + + +include/wtype.hに CC_??として、活用のしかたを分類してある。 +活用表は最後の数文字を見て、語幹と活用形がわかればよいので、 +上一段と下一段は統合して扱う(本当はcannadicの都合)。 + CC_NONE 無活用 + CC_K5 か行5段 + CC_C5 か行5段(行く or 逝く 「行った」という活用になる5段) + CC_G5 が行5段 + CC_S5 さ行5段 + CC_T5 た行5段 + CC_N5 な行5段 + CC_M5 ま行5段 + CC_B5 ば行5段 + CC_R5 ら行5段 + CC_L5 ら行5段(命令形が 「イ」「いらっしゃい」「おっしゃい」「ござい」など) + CC_W5 わ行5段 + CC_U5 乞う5段(「憩う」など、わ行とちがうのか?) + CC_KS1 上下1段 + CC_KV か行変格 + CC_SV さ行変格 + CC_ZV さ行変格 + CC_AJV 形容動詞 + CC_A 形容詞 + CC_A_U う音便の形容詞 + + +品詞(POS Part Of Speech)は以下のようなものが定義されている + POS_NONE 品詞不明 + POS_NOUN (E)(entity) 体言(名詞、数詞、代名詞) + POS_PRT (P)(particle) 助詞 + POS_XV (X)(auxiliary verb) 助動詞 + POS_V (V)(verb)動詞 + POS_A (A)(adjective)形容詞 + POS_AJV (D)(adjective verb)形容動詞 + POS_AV (B)(adverb)副詞 + POS_ME (M)連体詞 + POS_CONJ (C)(conjunction)接続詞 + POS_IJ (I)(interjection) 感動詞 + POS_PRE 一般名詞の接頭語 + POS_SUC 一般名詞の接尾語 + POS_INVAL + + +副品詞 + COS_NONE ワイルドカード + COS_CNPRE 地名の付属語 + COS_NNPRE 数詞の付属語 + + +副副品詞 + SCOS_NONE + SCOS_FAMNAME 氏 + SCOS_FSTNAME 名 + SCOS_T00 - SCOS_T39 + 32種類 + SCOS_T40(D2T35) + 動詞を名詞化させる接尾辞「(〜し)たて」 + SCOS_T41(N2T35) + 名詞であると同時に名詞の接尾辞「〜用」 + SCOS_A0 + SCOS_A1 + + +活用形 + CT_NONE + CT_SYUSI + CT_MIZEN + CT_RENYOU + CT_RENTAI + CT_MEIREI + CT_HEAD 語幹(形容詞、形容動詞のみ) + + +副活用形 +たとえば「動詞カ行5段未然形」は「書く」の場合には +「書か(ない)」と「書こ(う)」の2つ存在して、 +これらを区別するために副活用形を定義する。 +接続の種類ごとに分類しており、ある活用形でもっとも +一般的と思われるものはデフォルトとしてあつかう。 +動詞未然形の場合は + デフォルト(CST_DEFAULT) 5段 サ変 以外 + 「う」へ接続する5段 (CST_V_MIZEN_U) + 「ず」へ接続する5段 (CST_V_MIZEN_ZU) + 「し」 サ変 + 「せ」 サ変 + 「さ」 サ変 +の6種に分類される。 +デフォルトとワイルドカード + CST_NONE + CST_DEFAULT +動詞の未然形に対応するもの + CST_V_MIZEN_U 書こ う + CST_V_MIZEN_ZU せ ず + CST_V_MIZEN_SI し サ変 + CST_V_MIZEN_SE せ サ変 + CST_V_MIZEN_SA さ サ変 + (CST_DEFAULT) サ変 5段以外の未然形 +動詞の連用形に対応するもの + CST_V_RENYOU_5 書き ます + CST_V_RENYOU_TA 書い た + CST_V_RENYOU_DA 死ん だ +動詞の終止形に対応するもの +「たべよ」 とかいった文語的な命令 上下1、サ、カ変 + CST_MEIRE_ +形容詞連用形 + CST_A_RENYOU_NA 白くない + + +オプション + WF_NONE なにも無し + WF_INDEP 独立語 + WF_MEISI 連用形が名詞化する動詞 + + +これらの他に、読みに対するフラグを用意している + F_NONE + NF_FAMNAME + NF_FSTNAME + NF_UNSPECNAME + NF_NAME + NF_NUM + NF_CNAME + SF_JN + SF_NUM diff --git a/doc/SPLITTER b/doc/SPLITTER new file mode 100644 index 0000000..9dfa67b --- /dev/null +++ b/doc/SPLITTER @@ -0,0 +1,132 @@ +* 文節境界の検出モジュール(splitter)について * +(1)ソースファイル +(2)データ構造 +(3)文節の構造 +(4)付属語グラフの仕様 +(5)メタ文節の種類 +(6)素性 +(7)文節区切りのアルゴリズム + + +(1)ソースファイル +このモジュールはsrc-splitter/以下に置かれた下記の +ソースファイルから構成される。 + + *splitter.c + splitterのコンテキストの管理、インターフェース + *wordlist.c + 文節となりうる文字列を列挙してstruct word_listを構成する。 + *metaword.c + 構成された文節を組み合わせて、よりスコアの + 高いメタ文節struct meta_wordを作りだす。 + *depgraph.c + 付属語グラフの読み込み + 自立語に付属語をつけて、文節を構成する。 + *evalborder.c + 以前は文節の評価を担っていたが、lattice.cにより形骸化しつつある + 他のファイルと統合される可能性が高い + *lattice.c + ビタビアルゴリズムによって文節境界を見付ける + +splitterの内部のデータは wordborder.hに定義されている. + +(2)データ構造 +主要な構造体には次のものがある. + *word_split_info_cache + 一つの文にどのような部分文字列があるかを統一して扱うための構造 + meta_wordの集合を持つ. + *meta_word + 文節となりうる部分文字列を指す + word_listが指す文節と同じもの、その文節に記号などを加えたもの、 + 学習機能によるものなどが含まれる + *word_list + 文節となりうる部分文字列を指す + +(3)文節の構造 +Anthyでは文節が次のような構造をとると仮定している。 +自立語部 := 名詞 + | 接頭辞 名詞 + | 名詞 接尾辞 + | 接頭辞 数詞 接尾辞 +付属語部 := (付属語グラフで記述された助詞/助動詞などの列) +文節 := 自立語部 付属語部 +変換対象の文字列が与えられた際には、その文字列の部分文字列で +この仕様を満たすものを全て列挙する。 + +(4)付属語グラフの仕様 + +Anthyでは文節の境界を検出するために文節の +「接頭辞 自立語 接尾辞 付属語」という構成を仮定する。 +(付属語は活用語尾を含む) + +付属語の部分には助詞や助動詞が一定の規則にしたがって +並んでいるというモデルを採用する。 +このならびを次のように定式化する +「@ノード名 "そこに続く単語1" "そこに続く単語2" .. "..n" \ + @遷移するノード名1 @遷移するノード名2 .. @遷移するノード名m」 +ノード名がない場合(@のみ)は終端 + +{遷移の属性}{接続の強さ}@ノードの名前 +活用形 + 未然 Cz + 連用 Cy + 終止 Cs + 連体 Ct + 仮定 Ck + 命令 Cm + 語幹 Cg +品詞 + 動詞、助動詞 v +文節の形式 + 格助詞 Sk + 連体修飾語 St + 連用修飾語 Sy + 終端 Se + 付属後なし Sr (文節の情報を消したい時に使う) + その他の修飾語 Sf + +接続の強さ + なし NORMAL_CONNECTION + . WEAK_CONNECTION + : WEAKER_CONNECTION + +例) +動詞未然形のあとに「れる」「られる」が付属するということを +記述する場合。 +indepword.txtには +動詞未然形 @動詞未然形 +という記述をすることによって、「動詞未然形」という品詞のあとには +「@動詞未然形」というノード名のノードがくることになる。 +次にdepword.master もしくはそこからインクルードされるファイル中に +@動詞未然形 "れる" "られる" @ +という記述を行う。 +活用形を扱う場合には次のように記述する。 +@動詞未然形 "" @れる +@れる "れ" @ない @ず @ば +@れる "れる" S@ @とき + + +(5)メタ文節の種類 +メタ文節には次のようなものがある + *氏 名 + *連体形 体言 + *名詞 名詞 + + +(6)素性 +各文節には品詞と文節の形式(付属語グラフの仕様参照)の情報から素性(feature) +が設定される。 +この素性の組み合わせを元にして、文節の連接が正しい変換結果である可能性を計算する。 +文節クラスはinclude/segclass.h、 +遷移確率はsrc-splitter/transition.hを参照のこと。 + + +(7)文節区切りのアルゴリズム +まず与えられた文字列の中から自立語になりえる部分を列挙し、それに接頭辞、 +接尾語、付属語などをつけてword_listを構築する。 +この時に(6)の文節クラスを設定する。 +次に記号などの一語では文節になり得ない文字を処理したり、学習情報を用い +てmeta_wordを構築する。 +このmeta_wordを元に、識別モデルを用いて最もらしい文節の組 +み合わせを推定する。 +確定された文節の文節クラスは変換候補を決める際にも用いられる。 diff --git a/doc/TESTING b/doc/TESTING new file mode 100644 index 0000000..c374bae --- /dev/null +++ b/doc/TESTING @@ -0,0 +1,36 @@ +テストの方法 + +*変換精度を自動的に測定するのは困難であるが模索していく +*一般ユーザーの権限でテストできるようにする必要がある + +*簡単なテストであれば、emacs等のバックエンドであるanthy-agent +コマンドを用いて行なうのが便利です + anthy-agentのオプション + --dir + --dic + --conf + +*簡単にテストデータを流してみるためには、 +$ cd test +$ ./anthy --all + test/test.txtの内容が順に変換されます。 +$ ./anthy 1 + のように番号を指定して特定の文字列を変換することもできます + +*ruby経由で実行するためにはswigのインストールが必要です + sh test.sh -compile +でruby/anthyのモジュールをコンパイルし + sh test.sh +で変換テストを実行します。実際に動作するのはtest/test.rbです。 + +*環境変数を利用したデバッグ + ANTHY_ENABLE_DEBUG_PRINTになんらかの文字列が設定され、 + ANTHY_DISABLE_DEBUG_PRINTに何も設定されていないときにデバッグプリントが有効になります + + デバッグプリントを有効にして、 + ANTHY_SPLITTER_PRINTに文字を設定するとsplitterの各種データ構造が出力されます + w wordlist + m metaword + a A*node + i 自立語のタイプ + 1 1文節だけ境界検出 diff --git a/doc/protocol.txt b/doc/protocol.txt new file mode 100644 index 0000000..1fbb225 --- /dev/null +++ b/doc/protocol.txt @@ -0,0 +1,130 @@ +EGG との通信のプロトコル + anthy-agentコマンドに--eggオプションを設定して起動することで利用可能です。 + +挨拶 + greeting = server-name " (" version ") " options " :" string CRLF + server-name = string + version = 1*(DIGIT) + options = "[" string 1*(", " string ) "]" + +Command Semantics and Syntax + + context-desc = 1*( DIGIT) + ; context descriptor + + seg-no = 1*(DIGIT) + ; segment number (0 origin) + + candidate-offset = 1*(DIGIT) + + max-candidates = 1*(DIGIT) + + cand-no = 1*(DIGIT) + ; candidate number (0 origin) + + string = 1*<any CHAR excluding control characters> + + error = "-ERR" SP error-code SP string CRLF + + error-code = 1*( DIGIT ) + + success-with-number = "+OK" SP number CRLF + + number = 1*( DIGIT ) + + success = "+OK" CRLF + + segments = "+DATA" SP seg-no SP number-of-segments-removed SP + number-of-segments-inserted CRLF + 1*( number-of-candidates SP converted SP yomi CRLF ) + CRLF + + number-of-replaced = 1*( DIGIT ) + + offset = 1*( DIGIT ) + + number-of-segments = 1*( DIGIT ) + + converted = string + + yomi = string + + candidates = "+DATA" SP offset SP number-of-candidates CRLF + 1*( converted CRLF ) + CRLF + + number-of-candidates = 1*( DIGIT ) + + +1. コンテクスト生成 + Command: + command-new-context = "NEW-CONTEXT" parameters CRLF + parameters = *( SP expression ) + ; e.g. : Encoding specification, etc. + expression = var "=" value + var = 1*(ALPHA) 1*(ALPHA / DIGIT) + value = string + ; INPUT=UTF-8 OUTPUT=UTF-8 + ; INPUT=#106 OUTPUT=#106 + ; INPUT=EUC-JP OUTPUT=EUC-JP + ; INPUT=#18 OUTPUT=#18 + + Reply: + reply-of-new-context = error + / success-with-number + ; number: context-descriptor + +2. コンテクスト解放 + Command: + command-release-context = "RELEASE-CONTEXT" SP context-desc CRLF + + Reply: + reply-of-release-context = error / success + +3. 変換 + Command: + command-convert = "CONVERT" SP context-desc SP input CRLF + input = string + + Reply: + reply-of-convert = error / segments + +4. 変換結果コミット/キャンセル + Command: + command-commit-or-cancel = "COMMIT" SP context-desc SP do-cancel CRLF + do-cancel = "0" / "1" + ; 0 のとき確定。その他のときキャンセル。 + Reply: + reply-of-commit-or-cancel = error / success + +5.候補取得 + Command: + command-get-candidates = "GET-CANDIDATES" SP context-desc SP + seg-no SP candidate-offset SP + max-candidates CRLF + + Reply: + reply-of-get-candidates = error / candidates + +6. 候補確定 + Command: + command-select-candidate = "SELECT-CANDIDATE" SP context-desc SP + seg-no SP cand-no CRLF + Reply: + reply-of-select-candidate = error / success / segments + +7. 文節伸縮 + Command: + command-resize-segment = "RESIZE-SEGMENT" SP context-desc SP + seg-no SP inc-dec CRLF + inc-dec = "0" / "1" + ; "0" means increment, while "1" means decrement + Reply: + reply-of-resize-segment = error / segments + +8. 終了 + Command: + command-quit = "QUIT" CRLF + Reply: + no reply, connection will be closed by server. +-- |