Top  > 雑記帳  > キーワード別  > Namazu/Kakasi

Namazu/Kakasiに関する雑記

  2002年02月19日(火)   多次元配列
だいぶテスト・プログラムが汚くなってきたので、一つのクラスにまとめてみました。よく考えるとJISの2面の処理をとばしていたので、それを入れ込むように作業中です。これまで 
 
CDMi *DMi01[94][94]; 
 
という1面用エリアを 
 
CDMi *DMi01[94][94]; 
CDMi *DMi02[94][94]; 
 
として拡張し、処理ルーチンにパラメータで渡そうとして、C/C++の基本的なところでつまづいてしまいました。 
 
func(DMi01); 
func(DMi02); 
 
と呼んで、[i][j]のように呼び先で使うには、受け側で 
 
func(CDMi * dmi[][94]) 
 
としなければいけないのですね。数でとばすために一番左側以外の[]には固定値が必要というのはわからないでもないですが、やっぱり見た目がきたないです。 
 
structやclassで渡せばいいのでしょうが、それだけのために作るのはよけいわかりづらくなるのでやめました。 
 
【今日の日経平均】 9,847 -246

  2002年02月18日(月)   「ヴ」
JISX 0213-2000にはあるのですが、JIS X 0208-1990ではひらがなの「ヴ」がありません。SKKの辞書ではひとつだけ 
 
しう゛ぁ  湿婆 
 
というように「う」と「゛」で表わしているものがありました(でも「湿婆」の意味はわかりません)。これは対象外としてみました。 
 
また、昨日までのプログラムにはミスがあり、 
 
ごぜん#じ /午前#1時/ 
 
のようなものも含めていました。これをはずすようにして今のところのエントリ数は、141,911個です。 
 
プールとオフセット型のバイナリ形式で出力するところまでできました。 
ソース→内部形式→テキスト出力で出したものと、バイナリ形式→内部形式→テキスト出力で出したものをバイナリ・コンペアして同じであるところまでは確認できました。 
 
【今日の日経平均】 10,093 +45

  2002年02月17日(日)   プールとオフセット
メモリ上に組み立てたSKKの辞書データをEUCで出力するルーチンを書きました。 
出力ファイルは141,931行で、サイズとしては2.5Mぐらいです。 
 
SKKの辞書は 
 
におu  /匂/臭/ 
 
のようになっています。 
「読み」と「単語」をそれぞれのプールにどんどん追加して、そのオフセットと長さで識別させるようにした場合、「におu」は読みのプールに一つだけ入れられて、「匂」と「臭」は別々に単語のプールに入ります。読みの方はいいのですが、例えば 
 
にんぎょう  /人形/ 
やまがた  /山形/ 
 
のような場合、そのままだと「人」から生える部分と「山」から生える部分は別なので、単語のプールには二つの「形」がダブって入ってしまいます。そこでこのダブリをなくすようにしてみたところ、全データに対する処理前の単語のプールは263,245文字だったのが、手当て後には182,385文字になりました。 
 
しかし、このプールとオフセット(と長さ)のしくみだと、全データをメモリに上げるならいいのですが、kakasiのように出会った単語の先頭の文字に対してオンデマンドで、(その文字につらなるエントリを)ファイルからロードするという方式には合いません。 
 
何かいい方法がないか考え中です。

  2002年02月14日(木)   奇数
一応multisetとvectorを使ってkanawadictのデータをメモリに整理することはできました。ただsizeof(vector)をしてみると32バイトも使っています。登録する単語のほとんどは24バイト(12文字)以内なので、一つの「読み−単語」用のエントリにvectorを二本はやすのは適切でない感じです。 
 
そこでそれぞれvectorのプールを作ってそこにどんどん溜め込み、エントリにはプールの先頭からのオフセットを持たせることにしました。溜め込んでゆく過程をsize()とcapacity()で見てゆくと、vectorが割れる様子がわかります。単語側のプールにすべてを入れ終わった状態で見ると440kぐらいなので、とりあえずreserve()で500kを指定してみました。 
 
そこまではいいのですが、最後のsize()を見てみると、これが何故か奇数です。単語がすべて2バイト文字であればunsigned charでとっているvectorのsize()が奇数ということはありえません。辞書のソースをあたってみると、次のような項目がありました。 
 
きづk  気付k 
 
単語側に送り仮名のkがついているのは間違いのような気がしないでもありません。(kakasi-2.3.4.tar.gzのkakasidict v 1.1.1.1 2000/03/04) 
 
それであらためてその辞書のソースを見てみるとkakasiの辞書はSKKというものの辞書を元に作られているようです。netで調べてみるとSKKとは漢字変換プログラムのようです。そこでSKK-JISYO.L(v 1.99 2002/01/30)というのをダウンロードしてみました。今度はこのソースからバイナリ形式の辞書を作るテストをしてみようかと思います。 
 
