初版作成: 2000年05月22日
sed script Ver. 1.14: 2001年11月11日
ドキュメント最終更新: 2001年11月11日
[トップへ]/[二つ上は: 親指シフト・メインページ]/
[一つ上は: オアシスからパソコンへ「移行」!]
目次
富士通ミドルウェアから発売されているWindows用日本語IME 「OAK for Windows」(以下,OAKと略)そしてその姉妹品である「Japanist」は,同社の専用ワープロ「OASYS」シリーズの愛用者にとっては,次のようなメリットをもった非常に魅力的な IME です。
このように「OAK for Windows」と「Japanist」は,「OASYS」専用機ユーザにとって,他にはない特長をもった日本語IMEなのです。けれども,かなり以前にOASYS専用ワープロからパソコンに「移行」した人の中には,パソコン移行後は OAK を使わずに他社製の日本語IME------例えばジャストシステムのATOKやマイクロソフトのMS-IMEなど------を使ってきた人がいます。そのようなユーザが OASYS風の操作性に郷愁を感じ(?)て OAK や Japanist を使ってみようかなと思った場合,あるいは,自分の勤め先が富士通関連企業になったりしたために(笑)会社のパソコンでは OAK を使わざるを得ないと言う場合,当然ながら,
という要求を持つことになります。ところが,
のです。たしかに,OAK・Japanist にはテキストファイルから辞書を読み込む機能はあります。しかし,他社製日本語IME辞書ツールが吐き出すテキスト辞書情報を,OAK・Japanist のそれに「変換」して読み込む機能が付属していないのです。これは OAK・Japanist の拡販という面からは明らかに欠陥ともいうべきことです。ゆえに,この件に関して,富士通ミドルウェア側の対応がなされることを希望します。
しかし,現に OAK・Japanist にその機能がない以上,ユーザ側で何とかしなくてはなりません。そこで ATOK を使いながらも OAK ユーザでもある私が,そのような「辞書移行ツール」が作れないものかトライしてみました。以下はそのレポートです。
なお,以下のレポートでは,OAK/Win と Japanist とを区別せずに OAK/Win のみ扱っています。筆者が試した限りでは OAK/Win V. 8 と Japanist V. 1 とではユーザ辞書コンバートの取り扱いに関する限り違いは認められませんでした。しかし,筆者が気づかないところでひょっとすると何らかの違いが存する可能性はあります。そのような違いに気づいた方は筆者までお知らせください。
調べてみたところ,次のようなことが判りました。
"$", "*"
という記号が付加される。しかし,この記号は削除しないとOAK側でインポートできない。
上の判ったこと4点のうち,最大の問題は2です。この品詞名の置換をある程度の精度で行うことができれば,辞書の移行は可能。しかし,エディタの置換機能で一つ一つ置き換えてゆくだけでは不十分なのです。というのも,後述の通り,一部の品詞名は他の品詞名をうちに含んでいるので,そのままただ置換しただけでは所期の効果が得られないことがあるからです。(なお,この件に関して,このページ末尾の「変更履歴」2000年05月25日 の項目を参照。)
問題はこの品詞名置換にどのようなツールを使うかですね。テキスト加工の達人なら,どんなツールを使うのでしょう?私には見当も付きませんが,いちおう今回は比較的導入が簡単な sed を使ってみることにしました。エディタで手動置換する場合でも,後述の sed スクリプトを参考にして,置換順序・手続きを考える必要があります。
なお,私がここで紹介する方法では,MS-DOSプロンプト(コマンドプロンプト)でのコマンドライン入力作業を行います。そのため,「MS-DOSプロンプトなんて使ったこともない」という人には,残念ながら以下の方法を試すのは困難と言えるでしょう。そういう方は,富士通ミドルウェア宛にでも「OAK/Winに他社製日本語IMEユーザ辞書の取り込みツールを付属させて欲しい」と要望メールを送りましょう。:-)
さて,今回紹介する方法では,Windows 環境で sed を使います。使う sed は Shift-JIS漢字コードに対応したものが必要です。幸いなことに,GNU sed を Win32 環境に移植したツールが,フリーソフトウェアとしてVectorで公開されていますので,それを活用しましょう。Thanks >谷本さん
私が試したところ,Cygwin の GNU sed では一部,正規表現でエラーが出ました。Cygwin の sed を使う際には,後述するようにスクリプトの一部をコメントアウトする必要があります。その場合,わずかながら,手動編集作業が必要となります。しかし,今回紹介する GNU sed /Win32 では問題ないようです。(※この注記,2000年05月25日 に修正・追加。)
このWebページ上の
●sed win32
GNU sed / Win32 Version ストリームエディタ
というリンクをクリックして,ダウンロード先へ移って下さい。
GNU sed のアーカイブをダウンロードしたら,これを解凍します。zip形式で圧縮された書庫ファイル(アーカイブ)となっています。これを展開して元のファイルを復元する(=「解凍する」と言う)には,書庫ファイルを取り扱える何らかのツール(アーカイバ・ソフト)を入手する必要があります。アーカイバ・ソフトの入手が必要な場合は,次のWebサイトを訪れて,ZIPアーカイブを解凍するソフトを入手して下さい。
解凍したら,まず readme.1st を読んでください。何か難しいそうなことが書いてありますが,sed
を使うだけなら,ダウンロードしたアーカイブに同梱の
sed.exe
をパスの通ったディレクトリ(フォルダ)にコピーするだけです。どこにコピーしていいか分からない人は,
sed.exe を c:\windows\command
にコピーする
(Windows 2000 なら,c:\winnt\system32 にコピーする)
とよいでしょう。
これで sed を使うための基本的準備はできました。このあと,sed
を使うには,「MS-DOS プロンプト」(or 「コマンド・プロンプト」)で,"sed"
とタイプするだけです。sed の基本的使用法はコマンドプロンプトで,
>sed --help[Enter]
※">"
はプロンプトを表す。[Enter]で Enter キーを打鍵する。
とタイプすれば,USAGE が表示されます。しかし,以下で使い方を示しますので,「ATOKの辞書をOAKに移行する」という目的達成のためだけなら,sed について詳しく知る必要はありません。
まず,以下の説明のために,次のように用語を定義しておきます。
手順の概略を示します。
それでは具体的に作業手順を紹介します。
まずATOKの辞書のうち,ユーザ辞書に含まれる「登録単語」と「自動登録単語」のみをATOKの「辞書ユーティリティ/一覧出力」の機能でテキストファイルに書き出します[*下の
TIP 参照]。このユーティリティの詳しい操作方法についてはATOKのヘルプでご確認ください。<(_ _)>
このテキストファイルが「ATOK辞書テキスト」となります。以下の説明では
atokdic.txt
という名前のファイルがこの「ATOK辞書テキスト」です。ご自分が分かりやすいように,一覧出力させる際にファイル名を付けて下さい。
"$"・"*"
という記号が付加されていることが分かります。ここで一つのアドバイスがあります:
この一覧テキストファイルをテキスト・エディタで開いたのち,登録単語リストすべてにざぁーと目を通してください。すると「自動登録単語」が数多く登録されているはずです。この「自動登録単語」の中には,場合によっていわば「変換ゴミ」のような語句断片がかなり混入している恐れがあるのです。もしそのような「ゴミ」が含まれていた場合には,手動でその「ゴミ」を一行ずつ削除することをお勧めします。というのも,ユーザ辞書に「変換ゴミ」が多く混入すればするほど変換効率が低下することが予想されるからです。(この
TIP は 2001年11月8日に追加)
具体的な作業は次の二段階に分かれます。
私が使用した sed の *原始的* スクリプトを以下に公開します。このスクリプトは,複製・転載・改変自由とします。どこかのパワーユーザが下記のスクリプトを参考に,きちんとしたコンバート・ツールを公開してくれることを期待します。
このスクリプト(=「ここから」「ここまで」と記した部分)を,クリップボード経由でテキストエディタに貼り付けて下さい。そののち,ファイル名を atok_to_oak (すべて小文字で拡張子なし)と付けて,スクリプトをファイルに保存して下さい。
ここで Cygwin の sed を使う場合,注意点が一つあります。(他方,他方,GNU sed /Win32 (マルチバイト拡張版)を使う場合には,次の「注意点」は無視してください。)
注意点(Cygwin の GNU sed を使う場合)
下記のスクリプト内コメントの■注意■という箇所に注目。Cygwin 付属の GNU sed を使う場合には,ハイフンによる「全角文字」の範囲指定が正常に機能しないようです。恐れ入りますが,Cygwin の sed をお使いの場合は,■注意■が示す1行をコメントアウトして下さい。GNU sed /Win32 (マルチバイト拡張版)を使った場合と出力ファイルを比較検討した結果,これ以外の点については正常に動作しているようです。
私は,Cygwin 1.1 (ネットインストール版) の GNU sed Ver. 3.02 がマルチバイト対応であるかどうかを知りません。私が試したところでは,インプットファイル・スクリプトファイルとも,文字エンコーディングを euc-japan(改行LF) とすることによって,ここで紹介するスクリプトも,■注意■が示す1行のほかは正常に走っているようです。この場合は,sed がはきだしたアウトプットファイルのエンコーディングを shift-jis に書き換えてやる必要があります。
なお,問題のコマンドをコメントアウトした場合,sed による置換作業後に, 「レコード冒頭が『かな』文字以外の登録語をレコードごと削除」するという作業を手動で行う必要があります。しかし,そのようなレコードはファイル先頭に集まっていますので,手動削除作業は簡単に行えます。
他方,今回使用した GNU sed /Win32 ではコメントアウトの必要はありません。
------ここから------ # atok_to_oak (ATOK-->OAK辞書コンバート用 sed スクリプト・ファイル) # # 作者:ソヤネン 2001年11月11日 Ver. 1.14 公開 # 原本公開場所: # http://homepage1.nifty.com/cura/oya/transporting_atokdic_to_oakwin.html # このスクリプトは「複製・転載・改変すべて自由」とする。 # #### まず,ATOK辞書テキスト・レコード末尾の"*", "$"を削除。 # 上述の通り,"*", "$"はそれぞれATOKの「ユーザ登録単語」と「自動登録 # 単語」に付加される接尾辞である。が,これを削除しないと OAK 側では # インポートできない。 s/\*$// s/\$$// # #### 先頭のヘッダを書き換える # ATOK辞書テキストファイル先頭行のヘッダ情報をOAKのものに入れ替える。 # ただし,あとで先頭が「かな」文字以外のレコードを削除するのでひと細工 # する。なお,次のコマンドは ATOK 10 以降でのみ有効。ATOK 10 未満では # ヘッダを手動削除する必要あり。また,ATOK 12 未満では辞書の違いによっ # このスクリプトではコンバートできない語彙がでる可能性もある……。 # s/^!!DICUT1.$/と登録単語ファイル V02.00/ # #### 次にATOK辞書テキスト・ファイル冒頭にある残りのヘッダを削除。 /^!/d # #### レコード冒頭が「かな」文字以外の登録語をレコードごと削除。 /^[^ぁ-ん]/d # ■注意■前行(↑)の sed コマンドが,Cygwin の GNU sed では # 正常に動作しないようです。Cygwin の sed をお使いの場合は, # 上の一行をコメントアウトしスクリプトを走らせたあと,出力ファイル # 先頭に集まっている該当レコードを手動削除して下さい。 # #### 先ほどひと細工したOAKヘッダを正しい形式に直す。 s/^と登録/登録/ # #### 改行文字だけの空行を削除。(Ver. 1.10 でようやく実行) /^$/d # # なお,「読み[tab]単語[tab]品詞名[改行]」という三つのフィールドで # 構成される各レコードのうち,品詞名のみを置換の対象とするために, # [改行]の直前にある文字列のみを置換対象とする。 # # 一部の品詞名は他の品詞名を内に含む。これは置換の際のトラブルの元。 # ところが,ATOKの品詞名は「後方一致」で検索する場合,別個の名前と # なるように工夫されていた!! さすがです > Justsystem_ATOK_team # (Ver. 1.04 で初めて気づく……) # #### 名詞・サ変動詞類 # (※注:OAK には「ザ変名詞」がない。← Ver.1.11訂正。 # Ver. 1.10まで「OAKには『ザ変動詞』がない」と誤って記述していた……。) # s/名詞$/一般名詞/ s/名詞サ変$/サ変名詞/ s/名詞ザ変$/サ変名詞/ s/サ変動詞$/サ変/ s/ザ変動詞$/ザ変/ # #### 固有名詞類 # 固有名類については,ATOKとOAKとで仕様がかなり異なる。 # とくにOAK特有の接頭語の取り扱いをどうすべきか判断に悩む。 # s/固有一般$/一般名詞/ s/固有人他$/人物{お\/ご}/ s/固有人姓$/姓/ s/固有人名$/名/ s/固有地名$/地名/ # 上(↑)を,s/固有地名$/地名(市町村つき)/ とするべきや?? s/固有組織$/組織名/ s/固有商品$/一般名詞{お\/ご\/数}/ # #### 動詞類 # (※動詞については「一段動詞」以外,品詞名は共通。) # s/一段動詞$/一段/ # #### 形容詞・形容動詞 (無理やり接頭語つき変換とする……) # s/形容詞$/シク活用形容詞{お}/ s/形容詞ウ$/ク活用形容詞{お}/ s/形容動詞$/形容動詞{お\/ご}/ s/名詞形動$/形容動詞{お\/ご}/ s/名サ形動$/形容動詞{お\/ご}/ s/形動タリ$/形容動詞{お\/ご}/ # #### その他の品詞 # s/単漢字$/接続なし/ s/独立語$/接続なし/ s/助数詞$/単位/ #### ------ここまで------
1で生成した「ATOK辞書テキスト」と,2-1で作成した
sed スクリプト atok_to_oak
とを同じディレクトリー(フォルダ)に置く(=コピーする)。以下の説明では D:\HOME というディレクトリー(フォルダ)になっています。この
D:\HOME の部分をご自分の実際の環境に合わせて読み替えて下さい。
MS-DOSプロンプト(コマンドプロンプト)を開いたら,>
のプロンプトのあとに正しくコマンドを入力して
D:\HOME
(=先に atokdic.txt
と atok_to_oak
をコピーしたフォルダ) へ移って下さい。参考までに,二つほどこのディレクトリー変更例を示します。斜体 で示した文字列が実際にプロンプトで入力するコマンドです。[Enter] のところで Enter キーを打鍵します。
- C:\WINDOWS から C:\HOME に移る場合の一例
- C:\WINDOWS>CD \HOME[Enter]
C:\HOME>- C:\WINDOWS から D:\HOME に移る場合の一例
- C:\WINDOWS>D:[Enter]
D:\>CD HOME[Enter]
D:\HOME>
下の画面の例では,まずCドライブからDドライブに移動しています。以下の作業はすべてこのディレクトリー(この例では
D:\HOME
)を作業ディレクトリーとして行います。
次に,以下のようにプロンプトでタイプして下さい。
sed -f atok_to_oak atokdic.txt > oakdic.txt
このコマンドによって,カレント・ディレクトリ(今の例では
D:\HOME)に oakdic.txt
が生成されます。インプットファイルが atokdic.txt
で,これはATOK12が吐き出したテキストファイルです。出力をリダイレクトして
oakdic.txt
というテキストファイルを書き出しています。この
oakdic.txt
が OAK 側で読み込むべき辞書ファイルとなります。
次に紹介する画面例は,Windows 98 のMS-DOS
プロンプト上で sed を実行している様子です。sed
スクリプトは 上の 2-1 で atok_to_oak
という名で保存したものです。
なお,上の sed スクリプトは,OAK辞書テキスト
oakdic.txt
の冒頭にある ATOK辞書用のヘッダを,すべて自動的に削除します。そして,OAK辞書用のヘッダに置き換えます。(削除後に改行文字だけが連続して残ってしまう問題は
Ver. 1.10 でやっと解決。(^ ^;;
)
- ATOK12のヘッダの例
- !!DICUT12
!!一覧出力
!!対象辞書;標準辞書
!!単語種類;登録単語(*) 自動登録単語($)
!!読み範囲;(読みの先頭) → (読みの最終)
!!出力日時;00/05/22 23:19
- OAK V6のヘッダの例
- 登録単語ファイル V02.00
なお,上の sed スクリプトは,OAK辞書テキスト
oakdic.txt
の先頭に集まっている「読みがかなで始まっていない登録単語」------すなわち「読み」が「数字」・「英字」などで始まっている「登録単語」を自動削除します。なぜなら,OAKでは「読み」の先頭1文字は必ず「ひらがな」である必要があるからです。ATOKから辞書移行する場合,「数字」や「英字」で読みが始まる単語が登録語に含まれている可能性があります。(なお,削除語に,「改行文字」だけの行が連続して残ってしまう,という問題は
Ver. 1.10 でやっと解決。)
最後に OAK の「辞書管理/抽出ファイルからの登録」によって,この OAK辞書テキスト"oakdic.txt"から登録を行います。 「抽出ファイルからの登録」ダイアログボックスの「ファイル名」で,上で作成した OAK辞書テキストのファイル名を絶対パスとともに指定してください。次の図は,"D:\HOME\"に保存された"oakdic.txt"を登録元ファイルとして指定している様子を示しています。
私の場合,この方法で1500語程度のユーザ登録単語を移行できました。
(=_=)
:-O
, 行削除に使用した。本来ならここでようやく
Ver. 1.00を名乗るべきでした……。
なお,今回は GNU sed for Win32 を使いました。上の方法を試される場合は,Shift-JIS漢字コード環境で sed が使える環境であれば大丈夫です。なお,私は Cygwin という Unix 環境を Win32 に移植した環境でも試行してみました。しかし,上述の通り,ハイフンによる文字範囲指定がうまく動作しません。しかし,この点をスキップさせれば,その他の点については GNU sed /Win32 と置換結果が同じとなることを私の辞書テキスト置換で確認しています。けれども,Shift-JIS コードへの対応は GNU sed /Win32 の方が優れているようですので,そちらを利用することをお薦めします。
以上,ご参考まで。