2013-06-13 22 views
8

問題
私はテキストを検索して、好ましくはPythonを使用して、ドキュメントの種類(訴状、連絡文書、召喚状など)を判断しようとしています。すべてのPDFを検索することができますが、Pythonで解析し、それを検索するためのスクリプトを適用するソリューションは見つかりませんでした(最初はテキストファイルに変換していませんが、n個のドキュメントではリソース集約型になる可能性があります)。Pythonを使用してPDF内のテキストを検索していますか?

私がこれまで
をやった私は(どれも、直接この問題を解決するように見えませんが)、私は見つけることができるpypdf、pdfminer、Adobe PDF形式のドキュメント、ここで任意の質問に見てきました。 PDFminerが最大の可能性を秘めているようですが、ドキュメンテーションを読んだ後は、どこから始めるべきかはわかりません。

PDFテキストをページ、行、またはドキュメント全体で読むためのシンプルで効果的な方法はありますか?またはその他の回避策?

+0

私は同じ解決策を探していた。問題は、PDF文書が再構成することが困難な塊にテキストを分割することで有名であることです。 PDFを書いたプログラムによって異なります。私はPDFminerと多くの "elif"コードを使ってPDFを解析しました。 –

+1

単なる考えですが、実用的でない可能性があります...回避策を見つけることが切望されている場合は、pdfgrep(http://pdfgrep.sourceforge.net/)に検索を依頼してください。 –

答えて

17

これは、PDFスクレイピングと呼ばれ、非常に難しいからです。

  • PDFを解析できないように、印刷されるように設計された文書形式です。 PDF文書内では、 のテキストは特定の順序ではありません(印刷の順序が重要でない場合)。 元のテキスト構造が失われます(文字はグループ化されません。 )彼らが置かれている順序は であり、紙はランダムであることが多い)。
  • PDFを生成するソフトウェアがたくさんありますが、多くは欠陥があります。

PDFminerのようなツールは、ヒューリスティックを使用して、ページ内の位置に基づいて文字と単語を再度グループ化します。私は同意します、インターフェイスはかなり低いレベルですが、それは彼らが解決しようとしている問題を 知っていると意味があります(最終的に、重要なのは隣人からの手紙/単語/段落の一部と見なされるために)。

高価な代替手段(時間/コンピュータパワーの点で)は、各ページの画像を生成してOCRに送るので、非常に良いOCRがあれば試してみる価値があります。

私の答えはいいえ、PDFファイルからテキストを抽出するためのシンプルで効果的な方法はありません。文書が既知の構造を持っていればルールを微調整して良い結果が得られますが、常にギャンブルです。

私は本当に間違っていると証明したいと思います。

+0

すべての文書がpdfs形式でスキャンされ、OCRで検索可能になりました。これはあなたの記述とは異なりますか? – Insarov

+0

@Insarov:まさに私が話していることは、給料に値するOCRは、純粋なテキストファイルをPDFファイルとともに出力するオプションがあるということです。 –

3

私は@Pauloに同意します。PDFデータマイニングは大きな苦痛です。あなただけの単一のキーワードを探している場合、これはあなたの目的のために十分なものでなければならない

http://www.foolabs.com/xpdf/download.html

:しかし、あなたはここで自由に利用可能なXpdfのスイートの一部であるpdftotextでの成功を持っているかもしれません。

pdftotextはコマンドラインユーティリティですが、使用するのは非常に簡単です。それは、あなたが作業しやすいと分かるテキストファイルを提供します。

6

私は、PDFを処理用のデータ(請求書、和解書、スキャンしたチケットなど)に変換する会社の広範なシステムを作成しました。)、@Paulo Scardineは正しいです - これを行うには完全に信頼できる簡単な方法はありません。つまり、最も速く、最も信頼性が高く、最も集中力のない方法は、xpdfツールの一部であるpdftotextを使用することです。このツールは、検索可能なPDFをテキストファイルにすばやく変換します。テキストファイルは、Pythonを読み込んで解析することができます。ヒント:-layout引数を使用してください。ところで、すべてのPDFを検索できるわけではなく、テキストを含むPDFだけです。一部のPDFには、テキストのない画像のみが含まれています。

+0

なぜそれが最も速く、最も信頼できる方法ですか?何か証拠? –

+1

