Extract_super_nipponica98

Posted on

背景・動機・目的・手法

背景

電子辞書の標準形式として EPWING なるものが存在する。多数の辞書データを EPWING で一元管理すれば、EPWING が閲覧できるビューアを用いての単語検索をスムーズに行うことができる。

動機

ここ最近、研究室内で辞書や大百科の電子版を EPWING に変換して emacs で閲覧することがプチ流行している。自分もスーパーニッポニカ 98年版の電子版を手に入れたので、いろいろいじってみようと思った。

目的

スーパーニッポニカ 98年版の電子版のデータを抽出し、EPWING 化してデータの参照をしやすくする。

手法

このサイトで、「小学館スーパーニッポニカ日本大百科全書+国語大辞典」をJIS X4081(EPWING)化するツールキット が配布されているので、利用させてもらおうかと考えた。

1998年総合版(Win) (→ noptyさんが スーパーニッポニカ 1998年総合版をEPWING化するで公開されているスクリプトで 変換できます) [2004/01/12]

しかし、上記サイトのリンクが切れており、当該のスクリプトを入手することができない。一方で、アーカイブ閲覧サイトなどを活用することで、テキスト情報だけは閲覧することができた。上記サイトには、スクリプト作成者の試行錯誤の記録が記されていた。この情報をもとにデータの抽出を試みる。

本文データ取り出し

本文のデータは bintxt.dat に含まれている。ただし、各バイトについて -1 のオフセットが適用されているため、そのままでは読めない。

with open('bintxt.dat', 'rb') as fin:
    bintxt = fin.read()

以下で、各バイトに +1 することで、オフセットの適用を戻している。(オフセット適用後 に 256 になる部分については、とりあえず 255 に揃えるようにした。自然に考えればその部分は 0 にすべきだったかもしれないが、まあ致命的な問題にはなっていないのでひとまずヨシとする)

bintxt2 = bytearray([x+1 if x < 255 else 255 for x in bintxt])

byte オフセットを戻す処理に結構時間がかかるので、処理後の内容を一旦保存する。

with open("bintxt.txt", 'wb', encoding='utf-8') as fout:
    fout.write(bintxt2)
with open('bintxt.txt', 'r', encoding='utf-8') as fin:
    text = fin.read()

処理後の中身をちらっと覗いてみる。ちゃんと日本語として読めるかたちになっている。
各単語は<H1><\H1>で区切られているようだ。

text[:1000]
'\ufeff=\x04\x01\x01<H1></H1>五十音図第一行第一段の仮名。平仮名の「あ」は「安」の草体から、また、片仮名の「ア」は「阿」の偏から変化してできたものである。万葉仮名では「阿、安、婀、鞅(以上音仮名)、足(訓仮名)」などが使われた。ほかに草仮名としては「阿」「愛」「悪」などをくずしたものがある。\n\u3000音韻的には、五母音の一つ/a/にあたる。東京語などでは、奥舌の[a]よりもやや舌が前寄りで、口の開きの大きい中舌広母音である。ア段長音の引き音節部分を、「おかあさん」「おばあさん」などのように表しもする。また表記上はアであっても、音の連なり方によって、「ピ[_ア]ノ→ピ[_ヤ]ノ」「バ[_ア]イ(場合)→バ[_ヤ]イ/バ[_ワ]イ」「オン[_ア]イ(恩愛)→オン[_ナ]イ」などと発音されたりする。\n\u3000なお「阿吽{あうん}の仁王」「阿吽の呼吸」などと使われる「阿吽」の「阿」は、悉曇{しつたん}12母音の初音で、物事の初めの意で用いられ、口を開いた形相や吐息をも表す。〈上野和昭〉\x1d\x03\x01\x01<H1></H1>佐藤紅緑{こうろく}作の少年小説。講談社発行の少年雑誌『少年倶楽部{くらぶ}』に1927年(昭和2)5月号から翌年4月号まで連載され、大衆児童文学における現代小説の達成を示した。貧しい家に生まれた青木千三少年が、友情に助けられながら向学心を貫き通すという筋に、金持ちの家に育った不良少年阪井巌{いわお}の純情と悔悟を織り交ぜたもの。美しい友情、立身出世主義、「艱難汝{かんなんなんじ}を玉にす」のモラルなど、紅緑の少年少女小説の思想がすべて典型的な形で表されており、当時の少年たちから愛読された。題名は旧制第一高等学校の寮歌による。〈上笙一郎〉\nリ\x03\x01\x01<H1></H1>山本茂実{しげみ}(1917―98)の記録文学。副題は「ある製糸工女哀史」。1968年(昭和43)朝日新聞社刊。72年新版刊行。野麦峠は飛騨{ひだ}(岐阜県)と信濃{しなの}(長野県)との国境にあり、明治中期から昭和初期まで飛騨の貧農の娘は、この峠を越えて岡谷の製糸工場にわずかな前借金で働きに行った。本書は、数百名に及ぶ元工女と関係者からの聞き取りに基づき、工女や「女工哀史」を生み出した農村と工場の実態、さらに原料繭{まゆ}を買いたたき、11、2歳からの工女を1等から50等くらいにランクづけして賃金に差をつけたり、罰金を'
contents = text.split("<H1></H1>")

csv に書き出してみる。内容量が大きいので、10分割する。(これでもまだ大きいが)

import pandas as pd
size = len(contents)
for i in range(10):
    pd.Series(
        contents[size//10*i:size//10*(i+1)]).to_csv(
        f"nipponica_{i+1}.csv", encoding='utf-8-sig', index=False)

ついでに分割しないverも書き出しておく

contents_df.to_csv("nipponica.csv", encoding='utf-8-sig', index=False)

まとめ

結果として、本文データは取り出せたものの、見出しを取り出すことができなかった。参考にしたサイトによれば、見出しのみを並べた BunIdx.dat なるファイルが存在するらしいが、手元の CD-ROM にはそのようなファイルはなかった。代わりに bindir/XXXidx.bin というファイルが、見出しを並べているような中身をしているのだが、その並び方の規則性が本文データと整合性がとれていないため、結合が困難となっている。