如何从文档中提取/识别文本?

3

我需要从上传的文档中提取纯文本,以便使它们可以被搜索。文档可以是MS Word或pdf文件(扫描或含有文本均可)。所涉及的应用程序正在运行在LAMP堆栈上,但安装其他软件也是一个选项。你能推荐任何工具、服务、库或这些组合来完成这个任务吗?


1
对于扫描文档,我认为您需要一些OCR(光学字符识别)。 - BoltClock
从旧式的.doc文件中提取文本是一件非常痛苦的事情。它们并不是为了易于解析而设计的。.docx则相对容易一些,因为它们基本上只是压缩的.xml文件。 - Marc B
@BlotClock 我知道。我没有明确提到它,因为我认为这是显而易见的。 - Maarten
3个回答

4

您可以使用一些shell工具,例如pdftotext来处理PDF文件,wvWare来处理DOC文件,docx2txt.pl来处理DOCX文件,就像textractor rubygem所做的那样。

# on Ubuntu
apt-get install wv xpdf-utils links

还有一些原生的PHP类可以用来提取PDF和docx文件,你可以参考这个这个
还有一个ruby gem,甚至可以通过Tesseract为你进行OCR,叫做docsplit
对于索引和搜索,可以考虑使用Solr。您可以使用Solr Cell插件来索引和搜索Word文档、PDF等等。我在一个项目中成功地使用了它。Solr Cell基于几个项目,比如Apache POITikaPDFBox
设置所有单元相关的jars和Solr模式以及确定索引请求参数可能是棘手的部分,但是所有这些都可以从维基文档中找到。 这里是我的jars和模式,可供您开始使用,模式中相关的一行是包含“attachment”的那一行。
但是Solr Cell不支持OCR。你需要先使用OCR引擎使文档可以搜索。
对于OCR,你可以使用由Google开发的开源引擎Tesseract,或者看看商业引擎Abbyy。两者都是命令行工具,可以从你的PHP脚本中运行。为了获得与Abbyy相当的结果,你需要进行一些预处理和后处理1。还有云服务,可能更容易一些。例如,WisetrendAbbyy Cloud。后者目前处于测试阶段,因此免费,并且有现成的PHP代码示例

Solr Cell有OCR功能来从扫描的PDF中提取文本吗? - Tomato
我不确定,但我认为不是这样。我相信OCR应该在管道的更上游完成,而且我听说tesseract是一个很棒的免费工具来完成这项任务。 - clyfe
那么它对于扫描的PDF文件就无法工作。它们应该首先通过一些OCR软件转换为可搜索的PDF文件(带有添加的文本层)。 - Tomato
谢谢!你的答案可能是最有帮助的。我意识到这个问题有点广泛,所以没有一个明确的答案。我编辑了一些OCR相关信息并将其变成了答案wiki,让其他人也可以贡献内容。 - Maarten

3
据我所知,PHP并不适合用于OCR。最好的解决方案是使用云服务——一种Web API,它允许您上传图像并返回OCR数据。尝试使用ABBYY最近推出的基于云的OCR SDK:www.ocrsdk.com。它目前处于测试阶段,完全免费,并且具有现成的PHP代码示例。声明:我在ABBYY工作。

有趣!不过,由于这只是解决方案的一部分,我改了另一个答案(编辑仍在等待审核)。希望你能原谅我。 - Maarten

0

我不知道有哪些软件可以将PDF转换为文本,但对于MS Word部分,您可以使用Apache POI:http://poi.apache.org/,它是用JAVA构建的,因此您必须从PHP文件中执行二进制文件才能使其正常工作。

另一个选择是使用JODConverter(我目前正在使用此选项)http://code.google.com/p/jodconverter/ 因此,如果Apache POI无法正常工作,我知道jodconverter可以。我正在使用3.0 beta版本。

在我的PHP代码中,我保存上传的文件并在tmp目录中执行转换器二进制文件,这将在tmp目录中创建一个新文件,并从新文件中提取纯文本。


注意:如果可能的话,最好通过stdin输入文件,这样您就不必先将其保存到磁盘上。如果相关实用程序没有提供cli开关,则可以在Linux下使用/dev/stdin。 - Maarten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接