PDFをテキストファイルに変換する方法がある場合は、実際に新しいファイルを作成せずにそれを行う方法はありますか?文書をメモリに読み込むような何か? (少なくとも、それを変換するのと同じくらい単純な方法で)? – Insarov

+0

@Insarov、私はそうは思わない、pdftotextではない。しかし、私はこれで間違っているかもしれない、あなたはドキュメントをチェックする必要があります。あなたはpyPdfとpdfminerでそれを行うことができますが、ファイルへのpdftotextの書き込みでさえ、pdftotextよりもかなり遅いです。 – MikeHunter

2

私は最近、あなたが説明したことを行うためにScraperWikiを使い始めました。

ここにはScraperWikiを使用してPDFデータを抽出するexampleがあります。

scraperwiki.pdftoxml()関数は、XML構造を返します。

次に、BeautifulSoupを使用して、ナビゲーション可能なツリーに解析することができます。このコードは、全体、<text>タグの大きな醜い山を印刷しようとしている

import scraperwiki, urllib2 
from bs4 import BeautifulSoup 

def send_Request(url): 
#Get content, regardless of whether an HTML, XML or PDF file 
    pageContent = urllib2.urlopen(url) 
    return pageContent 

def process_PDF(fileLocation): 
#Use this to get PDF, covert to XML 
    pdfToProcess = send_Request(fileLocation) 
    pdfToObject = scraperwiki.pdftoxml(pdfToProcess.read()) 
    return pdfToObject 

def parse_HTML_tree(contentToParse): 
#returns a navigatibale tree, which you can iterate through 
    soup = BeautifulSoup(contentToParse) 
    return soup 

pdf = process_PDF('http://greenteapress.com/thinkstats/thinkstats.pdf') 
pdfToSoup = parse_HTML_tree(pdf) 
soupToArray = pdfToSoup.findAll('text') 
for line in soupToArray: 
    print line 

-

はここのために私のコードです。 各ページは</page>で区切られています。例えば<b>に包まれた見出しが含まれる場合があります

あなたは<text>タグ内のコンテンツをしたい場合は、あなただけではない、タグを含めて、テキストの各行をしたい場合はline.contents

を使用し、それはだline.getText()

を使用厄介で痛いですが、これは検索可能なPDF文書でも機能します。これまで私はこれが正確であるが、痛いことが分かった。

+1

私はscraperwikiを使用しようとしましたが、システムが指定されたパスを見つけることができませんエラーです。 @ JasTonAChair何か助けていただければ幸いです。 – user1211

+0

@JasTonAChair アム取得エラー: - BeautifulSoup([マークアップ])これまで : BeautifulSoup([マークアップ]、 "lxmlの") – venkat

0

ここで私はこの問題に対して快適だとわかった解決策です。テキスト変数では、検索するためにPDFからテキストを取得します。私はこのウェブサイト上で見られるようなしかし、私はまた、キーワードのテキストをspitingのアイデアを保持している:https://medium.com/@rqaiserr/how-to-convert-pdfs-into-searchable-key-words-with-python-85aab86c544fだったから、私はNLTKは非常に簡単ではありませんでし作るが、それはさらに目的のために有用であるかもしれない、このソリューションを取っ:

import PyPDF2 
import textract 

from nltk.tokenize import word_tokenize 
from nltk.corpus import stopwords 

def searchInPDF(filename, key): 
    occurrences = 0 
    pdfFileObj = open(filename,'rb') 
    pdfReader = PyPDF2.PdfFileReader(pdfFileObj) 
    num_pages = pdfReader.numPages 
    count = 0 
    text = "" 
    while count < num_pages: 
     pageObj = pdfReader.getPage(count) 
     count +=1 
     text += pageObj.extractText() 
    if text != "": 
     text = text 
    else: 
     text = textract.process(filename, method='tesseract', language='eng') 
    tokens = word_tokenize(text) 
    punctuation = ['(',')',';',':','[',']',','] 
    stop_words = stopwords.words('english') 
    keywords = [word for word in tokens if not word in stop_words and not word in punctuation] 
    for k in keywords: 
     if key == k: occurrences+=1 
    return occurrences 

pdf_filename = '/home/florin/Downloads/python.pdf' 
search_for = 'string' 
print searchInPDF (pdf_filename,search_for) 
関連する問題