OpenWnnの内部辞書解析

OpenWnnの内部辞書を解析したのでそのメモ

経緯

OpenWnnはオープンソースの日本語変換辞書でこの派生製品がそこそこ使われているようです。NicoWnnGというソースコードをダウンロードしていじりだしたのがきっかけ。

どうしても辞書に手を入れる必要があったので調べました。NicoWnnGだけで使うのであればJava側で辞書を持っても良かったのですが,速度や他への転用を考えて,内部辞書を解析することにしました。

オープンソースとは言いつつこの辞書に関しては,バイナリを16進数配列にしたものをソースコードにベタがきしたものしか公開されておらず,このバイナリ部分を自分で作るためのソースコードは見当たりませんでした。

10年くらい前のモバイルデバイスに使われていたらしく,その時に解析された結果がいくつかあり,このサイトを参考に,ソースとにらめっこしながらようやく解析が終了しました。

使っていないであろうコードも結構見受けられたのですがなんとか。多分100%わかっているわけではないのですが,とりあえずNicoWnnGに組み込んで動くところまでは終了しました。

仕様

ヘッダ
00000000-00000003:[NJDC]識別子
00000004-00000007:バージョン
00000008-0000000b:タイプ
0000000c-0000000f:データサイズ
00000010-00000013:extサイズ
00000014-00000017:max check用(使ってない?)
00000018-0000001b:maxlen check用(使ってない?)
0000001c-0000001f: 1c-1d:前品詞数,1e-1f:後品詞数
00000020-00000023:単語ブロックのアドレス
00000024-00000027:登録されている単語の数
00000028-0000002b:登録されている単語の数?
0000002c-0000002f:que size,データ領域の一つのブロックのバイト数
00000030-00000033:最後に編集した単語ブロックの位置, 未使用
00000034-00000037:Write Flag
00000038-0000003b:未使用
0000003C-0000003F:インデックス1のアドレス
00000040-00000043:インデックス2のアドレス

インデックス
インデックス1は読み、インデックス2は表記の昇順で、
単語ブロックの位置が2バイトずつ並んでいる
最後に2バイト00がついている

単語ブロック
00000000-00000000: 2bit fflag, 4bit mflag, 6-7bit type
00000001-00000002: 1-9bit 前品詞,10-16bit 読みバイト数
00000003-00000004: 1-9bit 後品詞,10-16bit 表記バイト数
00000005- :読み、表記が詰めて設定されている
文字コードはUNICODE

フッタ
[NJDC]識別子

変換方法

ソースコードはここに入れておきました。

writedic.cppが変換用プログラムです。
入力ファイルはタブ区切りで
よみ 表記
の順に並んでいることが必要です。

一ファイルは最大65535行まで。

作成したファイルをWnnJpnDic.hのdic_07_dataなどを作成し貼り付ける。
dic_dataにもdic_07_dataを追加。プログラムから出力されるサイズをdic_sizeの該当の場所にコピー。

コンパイル

コンパイルはAndroidStudioから行う場合には文字量によるがメモリが必要なので注意。AnroidStudioのメモリ量を増やしておく必要あり

 

こんな感じで内部辞書を新しくすることができました。

CPLUS_INCLUDE_PATH

Cabochaをローカルにインストールさいのメモ

共用環境だと何かライブラリをインストールする際にも自分のローカルにインストールする必要があります。その際にハマったのでメモ

mecab

cabochaはMecabを使用しますので予めインストールしておきます。

CRF++

まず、ライブラリをインストールします。こちらから最新版をダウンロードします。現在はCRF++-0.58が最新版なのでこちらをダウンロードします。その後インストールします

環境変数

環境変数を設定しておきます。これを設定しておかないとcabochaのコンパイル時に下記エラーが出ます。

環境変数

cabocha

次にcabochaをインストールします。こちらから同様に最新版をダウンロードします。現在では0.69です。

環境変数は.bashrcなどに入れておくと面倒がなくていいです

CentOS5.11へgcc-4.8.5をインストール

たまたま余っていたCentOS5.11のサーバにpython2.7.12をインストールし、pylabをインストールしようとするとエラー。

どうもOSが古いと色々問題があります。

そこでこちらを参考にGCCをインストールします

ダウンロード

以下のサイトからダウンロードします。とりあえず最新版をダウンロードしました。

コンパイル

環境設定

使う際には、環境変数に入れて使い分けます

C言語でStringBufferもどきを作成してみる

c言語は速いのはいいのですが、いかんせん標準ライブラリ群が貧弱な面は否めません。

文字列周りの処理だとC++のSTLあたりを使用すれば簡単ですが、純粋にCで簡単に作成してみました

  • string_buffer.h

  • string_buffer.c

実行してみます

  • main.c

  • 実行結果

Linuxでミリ秒まで取得

ansiのC言語で用意されているtime関数では現在時刻をミリ秒まで取得できません。そこでLinuxならではの取得方法の覚え書きです

gettimeofday関数を用いてミリ秒を取得します

以下のサンプルではミリ秒単位で現在時刻を取得し、2つの時間の差を求めています