【今日の日経平均】 10,081 +112

  2002年02月13日(水)   kanwadict
とりあえずwin32用のkakasiと共に配布されているkanwadictという辞書をそのまま入力として辞書をどんなコンテナで実装するかのテストプログラムを書いてみています。内部でintで数を持っているところがあるので、リトルエンディアンの環境で実行するにはリトルエンディアンで作られた辞書を使わないとダメなのですね。 
 
kanwadictは先頭にインデックスとして96*96個のエントリを持っています。その中を調べてみると使用されているのは5,781で未使用部分が3,435エントリーあります。使用率は約63%です。 
 
これを[96][96]でとったエリアにガサンと持ってくるのは、処理のパフォーマンス的にはいいのですが、何となくもったいないなという感じがしないでもありません。ちなみに「読み−単語」として登録されている総数は121,787ペアでした。 
 
話は変わって、今日は久しぶりに自転車を掃除しました。今年になったら交換するといっていたタイヤは今日も交換しませんでした。冬になってからあまり走っていないのと、このところブレーキも鳴かずいい具合なのであまりいじりたくないということもあります。きっと来月には・・・ 
 
【今日の日経平均】 9,968 +90

  2002年02月09日(土)   全角ブランク
簡単な文でオリジナルのkakasiの実際の動きを見ています。 
分かち書きモード/入出力ともShift JISです。 
 
分かち書きは半角ブランクで区切られて出力されます。 
半角ブランクを[半]と表わすと、ひらがなと全角カナは別の種類として 
 
入力:これはワカチガキです 
出力:これは[半]ワカチガキ[半]です 
 
というようになります。で、ここに全角のブランク([全]で表わす)を入れてみると 
 
入力:これは[全]ワカチガキ[全]です 
出力:これは[半][全][半]ワカチガキ[半][全][半]です 
 
というようになります。これは全角ブランクを全角の英数字と同じ種類として扱っているからだと思います。例えば 
 
入力:I’ve[全]100[全]books. 
出力:I’ve[全]100[全]books. 
 
となります。見た目からすれば全角ブランクですでに区切られているものは半角プランクは入らない方がいいような気もします。ただ後でプログラムで使う時には分かち書きの区切り文字として半角ブランクがあった方がいいのかもしれません。どちらがいいのか少し考えてみたいと思います。 
 
本日の走行距離は昨日と合わせて11kmでした。

  2002年02月08日(金)   「を」
kakasiの分かち書きモードは主に「を」のハンドリングをしているようでした。だいたいの動きがわかったので、W2kで自分が使う部分を切り出してC++に整理してみようかと思います。 
 
今日は昨年の負け申告に行ってきました。今年から用紙が変わったのでけっこう時間がかかってしまいました。 
 
【今日の日経平均】 9,686 +102

  2002年02月07日(木)   「っ」
kakasiの漢字→ひらがな処理で「っ」を特別に扱っているのは、「っ」を一文字の送り仮名と見ずに、「っ」の次の文字までを送り仮名とするためのもののようです。 
 
「言う」→「言」+送り仮名「う」→「いう」 
「言って」→「言」+送り仮名「っ」+付加分「て」→「いって」 
 
また、「言い返す」の場合は「言い」の部分を辞書の「言」で送り仮名と共に拾い、「返す」の部分を辞書の「返」で拾うため、変換後は「いいかえす」と一語になると思われます。 
 
もし、この「っ」の特別処理がないと、「言って帰る」では「いっ」で止まってしまうので、「いっ|て|かえる」になるでしょう。それを「いってかえる」という変換にするために必要なのではないかと思います。 
 
実際に動かしてチェックすればすぐわかるのですが、まだしていません。昨日から引き続きどうも体調がよくありません。 
 
【今日の日経平均】 9,583 +162

  2002年02月06日(水)   ふらふら
ちょっと風邪っ気で体の節々が痛く、頭がふらふらします。 
 
kakasiは「漢字→ひらがな」の部分を読み終わりました。なんだか「っ」を特別な扱いをしていますが、これがなかったらどうなるかまではまだ考えが及びません。 
 
r[]は辞書にマッチした文字列以降(つまりマッチしなかった部分)を次のサーチ用にc[]の頭につめるためのバッファでした。 
 
【今日の日経平均】 9,420 -54

  2002年02月05日(火)   kakasi再び
うつらうつらとkakasi 2.3.4のソースを読んでいます。まずmkkanwa関係を見て基本辞書のフォーマットはわかりました。今はkakasi本体のはじめの方を見ているところです。ISO-2022形式のデータをさばくためのC0/GR/GL/G0/G1/G2/G3のハンドリングが面倒そうです。EUCとShift JISに限ってしまえば結構シンプルになるんだろうな、という気がします。 
 
まだ辞書引きのところにはいっていません。c[]とn[]はわかるのですが、r[]の役割がよくわからないな、といったところです。 
 
【今日の日経平均】 9,475 -156


さらに過去へ >