1

免責事項:私はPythonとプログラミング全般にかなり慣れていません。この質問にはいくつかの異なる要素があります。それらの一部またはすべてへの回答は非常に役立ちます。

対外援助文書から場所名を抽出するプログラムを Python で作成しようとしています。

これらのドキュメントは通常 PDF ファイルなので、最初は Adob​​e 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 ) を使用していますが、文ごとに空の辞書を返すだけです。ソケットの問題ではなく、以前は Adob​​e で変換されたファイルで機能していました。これは、スタンフォード 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 のハンドルを取得したいと考えています。ただし、何か提案があれば、私が得ることができるすべての支援に非常にオープンです。

よろしくお願いします!

4

0 に答える 0