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