python で AI の何かしらを作る試みのログ
環境設定
pyenv とか anaconda とか色々入っててわけとうふ状態であったためリセットしてこの記事を参考に conda & conda-forge 環境をつくた
M1/M2 mac はこれだから困る
早く量子コンピュータ並にヌルるレベルのWindows機が欲しい
というわけで以降、たいてい
pip install ~~~
と通常書いてあるご案内記事のコマンドは自動的に
conda install ~~~
になることをご了承いただきたい
さてまあこれを書き出す前にも割と色々触ってきたというのは置いといて、
これから書いていくテーマはこれだ
python で PDFを解析する
だいぶ難しいらしいんだが、そんなものはなんとかしていくしかない
最初に pdfminer.six
パッケージを使用するやりかたを試したが、
これだとごく単純なテキストファイルからテキストを抽出することはできたが、テーブルや図が入ったものには全く刃が立たなかった。
この方の仰るとおり。
ダメ元でやってみた → ダメだった。至極まっとうである。
まあ記事が古いのでもうちょいマシなパッケージが出てるんじゃないかと見渡してみたら
PyMuPDF
というのが新し目らしい。
そこでウキウキ気分で conda install pymupdf
とやってみたがエラー。
Solving environment: failed with initial frozen solve. Retrying with flexible solve.
要するに channels, つまりパッケージ管理ディストリビューションに pymupdf
がねぇという話らしい。
解決を探して同じことを書いてるのを2つ見つけた。一応書いておくけども、ワークしなかった。
# conda のアップデート
$ conda update conda
# ほいでもっかい conda install
$ conda install pymupdf
# それでも無理ならこれ打ってからもっかい install
$ conda config --append channels conda-forge
$ conda install pymupdf
もう一個解決方法があったが、こっちも失敗してる
conda install -c tc06580 pymupdf
linux-64/pymupdf-1.17.0-py36_0.tar.bz2
が2年5ヶ月前にアップロードされてんなぁ…
なんかキモチワルイね
この github 見るとLatestリリースが3日前になってるからこっちから持ってこよう。
M1/M2 mac では無理ぽいのか
上述のリポジトリより引用
PyMuPDF requires Python 3.7 or later.
For versions 3.7 and up, Python wheels exist for Windows (32bit and 64bit), Linux (64bit, Intel and ARM) and Mac OSX (64bit, Intel only)
...
Mac OSX (64bit, Intel only)。
Mac OSX (64bit, Intel only)。
YES, インテルオンリィ。
解決方法がマジで「Windows機を買う」になってきそうだ。これが一番シンプル。
悪いが PlayStation VR2 を買うより先に Windows機を調達しなければならないことになる。
だってもう pyenv, venv, conda とか色々あるなかでいちいちPoCやってられないもの
いやそのレベルで金を消費するのであれば同時に買ってもなんだよなぁ〜
不自由が過ぎます。
とりあえずはGoogle colab で凌ぐ!
追記:2023年4月30日
こちらがとても良いサイトで、割とやりたいことの指針が得られたような感じがする。※ コード中のソースになってる s10926-016-9690-x.pdf
ッテファイルは適当にDLしてきた英文の論文。
こんな感じでsample_dataディレクトリ以下に格納してます
jupyternotebook コード
[1] pip install pymupdf openpyxl
# fitzをインポート
import fitz
# PDFを読み込む
filename = '/content/sample_data/s10926-016-9690-x.pdf'
doc = fitz.open(filename)
# アブストラクトとイントロダクションを抽出する
extract_char_num = 400; # 抽出する、というか出力する文字数
abstract_text = ""
Introduction_text = ""
# page全部textの中に入れないとイントロダクションが2ページめにある論文とかあるからね
for page in range(len(doc)):
text = text + doc[page].get_text().replace("\n", "")
print(f'アブスト開始位置:{text.find("Abstract")}, イントロ開始位置:{text.find("Introduction")}')
abstract_text = text[text.find("Abstract") + 8 : text.find("Introduction") - 1]
Introduction_text = text[text.find("Introduction") + 12 : text.find("Introduction") + extract_char_num]
print(f"Abstract {abstract_text[:extract_char_num]}...")
print(f"Introduction {Introduction_text[:extract_char_num]}...")
pdf2html
まだメモ
考え方を変えて、javascript で pdf を HTML化 してから読み込めばよいのでは?
しかしこれをどうadaとかがどう解釈するカニよるのでとりあえずは試してみる
想定している手順
- 入力された pdf を HTMLに変換
- pdf が変換されたことをpythonのAPI叩いて通知
- python 受け取ったHTMLのパスを取得、解析して出力
まずはここまで。学習に使えるかどうかをこの時点で評価しなければならないんで。。
さてやってみるか
その前に色々GPT系のプロダクト出てきてるから触るのに時間使うかもしれないw