Archive for 2010 年 1 月 3 日
mobipocketと英辞郎 for Kindle(4)
う~ん、意外とハマりこんでしまった感じはあるが、とりあえず一段落しそうだ。
英辞郎ver117辞書(unicode版)から、PDICによって吐き出されたCSVファイルの文字コードはUTF-16LEという文字コードになっている。素直にこれをPerlIOで読み込んでしまうことが、とりあえず先決。
すんなりと言うわけには行かなかったが、PerlIO::encodingを使って、読み込み時に勝手にコード変換してもらえば、あとは新たにやることはない。
はずだったが、そこに行き着くまでに、まずCVS_XSの入力部分を、前述の通り、CSV_XSマニュアルの冒頭にある enbeded newline 対応コードに変更した。これは、どうもunicode版のCSVにはCRコードが含まれていないように見えたからなのだが、どうもエディタのいたずらのようで、version52のShift-JIS版と同じようにCRコードは入っているようだ。
この変更のために、CRコードと言うか、意味部分の改行の扱いがちょっと変わったので、その対応を追加。
しかし、ハマったのは、そこではなくて、なんとShift-JIS版の変換においてのこと。
PerlIO::encodingを使うようにしたので、コード変換はスマートになったのだが、Shift-JIS版に含まれる「発音記号」の部分に、unicodeへ変換出きない外字が含まれているらしく、そのワーニングが画面にゾロゾロと出てしまい、煩わしいことこの上ないのだ。これをどうにかしようとして頑張ったのだが、結局はあきらめることにした。出力には影響ないようだし。
で、Shift-JIS版はいいとして、問題のunicode版から吐き出されたHTMLファイルであるが、mobipocket Creatorに喰わせると、HTMLのパースはうまく行くようなのだが、パースの最後で、
Error(index build): master record overflow (max=64k): aborting index build.
というエラーが200個ほど発生し、結局ビルドをあきらめてしまうという結果になる。
この時の語数は1,919,664個である。max=64kの意味が不明だが、とにかくこの語数を処理するのは無理らしい。ちなみに、先頭から1,500,000個で処理させると、諦めずにprcファイルをビルドしてくれる。で、念のために 1,500,001個目から最後までのファイルも作成して処理させてみたが、これも問題ない。
と、以上は前々回のアーティクルのコメントにも書いた、さらに次もコメントに書いたが、そもそも英辞郎辞書自体の語数が多くなりすぎている気がする。純粋にデータとして考えた場合、多ければ多いほどいいというのは、理解できるが、「辞書」と考えるとそこにはやはり何らかのフィルターが必要だろう。
で、気づいたのだが、そういえばPDICで見たときに「レベル」っていうのがアルジャーノン。と、閃いた~と喜んで調べてみたら、なんと、このレベルの値は、現在『アルク』によって策定された「SVL12000」なるランク付けにおけるレベル値になっているとのこと。その名の通り、12000語に、1から12の12段階のレベルを付けているのだ。って、逆に言うと、190万エントリーもあるけど、レベル分けされているのは、そのうちのたった12000語だけ…って。使えねーとしかいいようがない。
- WIKは、Words In Key の略なんです、実は。
WIK:2でビルどしたあとの様子。
あー、そうそうレベルの件を思いつく前、昨夜寝る前に思い立って試したのが、これもコメントに書いたが、見出し語が1語のみで成り立っているエントリーのみの抽出。実際、kindleでの使用を考えると、これだけでも事足りそうな気もする。確かに、idiomを全部切ってしまうと言うのは英辞郎辞書の数少ない『取り柄』をもぎ取ってしまうようなものではあるが、背に腹は変えられない。
あとは、見出し語の語数でフィルターを掛けるとか、その程度しか手はないような気がするが。
そういうわけで、UTF-16LEの入力に対応し、見出し語の語数で出力エントリーにフィルターを掛けるバージョンを落としておこうと思う。実のところ、ほとんど真面目にテストしていないのでkindle上に持っていった場合に不具合があるかもしれない。対応の約束はできないけど、なんか致命的に変なことがあったら教えて欲しいと思う。
Eijiro117.csv2html(バグっていたのでリンクを外しました、修正版はこちら)
おっと、使い方を忘れていた。
- 第1引数は、元になるCSVファイルのパス。
- 第2引数は、辞書の名前だが、ここに細工があって、WIK:nn という形式で抽出するエントリのキーの語数を指定できる。これがないと、全部取ってくるので、当然 version117とかだと、prcのビルドに失敗する。
- WIK:1を指定すると、270,647エントリー
- WIK:2を指定すると、1,061,544エントリー
- 第3引数は、CSVファイルの文字コード。117の場合は UTF-16LEを指定すること。shift-jisの場合はcp932を指定する。shift-jisの場合、発音記号の部分で「ユニコードにマップできないよ」エラーが大量に出力されるが、無視してよいと思う。
- で、肝心のHTMLは標準出力に吐かれるので、リダイレクトして好きな名前のファイルに保存すればOK。
コマンドラインは、こんな感じかな?
C:\xxxx> perl Eijiro117.csv2html.pl eijiro117.csv ejr117-WIK:2 UTF-16LE > ejr117-WIK-2.html
Plugin by wpburn.com wordpress themes