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

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

在终端中,当代码运行时,这个错误被相当频繁地抛出(并且偶尔与 Adob​​e 转换的文件一起抛出):

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

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

提前非常感谢!

4

0 回答 0