文書の過去の版を表示しています。


= FreeWnn

1. 概要 [2023-10-05]

FreeWnn は,1980 年代中盤に作成された,日本語変換エンジン.クライアントサーバモデルになっていて,Wnn サーバ (jserver) を立ち上げておいて,クライアントから変換要求を投げる.emacs の場合,egg/tamago を利用する.

論文など,長い文章を書く際,egg/FreeWnn のペアで書いていたため,ゆっくりと文章を考えたい場合,どうしてもこのセットを使いたくなる.今はもうほとんど使ってる人いないだろうな…

現在,インターネット上の FreeWnn に関する情報はかなり消え去りつつあり,よしだともこさんが残してくれている,http://www.tomo.gr.jp/FreeWnn/ こちらにかなりの情報が残っている状態.

2. 構造メモ [2023-10-16]

たまに把握した構造を書いておく場所:

  • jserver は,変換をつかさどるサーバ.TCP などで複数のクライアントからの変換を受ける.
  • クライアント実装はいくつか存在するっぽい.
    • uum は,FreeWnn の C ライブラリを用いた変換クライアント実装っぽい.jlib 内の関数を用いて jserver に接続する.
    • egg/tamago は,jlib 内の C 実装を何も使わず,全て elisp で書かれたクライアント.そう言えば,tamago v3 は C のライブラリがあって,v4 からは全て elisp と書いてある記事を見たことがある気がする.

3. 環境構築 [2023-10-05]

FreeBSD なら ports で,Linux なら少なくとも Ubuntu ではまだバイナリパッケージが提供されているので,そちらからインストールすると良い.

僕はサーバは基本的に FreeBSD を利用しているが,仕事では Windows を使わなければならず,Windows の中で Unix 的なコマンド環境を利用するなら,今は WSL1 or 2 を利用することになる.その際に Linux/Ubuntu を利用している.

ソースからコンパイルする場合,以下のように打っていけば多分コンパイルされると思われる.gcc などが必要といわれたら,適宜インストールすること.

% ./configure
% make 

3.1 jutil の準備 (Ubuntu) [2023-10-11]

Ubuntu の場合,atod や dtoa などの辞書を扱うためのコマンド群がパッケージに含まれていないので,自分でコンパイルする.ただし,make install までしてしまうと,パッケージで管理したい FreeWnn を上書きしてしまうことになるので,atod などのコマンドのみ <HOME>/bin 以下に入れておくと良い.

その際,atod/dtoa は hinsi.data ファイルを利用するようなので,ソース内の Wnn/jd/hinsi.data を利用すればよい.atod/dtoa を良く利用するならば,LIBDIR で指定されている /usr/local/lib/wnn/ja_JP/ 以下に hinsi.data をコピーまたはシンボリックリンクなどで読み込めるようにしておくと,コマンドを使うたびに hinsi.data を指定しなくて良くなる.

man は Wnn/man/ 以下に存在していて,各コマンドなどは,6.jutil の中に格納されている.ただし,man でインストールされることを前提としているため,単に less するだけだと読みにくい.man は roff とかいうフォーマットのため,整形ツールを通す必要がある.今は,UTF の時代なので,以下のようなコマンドである程度閲覧しやすくなる.

nkf -w atod.man | groff -Dutf8 -Tutf8 -mandoc -mja -E | jless -R 

-r/-R を less につけることで,色だったり強調表示が ESC のような化けた感じになるのを抑制できる.参考

4. 辞書 [2021-05-29]

FreeWnn のデフォルトの辞書は,いまどきの Google IME/Mozc や MS-IME のような豊富な辞書は入っていない.数万語程度.

4.1 Wnn4 の辞書

Wnn の辞書データの文字コードは EUC.各種ドキュメントには UJIS と書かれている.

インストール先:

  • 辞書データ
    • FreeBSD: /usr/local/lib/wnn/ja_JP/dic/pubdic
    • Ubuntu Linux: /usr/share/wnn/ja_JP/dic → 実態は /var/lib/wnn 以下.
  • コマンドインストール先
    • FreeBSD: /usr/local/bin/Wnn4/
    • Ubuntu: atod/dtoa などはパッケージではインストールされない.ソースからコンパイルすれば良い.

