免责声明:我对 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 在 shell 中创建的文本相同,但斯坦福 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
旁注:如您所见,并非所有内容都是句子格式,因此理想情况下,将来我的文本挖掘程序也能够识别表格等。但我是新手,非常不知道如何实现它,所以我想先掌握这个基本的命名实体识别器。但是,如果您有任何建议,我非常愿意接受所有我能得到的帮助。
提前非常感谢!