免責事項:私はPythonとプログラミング全般にかなり慣れていません。この質問にはいくつかの異なる要素があります。それらの一部またはすべてへの回答は非常に役立ちます。
対外援助文書から場所名を抽出するプログラムを Python で作成しようとしています。
これらのドキュメントは通常 PDF ファイルなので、最初は Adobe Reader で PDF から TXT に変換しました。しかし、プロセスを自分のプログラムに統合したいので、PDFMiner をインストールし、以前のスタック オーバーフローの質問 ( pdfminer をライブラリとして使用するにはどうすればよいか) からコードをテストして変換しました。これは私が現在使用しているコードです:
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from cStringIO import StringIO
def convert_pdf_to_txt(path):
rsrcmgr = PDFResourceManager()
retstr = StringIO()
codec = 'utf-8'
laparams = LAParams()
device = TextConverter(rsrcmgr, retstr, codec=codec, laparams=laparams)
fp = file(path, 'rb')
interpreter = PDFPageInterpreter(rsrcmgr, device)
password = ""
maxpages = 0
caching = True
pagenos=set()
for page in PDFPage.get_pages(fp, pagenos, maxpages=maxpages,
password=password,caching=caching, check_extractable=True):
interpreter.process_page(page)
fp.close()
device.close()
str = retstr.getvalue()
retstr.close()
return str
出力を印刷すると、Adobe Reader がシェルで作成したテキストと同じように見えますが、Stanford NER タガーはエンティティを見つけられません。スタンフォード NER を実装するためにpyner ( https://github.com/dat/pyner ) を使用していますが、文ごとに空の辞書を返すだけです。ソケットの問題ではなく、以前は Adobe で変換されたファイルで機能していました。これは、スタンフォード NER を実装するための私のコードです。
import ner
def findloc(text):
tagger = ner.SocketNER(host = 'localhost', port = 8080)
loclist = []
sentence = ""
for char in text:
if char == ".":
sentence += "."
tagsent = tagger.get_entities(sentence)
if u'LOCATION' in tagsent:
loclist.extend(tagsent[u'LOCATION'])
sentence = ""
else:
sentence += char
return [x.encode('ascii').lower() for x in loclist]
ターミナルでは、コードを実行すると、このエラーがかなり頻繁にスローされます (アドビで変換されたファイルでもときどきスローされます)。
edu.stanford.nlp.process.PTBLexer next
WARNING: Untokenizable: ? (U+F0B7, decimal: 61623)
なぜこれが起こっているのですか、どうすれば修正できますか?
参考までに私が取り組んできたドキュメントの例を次に示します。
補足: ご覧のとおり、すべてが文形式であるとは限らないため、将来的には、テキスト マイニング プログラムが表なども認識できるようになることが理想的です。しかし、私はこれに不慣れで、それを実装する方法をまったく知らないので、最初にこの基本的な Named Entity Recognizer のハンドルを取得したいと考えています。ただし、何か提案があれば、私が得ることができるすべての支援に非常にオープンです。
よろしくお願いします!