辞書変換ツール:

  • atod: ascii to dictionary.
  • dtoa: dictionary to ascii.
    % /usr/local/bin/Wnn4/dtoa /usr/local/lib/wnn/ja_JP/dic/pubdic/kihon.dic | nkf -w

4.1.1 フォーマット

$(SRC)/Wnn/manual/2.env/dic/ujis_dic に詳細が記述されている. Ubuntu では,man UJIS_DIC で表示された.FreeBSD の ports だとインストールしていないっぽい.FreeBSD 9.1 のころの ports では man ujis_dic があったようにも見える.詳細は subversion なりのレポジトリを追わないと分からない.

UJIS_DIC( )         UNIX Programmer's Manual          UJIS_DIC( )



名称

     UJIS形式辞書ファイル  —  UJIS形式辞書ファイルの形式

機能

     UJIS形式辞書ファイルは、バイナリ形式の固定形式辞書と登録
     可能形式辞書をUJIS形式で表現したものである。UJIS形式
     辞書ファイルと固定形式辞書,および登録可能形式辞書間の相互変
     換は、辞書ユーティリティを用いて行う。バイナリ形式に変換する
     場合、単語は読みでソートされていなければならない。UJIS辞
     書ファイルに対する語句の追加,削除,及び変更は、 vi 等のエデ
     ィタで行う。

     ファイルの形式

      \comment コメント (CR)
      \total   総頻度 (CR)
      \hinsi (CR)
      読み (SP) 単語 (SP) 品詞 (SP) 頻度 (SP)[ コメント ](CR)
      読み (SP) 単語 (SP) 品詞 (SP) 頻度 (SP)[ コメント ](CR)
      読み (SP) 単語 (SP) 品詞 (SP) 頻度 (SP)[ コメント ](CR)
        |      |         |        |
        |      |         |        |
        |      |         |        |
      (EOF)

     コメント
             辞書全体に付けられたコメントである。

     総頻度  辞書全体の頻度 ( その辞書が経験した単文節変換の回数
             ) である。 int 型。

     読み    単語の読み。256文字までの長さで、ユーザ辞書はひら
             がな・「ー」・半角英数字、固定形式辞書はひらがな・「
             ー」で逆順に表現する。なお、半角英字は大文字・小文字
             の区別をしない。ソート時の文字の大小関係は、「ー」・
             ひらがな・半角英数字の順である。

     単語    256文字までの半角文字・全角文字・外字など全ての文
             字表現が可能。スペース、改行文字などの制御文字は
             に続く2桁の8進数で表す。 \ に続く 0 以外の文字はそ
             の文字になる (\\ → \) 。

     品詞    品詞名で、直接表現する。
                 名詞
                 固有名詞
             品詞名は、 /usr/local/lib/wnn/hinsi.data 参照。

     頻度    各単語の頻度である。

     コメント
             512文字まで。




Printed 9/6/93          6 Septemter 1993                        1

実際に,computer.dic を dtoa すると,以下のようなデータが出てくる. \commentコンピュータ関連用語(pubdic) の間はタブが一つ.あーかいばアーカイバの間はタブが二つ入っていた.ただ,上記 man を見ると SPC と書いてあるのでもしかしたらスペースでも問題ないのかもしれない.

\comment        コンピュータ関連用語(pubdic)
\total  0
\hinsi

あーかいば              アーカイバ              名詞            1
あーかいぶ              アーカイブ              サ行(する)&名詞 8
あーきてくちゃ          アーキテクチャ          名詞            25
あーぎゅめんと          アーギュメント          名詞            6
あーてぃくる            アーティクル            名詞            1
あいこん                アイコン                名詞            37
あいてむ                アイテム                名詞            10
あいびーえむ            アイビーエム            固有名詞        1
あかうんと              アカウント              名詞            33
あきゅーむれーた        アキュームレータ        名詞            1
あきゅむれーた          アキュムレータ          名詞            1
あくせっしんぐ          アクセッシング          名詞            1

