Extract_super_nipponica98_2

Posted on

これの続き

見出しの抽出には未だ成功していないが、今回の分析でデータ構造の法則性を見出したので、あと一歩のところまで到達した。 前回とは違って試行錯誤している段階なので、今回は雑多なメモになっている。

見出しの抽出

見出しが格納されていると思われるデータの中身を確認する

見出しファイルの中身

見出しが格納されている(と思われる)ファイルは、 bindir/XXXidx.bin である。(XXX = 000,001,…,999)

with open('./bindir/000idx.bin', 'r', encoding='Shift-JIS', errors='ignore') as f:
    test = f.read()
    
print(test[:1000])
 PIK 0Tヘ あいすきねす 0クy 0z  あさくさこうえん 0タ[  あぺにんとんねる 0,「  あめかきひくり 0t揮  あめりかれんぽう 0(Z 04| あるごりずむ 0= 0{z 0カキ 0T_7 いこま 0ーv 0ノp 0。ノ  いそめらーぜ 08   いちげきかた 0,rハ 0甚ハ  いちにちだけのおうさま 0帆A いなげ 0\!  いなりやまやき 0シル  いのうえじゅんのすけ 0p! 0ナk 0,顎  いみずへいや 0g"  うぉーるふらわー 0XL. 0ネヲ うみのきせつふう 0/_  うらぎんひょうもん 0T/  うんもんしゅう 0トy0 0ー- 0雇ヒ 0@Hヨ  えべんきぞく 0系2  おーくす 0靺n 
 おおわじま 0エア  おきしけとん 0
> 00嘴  おたぎみちてる 0`>  おでゅっせうす 0LY 0T  0)? 0P*? 0怺Q 0徒 0p/A おばけきんた 0ーa  おんなのいえ 08ラ@  かいじょうきしょう 0oA 0クB  かさおかしょとう 0ィ
M  かなりあ 0ホA 0`nO  かほくよんだいぐんばつ 0避ァ  かもつほけん 04vA 
 かりわたし 0M  かろりんしょとう 0Pョ[ 0lリ 0賠0xE0潺R0ィER かんげんえん 0\ 0. 00E きがいはんしゃ 0U$0U$ きたむらいんてい 0Ha 00' きねやかつさぶろう 0`  きも 0] 0、埜0Tャq きゃざー 0ーT 0\ァ` 0d+t
 きゃんべる 0ヤY@ 0Hヤ` 0ャヤ` 0ミ3~ 0ヒ 0現  きんばくしけつ 0   きんゆうしじょう 0 l 0dl 0рl 0詰 0  くまもとけんかんきょうせんたー 0ミHn 
 くりとりあ 0ィ8o  くろしょいん 0d5p  くろべすいか 0 /シ  くろまくせいじ 0Lа  ぐらんどはーばー 0レ#0LQ ぐろほびゃく 0,}  こーぽらてぃぶじゅうたく 0、ォ  こうけいら
with open('./bindir/001idx.bin', 'r', encoding='Shift-JIS', errors='ignore') as f:
    test = f.read()
    
print(test[:1000])
 JT 7Fエ あうすてるりっつのたたかい 0Xヤ 0ネ 0,オr
 あかめふぐ 0、  あしかがもちうじ 0lエ 0ラ- 0p0 
 あめしすと 0. 
 あやべはん 0u  あらー 0クイ 0ィ  あらびあてつがく 0ケ 0@@   あわしま 0h 0フ 00  あんもにあすい 0p  いぎりすぐん 0 舊  いけだてるとし 0ャ4 
 いずみたく 04T3エv いっか 0ヤ専  いねのくろかめむし 0p  いぷしらんでぃす 0 " 0" 0$fk  いほうもんよ 06" 09 うぃーんほうがくは 0,ロャ  うすぺんすきーじいん 04o  うまびる 0リ/  えすてるそうごこうかん 0Xl1  えばんずびる 052  おいげのーる 0┏3  おうれつさきゅう 0 6  おおるりまだら 0	 
 おかっぴき 0俛= 0フテ 04U
 おくむめお 0傾> 0(gャ  おとことうか 0L゙  おにすげ 0t? 
 おびじょう 0フQケ  おやこどんぶり 0 かいがんしんしょく 0A 0サ  かいほうされたえるされむ 0|ウ  0(A 0ロ  かうなす 0l=B  かくうそうでんせん 0Еヨ  かくしゅがっこう 0sL 0ク 0ルヒ  かしゅう 0エM 0M 0|M 0P[ 0tケ 0D  かじわらへいぞうほまれのいしきり 0|ケ  かみさかせっか 0}P 
 かもいっき 0枯P 0鞜P 0l]ゥ  かようせいりんさんひりょう 0ハ( からおけ 0Q  かんこう 03 0\ 0T\ 0ク\ 0\ 0\ 0艸\ 0H\ 0ャ\ 0噂 0t噂 0ィテ\ 0臀 0] 0<@` 0タj 0挽ャ 0トコ 0dラ 00x04ャ2 かんぶりあき 0隱] 0娯  がいせき 0ー帰 0位 0、" がいせんもん 0x1 0t柊 0リ柊 0リサ 0@棒0tネq0、Ps がんめんとうがい 0ャi 0@UB 0/ 0Lケ 0xケ  きぷれんすきー 0エ^`  きゅうむいん 0靺n 

000idx.bin, 001idx.bin の2つを見てみた。
000idx.bin では、 PIK, あいすきねす, あさくさこうえん, …
001idx.bin では、 JT, あうすてるりっつのたたかい, あかめふぐ, …
という単語群がそれぞれ確認できる。単純に五十音順に単語が並べられているわけではなく、行列を転置したような配置になっている(?)ようだ。

さらに 999idx.bin を見てみると、

with open('./bindir/999idx.bin', 'r', encoding='Shift-JIS', errors='ignore') as f:
    test = f.read()
    
print(test[:1000])
	 4Hクラブ 0p「d
 ALGOL 0H> 0タM7 DDR 0T¶ 0X濁 
 あたみうき 0ヤ専 & ありすとてれすそのはってんしのきそづけ 0ィァ  あんぜんどうかせん 0摂  いーえむぴーけいろ 0ャ2 0XトF いーやん 01  いおんぽてんしゃる 0ミ  いぎりすづみ 0縡 いずみのかみ 0臣シ 
 いちむらざ 0  0蔟  0H1  いりふぺとろふ 0悴"  いんおうごぞく 0h8# 0ャ# 
 うぃらぽな 0*  うみがらすとう 0紜  うわばだいち 0HK0 0D 0%
 えかんばん 000 00mィ  えきしんせっしゅう 0h?シ  えくせるしおーる 0(:V えぐなー 0@%1  えじぷとえんせい 0<G1 0pテ えりすた 0|ォ2  えんかかるぼにる 0(BD えんこうどう 00=3 0鐚 0Dd8
 おうけんし 043 0是  おうせいじゅう 0%シ  おおつたしま 0  おおむらますじろうぞう 0P曁  おかもとはじめ 0X=  おしちや 0l> 08- 0lッB おちゅうどでんせつ 0?  おふれこ 0ネ゙?  おろちご 0察 0Hム  おんぱ 0 ロ@  かいたて 0Xrュ  かけじく 0ミL 08レL  かさんどろす 0錚M 0茫N 
 かてんそう 0
O  かにざ 0ィ{O 0,
7 かめむしたまごくろばち 0t" からかさたけ 0P	Q  かりん 0p「Q 0$ 0LE かわうえ 0トシ[ 0ツ[ 0テ[ 0hテ[ 0フテ[  かんさきかん 0キa  かんじき 0ケ\ 0!ク 0dレ 0鞳s かんぜんじかはっこう 0TO  かんり 0ト秕 0(緇 0タ$z 0怏  かんりゅうぼいらー 0$] 
 がすけっと 0 ソM 0tm きかじん 0クH^ 0` きぎょうせきにん 0ィl^ 
 きくむぐら 0`楚 
 きしりょう 0 ーo きじゅんかたろぐ 0#  きっくぼくしんぐ 0、コ_ 0リ 
 きょうりし 0<Lq きりすと 0ーョ 0qk 
 きん

今度は 4Hクラブ, ALGOL, DDR, あたみうき, ありすとてれすそのはってんしのきそづけ, … という単語群が確認できる。五十音順に並んでいる傾向は同じだが、今度はその特徴的な形が気になった。
それは、何らかの規則に従って改行がなされていることだ。やはり XXXidx.bin は行列の形で格納されていると推測できる。
表にすると以下のようになるだろうか。

000idx.bin001idx.bin999idx.bin
--4Hクラブ
PIKJTALGOL
--DDR
あいすきねすあうすてるりっつのたたかいあたみうき
あさくさこうえんあかめふぐありすとてれすそのはってんしのきそづけ

しかし、それぞれがどの行に対応するのかまでは良く分からない。 UnicodeDecodeError を回避するため、 open の引数に errors='ignore を雑に付けてしまったことで、改行文字が正しく認識されず、表示が崩れてしまっているのかもしれない。

with open('./bindir/999idx.bin', 'r', encoding='Shift-JIS') as f:
    test = f.read()
    
print(test[:1000])
---------------------------------------------------------------------------

UnicodeDecodeError                        Traceback (most recent call last)

<ipython-input-6-ca972ddd9bc4> in <module>
      1 with open('./bindir/999idx.bin', 'r', encoding='Shift-JIS') as f:
----> 2     test = f.read()
      3 
      4 print(test[:1000])


UnicodeDecodeError: 'shift_jis' codec can't decode byte 0xf7 in position 153: illegal multibyte sequence

見出しの順番と本文の順番の関係性

アイスキネス という単語が、本文のどのあたりに登場するのかということと、登場した前後の文章を確認する。

with open('./bintxt.txt.utf8-bom.txt', 'r', encoding='utf-8') as f:
    contents = f.read()
start = 0
end = len(contents)
indice = []
word = 'アイスキネス'
while contents.find(word,start,end) != -1:
    idx = contents.find(word,start,end)
    indice.append(idx)
    start = idx+1
    
    
width = 200
for idx in indice:
    print(idx)
    print(contents[idx-width:idx+width])
    
49427
た}陰流、タイ捨{しや}流など多くの分派を生み、全国に広がった。〈渡邉一郎〉<H1></H1>生没年不詳。紀元前5~前4世紀ごろのギリシアの哲学者。アテネの人。ソクラテスの徒で、「ソクラテス対話篇{へん}」を書いた。『ミルティアデス』『カリアス』『アクシオコス』『アスパシア』『アルキビアデス』『テラウゲス』『リノン』の七編があったらしいが、わずかの断片が伝わるのみである。プラトンによれば、アイスキネスは、ソクラテスの裁判にも、死にも立ち会っている。なお、弁論家のアイスキネス(親マケドニア派でデモステネスの論敵)、およびナポリのアイスキネス(前2世紀のアカデメイア派の哲学者)は別人である。〈田中享英〉W<H1></H1>(前390ころ―前330以後)古代ギリシア、アテネの政治家、雄弁家。貧家に生まれ、悲劇役者や官吏として生活していたが、やがて政界に進出し、紀元前348年以後、ア
49464
〉<H1></H1>生没年不詳。紀元前5~前4世紀ごろのギリシアの哲学者。アテネの人。ソクラテスの徒で、「ソクラテス対話篇{へん}」を書いた。『ミルティアデス』『カリアス』『アクシオコス』『アスパシア』『アルキビアデス』『テラウゲス』『リノン』の七編があったらしいが、わずかの断片が伝わるのみである。プラトンによれば、アイスキネスは、ソクラテスの裁判にも、死にも立ち会っている。なお、弁論家のアイスキネス(親マケドニア派でデモステネスの論敵)、およびナポリのアイスキネス(前2世紀のアカデメイア派の哲学者)は別人である。〈田中享英〉W<H1></H1>(前390ころ―前330以後)古代ギリシア、アテネの政治家、雄弁家。貧家に生まれ、悲劇役者や官吏として生活していたが、やがて政界に進出し、紀元前348年以後、アテネの親マケドニア派の代表者となった。前346年には、フィロクラテスととも
49497
リシアの哲学者。アテネの人。ソクラテスの徒で、「ソクラテス対話篇{へん}」を書いた。『ミルティアデス』『カリアス』『アクシオコス』『アスパシア』『アルキビアデス』『テラウゲス』『リノン』の七編があったらしいが、わずかの断片が伝わるのみである。プラトンによれば、アイスキネスは、ソクラテスの裁判にも、死にも立ち会っている。なお、弁論家のアイスキネス(親マケドニア派でデモステネスの論敵)、およびナポリのアイスキネス(前2世紀のアカデメイア派の哲学者)は別人である。〈田中享英〉W<H1></H1>(前390ころ―前330以後)古代ギリシア、アテネの政治家、雄弁家。貧家に生まれ、悲劇役者や官吏として生活していたが、やがて政界に進出し、紀元前348年以後、アテネの親マケドニア派の代表者となった。前346年には、フィロクラテスとともにマケドニアへ赴き、現状維持を基調とした平和条約をフィリッポス二世
7028172
)によってπは超越数であることが証明されたため、円積問題は作図不能であることが示された。[@0010034000→作図不能問題@]〈菅野恒雄〉6	<H1></H1>多数の人の前で自分の意見や主張を述べる方法。古代ギリシア・ローマ時代に発達した。弁論術の大家としては、ギリシアの哲学者ゴルギアス、その弟子でアテネの法廷演説家イソクラテス、イサイオス、イサイオスに修辞を学んだデモステネス、その論敵のアイスキネスなどがあげられる。ローマではキケロ(そのカティリナの陰謀を摘発した演説はとくに有名)、カエサルの追悼演説に雄弁を振るって人望を集めたマルクス・アントニウスなどがいる。このような雄弁術は、ポリス(都市国家)における古代市民の自由から生まれたもので、アテネにもっとも多くの演説家が出たが、帝政の成立とともにこのような演説はとだえ、中世では説教がそれにかわった。議会制度がおこると議会の政治演説
items = contents.split("<H1></H1>")

たとえば「弁論家のアイスキネス」という単語を含む本文データは、102番目(0-index では 101番目) に格納されていることがわかる。

for i, item in enumerate(items):
    if '弁論家のアイスキネス' in item:
        print(i)
        break
101

一方, 000idx.bin では アイスキネス よりも先に出現していた、 PIK はというと、

start = 0
end = len(contents)
indice = []
word = 'PIK'
while contents.find(word,start,end) != -1:
    idx = contents.find(word,start,end)
    indice.append(idx)
    start = idx+1
    
width = 700
for idx in indice:
    print(idx)
    print(contents[idx-width:idx+width])

for i, item in enumerate(items):
    if 'PIK' in item:
        print(i)
        break
44676726
的過剰生産恐慌の構成部分としての循環性農業恐慌とは区別さるべきである。「1920~30年代農業恐慌」は、生産力基盤と産業循環の性格のそれぞれ相異なる1920~23年、1929~33年、1937~39年の、それぞれの循環性農業恐慌の総称と理解さるべきである。
 しかし、恐慌論的には農業恐慌を循環性農業恐慌と把握すべきことから、農産物過剰問題を循環性の全般的過剰生産恐慌一般に埋没させてはならない。国家独占資本主義的農産物過剰は、とくに第二次世界大戦後は、もはや一般経済恐慌の一構成部分としてはかならずしも現れず、むしろ構造的過剰として現れるからである。恐慌回避のための価格支持制度が内訌{ないこう}的に農産物過剰を累積させるというメカニズムが形成されているからにほかならない。
 また、農産物過剰の一時的解消によって農産物過剰のメカニズムがなくなったかのように考えてはならない。価格支持制度によって累積されていたアメリカの農産物過剰が1972年の世界的「食糧危機」を契機に、「作付制限」を全廃するほどまでに解消し、「世界のパン籠{かご}」を目ざしてアメリカ農業は70年代の黄金時代を迎え、輸出の増大によって農産物過剰は過去のものとなったかにみえた。アメリカの小麦輸出量は70年の1840万トンから81年には4461万トンと、2倍半近くに増大し、大豆も同じ期間に1156万トンから2527万トンと2倍以上に、トウモロコシは70年の1644万トンから80年の5937万トンへと実に3.6倍もその輸出量を増加した。しかし、82年にはアメリカの農産物過剰はだれの目にも明らかとなり、83年には大規模な減反計画PIK(Payment in Kind 政府の減反計画に協力する農民には生産調整奨励補助としてCCC〈商品金融公社〉から現物で支払われる)計画が大統領権限で実施され、さらに引き続き価格支持率引下げをねらいとしたFood Security Act of 1985(食糧安全保障法)によって農産物過剰に対処しようとしている。ECの農産物過剰、一部発展途上国の農業生産の増大などと相まって、80年代にはふたたびアメリカをはじめとする主要資本主義国の農産物過剰問題が深刻化している。[@0006393600→恐慌@]〈常盤政治〉
m<H1></H1>農地改革により創設された自作農民の農業経営を不慮の災害から守る目的をもって、1947年に制定された農業災害補償法(昭和22年法律185号)に基づき運営される農作物共済・蚕繭{さんけん}共済・家畜共済・果樹共済・畑作物共済・園芸施設共済・任意共済の各共済保険事業を総称したものが農業共済制度である。この制度では、農村の相互扶助思想を基調とした農業共済組合が農家を組合員として市町村単位に設立されている。加入農家は、一定の共済掛金を支払って組合との間に共済関係を結び、不慮の災害により被害を受けた場合、農業共済組合から支払われる共済金により損害が填補{てんぽ}されるのである。農業共済組合に集まった掛金だけでは組合員に対して共済金支払いの責任を果たしえないので、農業共済組合が都道府県単位に集まって農業共済組合連合会を組織し、各農業共済組合の負う共済責任の一定割合をこの連合会に保険する仕組みをとっている。しかし、数県にまたがるような大規模な農業災害が起こ
65235

かなり後方の、65236 番目の見出しに相当する本文で登場していることがわかる。(この見出しはおそらく、 農業恐慌 である。)
これは本文が存在しない見出しであろう。つまり、リンクのみ貼られている見出しである。 PIK の場合は 農業恐慌 へのリンクのみが記載されているのだと思う。

ちなみに参考にしたサイトによると、 バイト列 0x01 の4連続の並びが「リンクだけ項目」を表しているらしい。ただし、そのサイトでは見出しを格納したファイルの名前は BunIdx.dat であるらしく、自分の手元にあるのとは違う。

バイト列の解析

Shift-JIS では、 PIK は、 826f 8268 826a で表される。

with open('./bindir/000idx.bin', 'rb',) as f:
    test = f.read()
    
print(test[:100])
b'\x06\x00\x82o\x82h\x82j\x01\x000T\xcd\x14\x01\x0c\x00\x82\xa0\x82\xa2\x82\xb7\x82\xab\x82\xcb\x82\xb7\x02\x000\xb8y\x0f\x000\x1cz\x0f\x00\x10\x00\x82\xa0\x82\xb3\x82\xad\x82\xb3\x82\xb1\x82\xa4\x82\xa6\x82\xf1\x01\x000\xc0[\x11\x00\x10\x00\x82\xa0\x82\xd8\x82\xc9\x82\xf1\x82\xc6\x82\xf1\x82\xcb\x82\xe9\x01\x000,\xa2\x13\x00\x0e\x00\x82\xa0\x82\xdf\x82\xa9\x82'

一見バイト列がちゃんと並んでいるように見えるが、一部バイト列ではなく、文字列が紛れこんでいるようにみえる。 \x82o とか。当該箇所を単体で print してみると、

print(test[3])
111

111 と表示される。これは、ASCII コードにおける o に相当する。バイト列のみを出力したと思ったら、一部は ASCII コード に変換されてしまっているようだ。

ドキュメント(組み込み型 Python 3.9.0 ドキュメント)を確認すると、

bytesリテラルと repr 出力は ASCII テキストをベースにしたものですが、 …

と記載があった。

bytes オブジェクトからバイト列を読みやすい形で取得するには、 bytes.hex() で取り出せそう。

for i, x in enumerate(test[:100].hex()):
    if i%2==1:
        print(x, end=" ")
    else:
        print(x, end="")
06 00 82 6f 82 68 82 6a 01 00 30 54 cd 14 01 0c 00 82 a0 82 a2 82 b7 82 ab 82 cb 82 b7 02 00 30 b8 79 0f 00 30 1c 7a 0f 00 10 00 82 a0 82 b3 82 ad 82 b3 82 b1 82 a4 82 a6 82 f1 01 00 30 c0 5b 11 00 10 00 82 a0 82 d8 82 c9 82 f1 82 c6 82 f1 82 cb 82 e9 01 00 30 2c a2 13 00 0e 00 82 a0 82 df 82 a9 82 

ちょっと見渡すと、 82 の直前に 00 があることが分かる。各見出しは 00 区切りで格納されているようだ。

PIK は、 826f 8268 826a であり、 PIK のまえには 0600 という prefix が付いていることが分かった。

あいすきねす (82a0 82a2 82b7 82ab 82cb 82b7) の prefix は、 0c00

PIKあいすきねす の間には、 0100 3054 cd14 010c 00 のバイト列が挟まっている。 00 が区切りを表わしているのであれば、0100 3054 cd14 010c はリンク先を表している…?

さらに観察すると、このバイト列は、{prefix(2byte), 00, 見出し1, suffix(2byte), 00, 30 XX XX XX, prefix(2byte), 00, 見出し2, suffix(2byte), 00, 30 XX XX XX, 00, 30 XX XX XX, 00, prefix(2byte), 00, 見出し3, suffix(2byte), 00, 30 XX XX XX, 00, prefix(2byte), 00, 見出し4, suffix(2byte), 30 XX XX XX, 00, prefix(2byte), …}

となっている。 雑に正規表現風に書くと、 (prefix 00 見出し suffix 00 (30 XX XX XX)+) というデータ構造をしているように見える。

30 から始まる 6byte は何を表しているのだろうか?見出しによって 個数が違うことから、リンク先を表しているような気もするが…

とにかく、バイト列の法則性を見つけたので、見出し語のみを抽出することができそうだ。素朴には、000idx.bin から 999idx.bin の見出し語のみを抽出し、五十音順に並べれば本文との関連付けができそうだが…?

まとめ

見出しが格納されている(と思われる)ファイルのバイト列を解析し、法則性を見出した。