medu4のテキストをanki化してみた

始めに

medu4のテキストをPDFから文字データを抽出し、その文字だけでankiのデッキを作成しようと思い、試行錯誤を重ねたが、表からの文字データの抽出が難しいことや画像の扱いに困るなどの問題が生じた。
次に考えたのは、画像化したPDFの上に空欄になっている文字を位置情報を合わせて貼り付けることでこれはそこまで悪くない形になった。今回はその手法を説明しようと思う。

PDFの画像化

pdfの画像化はpdf2imageというライブラリを用いた。

文字の抽出

PDFにはどの環境でも互換性を維持したレイアウトで印刷可能となるように、文字とその位置情報が保存されているが、PDFからの文字情報を抽出するのは難しいものとなっている。
Python環境ではPDFから情報を抽出するライブラリとして、pdfminerやその派生版があり、今回はpdfminerの派生であるpdfmajorを用いた。これによって、文字の背景色が黒かどうかを判定し、黒でないものがあった場合、空白文字とみなして、その位置情報、文字、フォントサイズを取得している。

if not isBlack(ltchar.color.values):
 if not is_searching_white_letter:
  let = PDFLetter(x=ltchar.bbox.x0 + 2, y=ltchar.bbox.y0, fontsize=ltchar.size,letter=ltchar.get_text())
  is_searching_white_letter = True
 else:
  let.letter += ltchar.get_text()

文字を画像に貼り付ける

次に、空白文字の座標を取得したことを利用して、以下のようなHTMLを自動生成した。この例では、毛様体や後嚢といった文字をPDFからx,y座標ごと抽出し、CSSのpositionプロパティにHTMLの座標系に変換した値を代入することで文字列の埋め込みを実現している。

<div class="test1"><img src="144531_2021gankaF_8.jpg"><div class="test2"><div style="position:absolute; left:55.24101202661208%; bottom:82.51024765705733%"><span class="cloze" onclick="cloze(this.id);">毛様体</span></div><div style="position:absolute; left:67.38549129989765%; bottom:82.51024765705733%"><span class="cloze" onclick="cloze(this.id);">動眼</span></div><div style="position:absolute; left:31.39297594677585%; bottom:78.62957440995855%"><span class="cloze" onclick="cloze(this.id);">後嚢</span></div><div style="position:absolute; left:48.51602482088025%; bottom:71.50096917649574%"><span class="cloze" onclick="cloze(this.id);">99</span></div><div style="position:absolute; left:25.499776100307063%; bottom:64.33613766644099%"><span class="cloze" onclick="cloze(this.id);">10</span></div>

作成したもの

参考にしたもの

ankiで暗記ペンを実現する方法
https://ameblo.jp/macgyverisms/entry-12160265445.html
pdfmajor
https://pypi.org/project/pdfmajor/

ローマ史を辿って

ここ最近、「ローマ人の物語I」という本を読んでいる。
さて、これから書くものはただの感想に過ぎない。感想文等というものはちょっと書き綴ったところで、その本から得られる知見には遥かに及ばないだろう。
これは自身が読んだことを反芻するためのもので、それ以上のものではない。
テヴェレ河の流域に誕生したローマという都市はその当初、エトルニア人など近隣の民族が建設した都市と比べると、遥かに文明的にも経済的にも劣ったものだった。この都市が他の都市を脅かすほどに成長した原因は地勢的に魅力の薄い場所で干渉するに及ばないとみなされたからだろう。
「ローマ人の物語I」では初期の王政から共和制に到るまでの歴史が語られている。初期の王政の間、ローマは他国の人間を自国民として受け入れ、場合によっては要職の地位も提供するなどをして、国力を高めていった。これはローマが成長していく上でかなり重要な要因であったことは疑う余地がない。
政体の推移を観察してみよう
民主主義の現代においては王政というシステムは過去のものであり評価されることはあまりない。しかし、王政は意志決定の速さからトップが優れた能力を発揮する限りは未発達の文明を昇華させていくには効率的なシステムであるともいえる。
ローマの発展に寄与した王政というシステムはある時期に共和制へと移行している。王政が終了したのはその代の王が市民の信頼を勝ち得なかったというのが一番の理由だが、その後の共和制が受け入れられた理由としては、定期的に市民に信を問う共和制の方が市民の信頼を得られるため政体は安定しやすいからではないだろうか。
初期のローマの政体は未熟な都市には偉大なリーダーを必要とし、成熟した都市(国家)には民主主義が相応しいことを体現している。しかし、ローマはこの後何度か王政を経ることになる。その経緯は如何様なものなのか。これから先のエピソードを読むにあたって注目したいところだ。

python文法備忘録

pdbのコマンドについて

コマンド 説明
s ステップイン
n ステップオーバー
c コンティニュー

文字列の切り出し

3文字目まで切り出し

test = "hogedesu"
print(test[:3])

結果:hog

3文字目から切り出し

test = "hogedesu"
print(test[3:])

結果:esu

2文字目から−2文字目まで2ステップで切り出し

test = "1,2,3,4,5,6,7,8,"
print(test[2:-2:2])

結果:234567

既存のレポジトリをbitbucketにアップロードする

既存のレポジトリをSSH経由でbitbucketに接続して管理するための手順をメモしておく

レポジトリの新規作成

bitbucketにアクセスして新規に任意の名前のレポジトリを作る

sshキーの生成

以下のコマンドで公開鍵と秘密鍵を作成する。それぞれの名前はdefaultではid_rsa,id_rsa.pubであるが”hoge”,”hoge.pub”とすることもできる。

ssh-keygen -t rsa

公開鍵の登録

bitbucketにアクセスして公開鍵”任意の名前.pub”をbitbucketサーバに登録する

秘密鍵の登録

~/.ssh/configに以下のように書き込む

Host bitbucket bitbucket.org
    HostName bitbucket.org
    User git
    IdentityFile "~/.ssh/hoge"

接続先サーバの登録

ローカルレポジトリのディレクトリに移動して接続先のサーバURLを登録する

git remote add bb "bitbucket.org:UserName/レポジトリの名前.git"

リモートのレポジトリをダウンロードする

git fetchコマンドを使う

git fetch bb

リモートのmasterブランチを結合

無関係の履歴を持つブランチ同士の結合なので”–allow-unrelated-histories”を追加する。この時”README.md”がconflictすることがあるので、その場合は”READ.md”を修正してコミットすることでマージする。

git merge --allow-unrelated-histories bb/master

リモートレポジトリへアップロード

“git push”コマンドを使う

git push bb master