参考:

5. mozc の辞書の利用

mozc は,Wnn に比べれば圧倒的に新しく開発された変換エンジンであり,かつ,Google が開発したと言うことで,Web からの情報を集めた辞書を内包している. さらに,LinuxPlayers さんが作成された UT 辞書 というものが存在していて,Wnn 向けの辞書をちまちま探すよりも,変化してしまった方が良さそうな気がする.古い辞書たちは,5 万語,10 万語の辞書だが,mozc 標準の辞書で 100 万語超の辞書を内包している.UT 辞書も追加すれば 200 万語.圧倒的(に見える).

[2023-10-05] UT 辞書の公開内容が変化していた.色々言われてげんなりしたのかな…さっと見た感じ,以前より少し面倒になっているが,ちゃんと情報を追えば 100 万語レベルの辞書は得られると思う.

5.1 辞書の DL

LinuxPlayers さんのところからダウンロードしてもよいし,以下の mozc の github からダウンロードしても良いと思う.

https://github.com/google/mozc/tree/master/src/data/dictionary_oss

5.2 mozc 辞書の解説

Mozc の辞書は,以下のような形式になっている.

あせらん        835     45      7191    あせらん
あせらん        835     45      6254    焦らん
あせん  690     45      5677    あせん
あそばん        835     45      6923    あそばん
あそばん        835     45      5880    遊ばん
あそべん        690     45      6353    遊べん
変換前左文脈ID右文脈IDコスト変換後

左文脈 ID とは,文章があるときに左から見た時の品詞,右文脈 ID とは文章の右側,つまり後ろの文章から見た時の品詞,という考え方だそう.形態素解析エンジンの MeCab も同じような構造だそう.Mozc がそもそも MeCab を参考に作成されているということなのだと思われる.

ID がどの品詞を示すかは,id.def に記載されている.

参考:

5.3 mozc 辞書からの変換

左右文脈 ID を正確に理解できないため,左文脈 ID だけで変換してしまうこととした.

5.3.1 名詞

1847 から 1894 を名詞とする.

5.3.2 固有名詞

1916 から 1926 を全て固有名詞にしてしまう.

1916 名詞,固有名詞,一般,*,*,*,*
1917 名詞,固有名詞,人名,一般,*,*,*
1918 名詞,固有名詞,人名,名,*,*,*
1919 名詞,固有名詞,人名,姓,*,*,*
1920 名詞,固有名詞,地域,一般,*,*,*
1921 名詞,固有名詞,地域,一般,*,*,府名
1922 名詞,固有名詞,地域,一般,*,*,県名
1923 名詞,固有名詞,地域,一般,*,*,都名
1924 名詞,固有名詞,地域,国,*,*,*
1925 名詞,固有名詞,組織,*,*,*,*

この番号は,上記のように定義されていて,Wnn 側の地名人名に登録した方が良さそうな気もしたが,実際に内容を見てみると,以下のようになっており,変換結果の中に地名があれば 1920 のような番号が振られている模様.これはさすがに地名ではないので,最も広い固有名詞にしておくのが良いかな…と考えた.

にゅーよーくふう       1920    1944    7007    NY風
にゅーよーくへん       1920    1944    6716    NY編
にゅーよーくりゅう     1920    1944    6593    NY流
あいずしっき   1920    1847    7421    会津漆器
あいずちほう   1920    1847    7083    会津地方

5.3.3 変換

自分でスクリプト書いて,変換かけた.

<TBD>

参考:

5.3.4 Wnn 辞書へ変更

Wnn 形式のテキスト辞書が出来たら,Wnn の辞書形式に変換する.Mozc で使われてる辞書は当然ながら UTF-8 で様々な文字が使われているが,FreeWnn の内部コードは EUC のため,使えない文字が多く存在する.

