[[ノート>ノート/ノート]]~
訪問者数 &counter();      最終更新 &lastmod();~

*備忘メモ PDFをテキストにする [#badbd31c]

PDFファイル(主に論文)をGoogle 翻訳に掛けるのに、Google 翻訳の入力としてそのままPDFを使うと、なんとなく変なところが出る。具体的には、文の途中に改行があったり、逆に文の切れ目が開業されていなかったりすると、どうも調子が悪いみたいだ。

というわけで、PDFを一旦テキストファイルに落として、多少整形して、かつ、Google 翻訳で対応できる長さに切る、という作業を自動化したかった。

*PDFのテキスト化 [#d03b1b51]
**PDFのテキスト化 [#d03b1b51]
いろいろとツールがあるようで、たとえばAcrobatでもテキスト化できる。

使いやすさを考えると、PDFファイルを食わせて変換してくれるのがいいので、プログラムで変換することを考える。自分の環境がPythonなので、コマンドで使えるレベルのプログラムか、Pythonのライブラリか、という選択になるだろう。

Pythonのライブラリである、pdftotextとpdfminerが見つかったので、いろいろと試してみた。

pdftotextは、パッケージpopplerの中に含まれているスタンドアローンプログラムで、Centos7ではyumコマンドでインストールできた。
 yum install popller popller-utils
 
 pdftotext -h
 pdftotext version 0.26.5
 Copyright 2005-2014 The Poppler Developers - http://poppler.freedesktop.org
 Copyright 1996-2011 Glyph & Cog, LLC 
 Usage: pdftotext [options] <PDF-file> [<text-file>]
というところである。

これをpythonから呼び出そうというわけで、
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 import subprocess
 import sys
 import re
 
 def split5000(str):
     # 5000字のバッファに収まるような単位に、文の切れ目で切る
     cutpoints = [-1]
     c = 0
     while True:
         c = c + 1
         currend = min(cutpoints[-1] + 1, len(str))
         if (currend >= len(str)) or (c > 5):
             break
         newend = str.rfind('\n', currend, currend+5000) +1
         if newend == -1:
             newend = len(str)
         cutpoints.append(newend)
     return cutpoints
         
 infname = "2017-04-29_WordNet-Similarity.pdf"
 textfname = infname[:-4] + ".txt"
 
 args = "pdftotext " + infname + ' ' + outfname
 try:
     res = subprocess.run(args, stdout=subprocess.PIPE, shell=True)
 except:
     print("Error")
     
 with open(textfname, 'r') as f:
     u = f.read()
     out = re.sub('([^(.|\n)])\n([^\n])', r'\1 \2', u)
    
 outlist = split5000(out)
 for u in range(len(outlist)-1):
     print(out[outlist[u]+1:outlist[u+1]])
     print('-----------------------------------')

新しそうなのは、pdfminer3k (pdfminerのPython3対応版らしい)である。
このパッケージ中にスタンドアローンのプログラム pdf2txt.pyがあって、同じようなことができる。

-[[Python3でWeb上の学術論文のPDFファイルを取得して「文書要約」する:https://media.accel-brain.com/web-pdf-abstract-academic-papers/]]~
-[[pdfminer3k:http://b.hatena.ne.jp/entry/s/pypi.python.org/pypi/pdfminer3k]]~
-[[徹底攻略PDFオープンデータ。PDFMinerで始めるPDFテキスト分析。:http://qiita.com/nezuq/items/75e8366d68c66e56ff53]]~
-[[Extracting Text & Images from PDF Files:http://denis.papathanasiou.org/posts/2010.08.04.post.html]]~
-[[Programming with PDFMiner:https://euske.github.io/pdfminer/programming.html]]~
-[[https://pypi.python.org/pypi/pdfminer3k:https://pypi.python.org/pypi/pdfminer3k]](pipでインストールした後、pdf2txt.pyも使える)~
-[[https://github.com/jaepil/pdfminer3k:jaepil/pdfminer3k]]

**ファイルの整形 [#f15c0171]
Google翻訳ページが、(意味のない)改行があると具合が悪そうなので、
-意味のない改行は消す
-でも、意味のある改行(段落の切れ目やらなんやら)は残したい
-逆に、文の終りは改行を入れたい(1文1行にしたい)
-でも、「ピリオドがあると改行を入れる」とすると、たとえばe.g.などで困る

更に、PDFをテキスト化した結果は、文の終りのピリオドの次が改行の場合、すぐに改行がある。(ピリオドと改行の間に空白がない。)

というわけで、やってみたのが
 re.sub('([^(.|\n)])\n([^\n])', r'\1 \2', u)
但し、ファイル読み込みの時に、readlinesとかやると余分な改行が入るので、readだけでべったりと読むことにした。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS