前回のあらすじ。
過日ご紹介した『陰徳太平記』や、そのもとになった『陰徳記』、更にそのもとになった『安西軍策』においても、「房田」と「保田/安田」の両面で確認すると良いかもしれませんね。
(そんなのOCR使って画像をテキスト化してGrepしたらスグに終わるから、)任せたり!
…………二年後
ムリぽ。
画質悪すぎ!OCRの精度低すぎ!役に立たねー。
その後「Kerasを使ってCNNで機械学習(AI)で解く」事も考えた事もあった。
でも、GPU搭載したパソコン無いし、入力サンプルも大量に必要。そして精度も低そうだよね。
無理ゲーだよ。これ。
……ん、まてよ?
画像処理を使って「陰徳太平記」から文字を検索する
これ、シンプルな方法で解けるんじゃない?
まずは全画像をダウンロードする
「国立国会図書館デジタルコレクション」の文献は画像としてダウンロード可能だ。
「連続して出力する場合は、30秒程度の間隔を空けてください」
という注意書きがあるので、それに従ってスクリプトを書いてみる。
1 2 3 4 5 6 7 8 |
#!/bin/bash max=211 for ((i=1; i < $max + 1; i++)); do echo $i wget -O "$i.jpg" "https://dl.ndl.go.jp/view/jpegOutput?itemId=info%3Andljp%2Fpid%2F772380&contentNo=$i&outputScale=1" sleep 30 done |
これで、待っていればやがて一つの合本の全画像がダウンロードされる。
テンプレートマッチング(SSD)を試みる
これらの画像に対してPythonのOpenCVを使ってテンプレートマッチングSSD(Sum of Absolute Difference)を行う。
ここで、画像上の2つのブロックをとし、ブロックの各画素の輝度値をと置く。はブロック内の画素の位置を表す。
テンプレート画像はこれ。仁保島の戦いの記載があるので「保」を5ページ目で発見できた。
で、テンプレートマッチングするためのソースコードはこちら。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import cv2 #OpenCVのインポート import sys NUM = sys.argv[1] img = cv2.imread(NUM + ".jpg") #画像を読み込む img_gray = cv2.imread(NUM + ".jpg",0) #画像をグレースケールで読み込む template = cv2.imread("yasu.png", 0) #テンプレート画像をグレースケールで読み込む width, height = template.shape[::-1] #テンプレート画像の幅、高さを取得 result = cv2.matchTemplate(img_gray, template, cv2.TM_CCORR_NORMED) #テンプレートマッチングの実行(比較方法cv2.TM_CCORR_NORMED) min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result) #類似度が最小,最大となる画素の類似度、位置を調べ代入する top_left = max_loc #最も似ている領域を赤で囲う bottom_right = (top_left[0] + width, top_left[1] + height) #矩形の右下の座標計算 cv2.rectangle(img,top_left, bottom_right, (0,0,255), 2) #最も似ている領域を赤の矩形で囲う print(NUM + " ," + str(max_val)) #最も似ている領域の類似度を表示 #cv2.imshow("result",img) #別ウィンドウ"result"を開きmgを表示 cv2.imwrite("out/" + NUM + "_1.jpg", img) |
これをスクリプトで回す。
1 2 3 4 5 6 |
#!/bin/bash max=211 for ((i=1; i < $max + 1; i++)); do python ssd.py $i done |
実行して出力された最大となる画素の類似度をグラフ化したら次のとおり。
類似度が「0.88」以下の場合は「促」「深」などがヒットしていた。
なので、「0.88以上」でフィルタリングして、画像を確認してみる。
完璧じゃん!!
文系の古文書調査員では思いつかないし実現出来ない方法だよね。
すべての刊で確認する
手法の有効性が確認されたので、約1,000枚の画像に対して適用してみる。
まずは「保」だけでなく、「房」「安」の文字もテンプレートとして用意する必要がある。
「保」は「仁保島」、「安」は「安芸」で簡単に見つかるが、「房」は簡単に発見できなかった。
このような場合はパワーポイントなどで「房」の文字画像を作って代用する。
該当文字を見つけたら、より精度の高い画像に差し替えて再実行する。
因みに、「国立国会図書館デジタルコレクション」の「陰徳太平記」合本3の画質ってこんな感じだからね。
そもそも、こんな画像に対してOCRで文字抽出を考えたのが間違いだった。
なお、「房」は「肩」「居」の誤検知が多かった。「保」は「促」「深」「係」の誤検知が多かった。
見逃しを排除したいので、閾値を甘めにして約700枚以上のヒット画像を全て目視で確認した。
見つけた固有名詞は次のとおり(他の方の後学目的で全部書き起こした)。
陰徳太平記 | 保 |
---|---|
合本1 | 仁保、阿保親王、仁保右衛門太夫、仁保隆重、三保、久保右京亮、中将重保朝臣、少輔高保 |
合本2 | 仁保島合戦、平賀隆保、平賀新四郎隆保、阿川太郎隆保、備後国保木、二保ノ島、仁保右衛門、伊保ノ庄、三保、河久保ノ館 |
合本3 | 仁保合戦、三保、美保、阿保、仁保右衛門太夫、久保内蔵、仁保島、於保、保隅 |
合本4 | 三好存保、宮久保垣生、庭田大納言源重保郷、越後守釜連富永三郎左衛門保英、保元平治、存保、保科肥後守、神保、久保木工助、久保源右衛門、富永三郎左衛門保英、久保、保謀、久保七兵衛 |
陰徳太平記 | 安 | |
---|---|---|
合本1 | 安芸国、安富、安景、安興、安芸ノ国、安房守、安綱、安達、亀井安綱、亀井能登守安綱、安宅冬康、安光、安威弥四、鹿苑妙安、安富源内 | |
合本2 | 石川永安、畠山安見、安富源内、陶安房守隆浦、吉見安芸守、安芸守隆家、安岡、安田(p.129)、安田入道(p.132)、安見、安宅冬康、安座上兵部、安達十兵衛、亀井能登守安綱、浄安寺 | |
合本3 | 土州安芸城、安国寺、亀井能登守安綱、安達十兵衛、松山安芸守、安東右馬允、乃美安芸守、寺本安芸守、安達、淡路勢安宅甚太郎、宍戸安芸守隆家、安田村(p.124)、安田城(p.124)、安部仁右衛門、安部弥一郎、安都部弥市郎、安原彦左衛門元吉、安部仁右衛門、大安、安養寺、戸川秀安、安積六郎、加賀守安治、安達、大蔵太輔安治、安原神次郎、貞安上人、秀安、長安傅左衛門 | |
合本4 | 脇坂安治、安芸勢、松岡安右衛門、安原民部少輔、安原、西堂利安、安倍野、戸川肥後守秀安、秀安、安房守信固、安芸守、和泉守経安、安達、安原民部、安国寺、安藤名倉、安土、寺本安芸守、日赤星安房守、安徳、弘安、安芸国、安東津之助、安田甚介(p.143)、脇坂中尉少輔安治、山鹿郡主隈部式部少輔親安、神保安芸守、宇内安寧、安道筋、平安、河安、安田喜左衛門(p.227)、小西飛騨守如安、戸津安兵衛、脇坂中書安治、安原彦左衛門、吉安白松、風物順安 |
陰徳太平記 | 房 |
---|---|
合本1 | 陶隆房、大納言房家、深野平左衛門興房、匡房、広房、信房、安房、陶安房守、盛房、守房、清房、呂望子房、隆房、椿槌房、鍋島清房、太輔隆房、四郎清房、石井忠房、甲斐守経房、一篠房基、長房 |
合本2 | 陶長房、尹房公、隆房、陶隆房、陶五郎隆房、高木鑑房、筒井ノ浄妙土佐房正俊、三浦越中守房清、宮川甲斐守房長、江良丹後守興房、伊加賀民部少輔房勝、三須筑前守房清、長房、垣並佐渡守房精、陶五郎長房、小次郎兄長房、五郎長房、刑部少輔房正、房忠、彼女房、女房彼女、三村五郎兵衛親房 |
合本3 | 女房、賢房、長房、鍋島豊前守房重、陶隆房、房井土佐大将、舎弟景房、次男房冬、刑部少輔則房、花房、義房、鍋島豊前守信房、花房志摩守 |
合本4 | 雅房、曲淵房資、安房守、花房志魔守、後出雲房宗賢、牛房原 |
抜き出した「安田」に対する考察
「保田」「房田」は見つからなかったが「安田」という文字は見つける事が出来た。
【合本2】
- 大内義長の最後「誘ふとて 何か恨みん 時きては 嵐のほかに 花もこそ散れ」と辞世の句を謳い、安田入道も自害
- 父が安田入道の兄・五郎、小次郎も自害
【合本3】
- 安田城(新潟県阿賀野市)に篠原宗右衛門を置いた
- 安田村松の城を7日10日の両日に破った
【合本4】
- 吉川元長勢の山県木工之助(丸山城開城にて開戦の鏑矢を射た人物)の家臣である「安田甚介」
- 吉川広家の家臣である「安田喜左衛門」が朝鮮出兵にて河下城攻にて先陣できった
安芸吉川家・大内義長の家臣に「安田」というものがいた……ぐらいしか分からない。
でも、大内義長の家臣なら自害してる……。
そして、安芸吉川は帰農せず1600年に周防国岩国領主として存続してるから、関係が無い気がする。
「安田喜左衛門」という人物が、1700年~1760年「麓屋(保田)良左衛門」という私の祖先につながるのかな……。
うーん、ロマンに満ち溢れているが、これ以上は今のところは分からない。
まとめ
前から調べたかった軍記物語「陰徳太平記」の調査が画像処理の技術で実現できた。
実装は30分もかかってないけど、抽出したデータのまとめ作業で土曜日が潰れたけどね。
でも、これ、ビジネスになるんじゃないかな?
調べて欲しい名前があれば、
「陰徳太平記」の約1000ページを1つの名前につき2,000円で調べます!
(他の古文書であってもデジタル画像があれば可能。サイズばらばら、くずし字等は要相談)
とかね。
今は全く割に合わないけど、効率化を図れば1時間以内の作業にはなると思う。
また、今まで適当に流し読みした他の文献もこの仕組みを使って再度網羅調査する価値がありそうだ。
なお、今回紹介したスクリプトは1ページから一つの最適文字を見つけるだけなので、複数の文字を見つけるにはカスタマイズが必要。
なお、肝心の結果は、保田、房田と言う武士は載っていなかった。安田は見つけたけど、関係は薄そうだ。
また「陰徳記」「安西軍策」のデジタル画像はネットに存在しなかったので試していない。