UTF-8 から EUC への変換に nkf を利用したが,以下のようなオプションをつけることで変換できない文字が ? になるので,この文字で grep して変換できなかった行は消してしまった.ちなみに,gnu grep は EUC の文字コードのファイルをバイナリファイルとして処理できない.BSD grep は EUC のままで処理できるので,FreeBSD の人は明示的に BSD grep を利用するようにするとよい.

% nkf --fb-subchar -e mozc_koyu_meishi.txt > mozc_koyu_meishi_euc.txt
% /usr/bin/grep -v "?" mozc_koyu_meishi_euc.txt > mozc_koyu_meishi_noquestion.txt 

辞書が出来たら,atod をする.atod は何故か内部的に heap という形で使用メモリ量を制限する形になっている.これは Wnn のソースコードの include/jh.h の中で以下のように定義されている.エントリーと書いてあるが,行数のことである.つまり,7 万行までしか対応していない.30 年以上前に作られたコマンドなので,当時の PC のメモリ量を考えると必要な対応だったのかもしれない.…今でも,1000万語レベルでの登録などを考えたら,似たような仕組みは必要かもしれない.

#define MAX_ENTRIES 70000       /* default of max-entries for atod */

コードを眺めたり,atod を実行した時のヘルプを見ていたら,-s オプションの部分にちゃんと書いてあったのに気がついた.

Usage : /usr/local/bin/Wnn4/atod [-r -R -S -U -e -s maximum word count(default 70000) -P passwd (or -N) -p hindo_passwd (or -n) -h hi>
Input the ascii dictionary from stdin
-r is for creating dictionary with normal and reverse index
-R is for creating reverse (implies updatable) dictionary. (default)
-S is for creating static    dictionary.
-U is for creating updatable dictionary.
-e is for compacting kanji string.

もし,7 万行以上登録する場合は,事前に行数を調べてから登録すると良い.以下は 30万語超を登録するケース.

% cat mozc_ippan_meishi.dic | wc -l 
% /usr/local/bin/Wnn4/atod -s 310000 mozc_ippan_meishi.dic < mozc_ippan_meishi_euc_noquestion.txt

5.4 emacs からの利用

OS に応じて,フォルダに配置する.今回は,dic/mozcdic というディレクトリを作成して,dic ファイルを配置した.

  • FreeBSD: /usr/local/lib/wnn/ja_JP/dic/
  • Ubuntu Linux: /usr/share/wnn/ja_JP/dic/ → 実態は /var/lib/wnn 以下.

追ってないのだが,何故か Wnn 側の設定ファイルで辞書の登録はする必要がない.emacs から使うことだけを考えるなら,egg の eggrc という設定ファイルだけ変更すれば良い.50 行目程度のところに,以下のように追記すれば良い.

 (wnn-add-dict "mozcdic/mozc_ippan_meishi.dic" '("mozc_ippan_meishi.h") 1 nil t)
 (wnn-add-dict "mozcdic/mozc_koyu_meishi.dic" '("mozc_koyu_meishi.h") 1 nil t)

5.5 その他

あれ?変換した辞書って公開して良いのかな…?気が向いたらライセンスなどを確認してみるか…

品詞について分からなさすぎる,と思いつつ Web 眺めてたら,こんなのを見付けた.品詞を軽く説明してくれてる.今度読もう. https://yukinoi.hatenablog.com/

6. 現存ドキュメント

  • ソースコード内の日本語ドキュメント
    • FreeBSD でコンソールだけで取得する方法.もちろん ftp なりで取ってくるのでも問題ない.
      # cd /usr/ports/japanese/FreeWnn-server/
      # make fetch
      # cp /usr/ports/distfiles/FreeWnn-1.1.1-a021.tar.bz2 ~/tmp/
      # cd ~/tmp/
      # tar yxvf FreeWnn-1.1.1-a021.tar.bz2 
      # cd FreeWnn-1.1.1-a021/Wnn/manual/ 
    • intro には詳細に,Wnn V4 の挙動や辞書について記述されている.
freewnn.1697387724.txt.gz · 最終更新: 2023/10/16 01:35 by skk
文書の先頭へ
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0