libchise解説

守岡知彦 / MORIOKA Tomohiko tomo @ kanji.zinbun.kyoto-u.ac.jp
2004年 6月 11日 (金) 17:44:01 JST


>>>>> In [chise-ja : No.00365] 
>>>>>	"江渡さん" = Kouichirou Eto <2003 @ eto.com> wrote:

江渡さん> メールが送られてなさそうな気がしたので再送してみます。

;; うむむ、要 moderate の場所に溜っていた江渡さんの記事を何も考えず承
;; 認してしまったので、だぶってしまいました。ごめんなさい。ところで、
;; もしよろしければ、address を変える度に登録し直すか、もう少し spam っ
;; ぽくない address にして頂けると幸いです。


江渡さん> libchiseを使ってみようと思ったのですが、Cygwinではconfigure
江渡さん> に失敗しました。
江渡さん>  checking how to run the C++ preprocessor... /lib/cpp
江渡さん>  configure: error: C++ preprocessor "/lib/cpp" fails sanity check
江渡さん>  See `config.log' for more details.
江渡さん> とのことですが、理由はまだよくわかっていません。

うむむ。


江渡さん> また、それとは別にlibchiseの使い方を解読してみましたので、そ
江渡さん> の結果を簡単に文章としてまとめてみました。間違いなどありまし
江渡さん> たら御指摘下さい。

ありがとうございます!

ちゃんとまとめるのをさぼってて、いつかやらなきゃと思って時々思い出した
ようにとか必要に迫られて断片的に書いてたのですが(LC2003 に書いたのが
最新か(^_^;)これを期にちゃんとまとめたいと思います。


江渡さん> ----------------------------------------------------------------------
江渡さん> * the hitchhiker's guide to the CHISE Library

江渡さん> ** DataSource関連

文字データを格納するためのストレージを抽象化したもの。

江渡さん> - CHISE_DS_open(type, location, subtype, modemask) openする。
江渡さん> type=>CHISE_DS_Berkeley_DB, subtype=>0, modemask=>0755
江渡さん> というのが定番で、実質的にはlocationを指定するだけ。

江渡さん> - CHISE_DS_close(ds)
江渡さん> closeする。

江渡さん> - chise_ds_foreach_char_feature_name(ds, callback(ds, name))
江渡さん> 素性の一覧に対するiterator.  directoryをなめて、それぞれのファ
江渡さん> イル名毎にcallbackする。ファイル名が%を含む場合はそれを
江渡さん> decodeしている。
江渡さん> CCSの一覧に対するiteratorはいまのところ存在してない。いらない?

;; s/素性/文字素性/

CCS は文字素性の一種なので要らないかなと思っているのですが、あった方が
良いですか?

もし必要な場合、組込み callback 関数みたいな感じで用意するという感じで
しょうか?

CCS とそうでない文字素性の差は、実装上、逆引表があるかどうかなので、で
きれば、任意の文字素性に対して on demand に逆引表を作ったり、逆引表の
有無に関わらず、逆引に関する一般的 API を用意したいと思ってるんですけ
ど。


江渡さん> ** 値
江渡さん> - CHISE_Char_ID
江渡さん> いわゆるchar_id。int。

;; これ、本当は 32 bit 以上の整数じゃなきゃいけないはずなので、それを
;; 明示した書き方しなきゃいけない気がするんですが、標準的にはどういう
;; のがよろしいでしょうか? > 識者の方


江渡さん> - CHISE_Value
江渡さん> いわゆる素性の値。BDBが返す値(DBT)そのまま。

;; うーん、ちゃんと抽象化したい。


江渡さん> - chise_value_size(s)
江渡さん> - chise_value_data(s)
江渡さん> - chise_value_to_c_string(s)
江渡さん> などによって値を取り出す。dataとto_c_stringは同じものを指し
江渡さん> ている。

;; chise_value_to_c_string は手抜き。ちゃんと NUL terminate するように
;; 直さないと。

;; S 式とか XML とかへの変換処理は chise_value_* として実装する予定。


江渡さん> ** Feature_Table関連
江渡さん> featureとは素性のこと。

江渡さん> - chise_ds_get_feature(ds, name)
江渡さん> dsからFeature_Tableをgetする。

江渡さん> - chise_feature_setup_db(feature, writable)
江渡さん> 実際にBDBをopenしている。書込み可能かどうかを指定する。
江渡さん> 下記のset, loadなどは内部的にこれを呼んでいるため、明示的に
江渡さん> 呼ぶ必要はない。

用例を見ると、

  if (chise_feature_setup_db (table, 0) == 0)
    読み込み可能な場合;

  if (chise_feature_setup_db (table, 1))
    書きこみ不可能な場合;

みたいな判定関数として使うようです。


江渡さん> - chise_feature_sync(feature)
江渡さん> bdbをcloseする。つまりHDDに書込みをする。

feature オブジェクトも閉じます(以後、そのポインタが差す先メモリ上の実
体はなくなります)。


江渡さん> - chise_char_set_feature_value(cid, feature, value)
江渡さん> char_idに素性をputする。

江渡さん> - chise_char_load_feature_value(cid, feature, valdatum)
江渡さん> char_idの素性をgetする。

江渡さん> 素性をgetするときは、このようにする。
江渡さん>  ft = chise_ds_get_feature(ds, "ideographic-structure")
江渡さん>  chise_char_load_feature_value(cid, ft, valdatum)
江渡さん> valdatumに値が返ってくる。値を取り出すにはchise_value_dataを使う。

江渡さん> - chise_ds_load_char_feature_value(ds, cid, name, valdatum)
江渡さん> これはそのshortcutで、上記と同等の操作をする。

江渡さん> - chise_char_gets_feature_value(cid, feature, dst, size)
江渡さん> load_feature_valueの発展形で、valdatumから値を取り出してc
江渡さん> stringにするところまでやってくれる。dstにはc stringがはいる。

文字素性値が size 以上なら失敗し、NULL が帰ります。


江渡さん> - chise_feature_foreach_char_with_value(feature,
				callback(cid, feature, valdatum))
江渡さん> あるFeatureTableが保持するchar_idの一覧に対するIterator.


江渡さん> ** CCS Table関連
江渡さん> CCSは、Coded Character Setの略である。いわゆる文字集合。

;; s/文字集合/符号化文字集合/

江渡さん> - chise_ds_get_ccs(ds, name)
江渡さん> CCS Tableをgetする。

江渡さん> - chise_ccs_setup_db(ccs, writable)
江渡さん> BDBをopenする。下記set, decodeが内部的に呼ぶため、明示的に呼
江渡さん> ぶ必要はない。

江渡さん> - chise_ccs_sync(ccs)
江渡さん> bdbをcloseする。つまりHDDに書込みをする。

CCS オブジェクトも閉じます(以後、そのポインタが差す先メモリ上の実体は
なくなります)。

江渡さん> - chise_ccs_decode(ccs, code_point)
江渡さん> code_pointに対応するchar_idをgetする。返り値がchar_id(int)。

江渡さん> ある文字集合からchar_idを取り出すにはこのようにする。
江渡さん>  ccs = chise_ds_get_ccs(ds, "=daikanwa")
江渡さん>  char_id = chise_ccs_decode(ccs, 364)

江渡さん> - chise_ds_decode_char(ds, "daikanwa", 364)
江渡さん> これはそのshortcut。

江渡さん> - chise_ccs_set_decoded_char(ccs, code_point, cid)
江渡さん> あるccsのcode_pointに、cidをsetする。

江渡さん> * libchise内部解説

江渡さん> - chise_ds_open_feature_table
江渡さん> get_feature_tableはcacheするだけで、実際にはここで
江渡さん> Feature_Tableを生成する。

江渡さん> - chise_ds_open_ccs_table(ds, ccs)
江渡さん> 同様に、ccsにおいてもこちらで実際にCCS_Tableを作っている。

江渡さん> ** Attribute_Table
江渡さん> Feature_Table, CCS_TableにおけるBDB関係の処理を共通化するた
江渡さん> めに、内部的にはAttribute_Tableを使っている。

;; 将来的には、このあたりの code は Berkeley_DB バックエンドとして分離
;; される予定。

江渡さん> - CHISE_Attribute_Table_open(db_dir, category, key_type,
				name, real_subtype, accessmask, modemask)
江渡さん> ここで、実際にBDBをopenしている。

江渡さん> - CHISE_Attribute_Table_close(db)
江渡さん> BDBをcloseする。

江渡さん> - chise_attribute_table_get(db, key, valdatum)
江渡さん> BDBから値をgetする。

江渡さん> - chise_attribute_table_put(db, key, value)
江渡さん> BDBに値をputする。

江渡さん> ** 値

江渡さん> - chise_format_char_id(cid, dest, len)
江渡さん> char_id(int)から、BDBにおける一文字を表す形式を生成する。
江渡さん> これはUTF-8でencodeし先頭に?がつく文字列で、この形式を
江渡さん> UTF-8-MCSと呼ぶ。正確には、コントロールcharacterや、いくつか
江渡さん> の特殊characterは、\でエスケープしなければならない。

Emacs Lisp における S 式表現と同様。

;; utf-8-mcs には S 式への符号化処理は含まれてないので、なんか別の名前
;; を希望したいです。UTF-8-ESE とか?

江渡さん> - chise_char_id_parse_c_string (key_str, key_len)
江渡さん> 上記のUTF-8-MCS形式の文字列をparseして、char_id(int)にする。

江渡さん> ** name.c
江渡さん> DataSourceはそれぞれのTableをhashに保持している。
江渡さん> name.cにおいて、hash tableを実装している。

;; 本当は hash 実装も違うの使えるようにしたいなあと思ってます。

-- 
===『幾千億の分子に分かれても ========================================
     決して忘れない。    
     この宇宙が終るまで』              守岡 知彦 (MORIOKA Tomohiko)
====================== Email: <tomo @ kanji.zinbun.kyoto-u.ac.jp> ======



More information about the CHISE-ja mailing list