在Python上使用PDFminer将PDF转换为TXT时使用Stanford NER时出错?

时间:2014-06-19 19:56:46

标签: python pdf stanford-nlp named-entity-recognition pdfminer

免责声明:我对Python和编程一般都很陌生。这个问题有几个不同的组成部分 - 对其中任何一个或全部的答案都会非常有帮助。

我试图用Python编写一个程序来从外援文件中提取位置名称。

这些文档通常是PDF文件,因此我最初使用Adobe Reader将它们从PDF转换为TXT。但是我想将这个过程集成到我的程序中,所以我安装了PDFMiner并且已经测试了之前的堆栈溢出问题(How do I use pdfminer as a library)中的代码来转换它们。 这是我目前正在使用的代码:

    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

当我打印输出时,它看起来与shell中Adobe Reader创建的文本相同,但是Stanford NER标记器找不到任何实体。我使用pyner(https://github.com/dat/pyner)来实现斯坦福NER,它只是为每个句子返回空字典。套接字不是问题,它在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]

在终端中,运行代码时,此错误被频繁抛出(偶尔会被Adobe转换的文件抛出):

edu.stanford.nlp.process.PTBLexer next
WARNING: Untokenizable: ? (U+F0B7, decimal: 61623) 

为什么会发生这种情况,我该如何解决?

以下是我一直在使用的示例文档供参考:http://www-wds.worldbank.org/external/default/WDSContentServer/WDSP/IB/2009/02/03/000350881_20090203110828/Rendered/PDF/432750PJPR0BR010P1028180Box0334125B.pdf

旁注:正如您所看到的,并非所有内容都是句子格式,因此理想情况下,我的文本挖掘程序也能够识别表格等。但我是新手,并且不知道如何实现它,所以我想先得到这个基本命名实体识别器的句柄。但是,如果您有任何建议,我可以获得所有帮助。

非常感谢!

0 个答案:

没有答案