过去四年时间,都在处理结构化数据的存储优化相关的工作。最近一段时间在做RAG相关的工作。非结构数据的存储与检索,接触的也越来越多。这篇文章聊聊最近一段时间关于文档理解方面的一些心得。
文档理解
文档理解旨在从非结构化文档中提取信息并将其转化为结构化数据。虽然计算机视觉和自然语言处理(NLP)是文档理解的重要组成部分,但它是一个独特的领域,需要两者的结合。
文档理解的重要性
我喜欢用一句经常说的话来概括:“进来的是垃圾,出去的也是垃圾” 。所以如何处理好非结构化的数据,就异常的重要。解析的好,处理的干净,才能给后边的过程省事。
文档解析需要的技术能力
NLP 、计算机视觉、多模态、一定的工程能力
通常使用计算机视觉方面的技术,来解决非结构话文件的版面分析工作,以获取页面的不同的元素包括但不限于标题,表格,图片,段落。以及位置信息。 通常我们拿到的文件可能是扫描件,这当前只有计算机视觉一种解决方法,就是使用OCR进行文字提取。
我们通常还想要从非结构化的文件中,提取超过文件本身的信息。例如抽取关键词,抽取事件,摘要,关系等等。
多模态始终是无法绕过的一个问题。当然,当前多模态可能需求量还不是那么大。我们通常也希望能识别图片中所描述的事情。这一般可以通过image2text来解决。入门级别的东西,可以在huggingface上去看看。https://huggingface.co/models?pipeline_tag=image-to-text&sort=trending
文档理解的挑战
在我日常工作中,感受到的文档理解,最困难的是文档解析。因为我们只能对已经看到的文件进行处理。测试很难覆盖到全部的文件。
文件类型太多了,txt、doc、excel、pdf、html、markdown、ppt等等。太多太多了。鬼知道究竟会有多少种文件类型。即使对于同一种文件类型,也会有非常多不同的文件。例如PDF文件,可能是论文,可能是简历,可能是法律文件,可能是财务报表。又例如excel文件,有的是类似于数据库数据的,有的是财务报表的,还有奇奇怪怪的,例如单个sheet里边存了多个表格。形式不一的表格再加上单元格合并问题,会非常麻烦。
现有的解决方案,以及最新的解决方案
这里分享一个很有意思的感受。国内老板特别喜欢自己搞,就算有现成的,只要不开源不免费,即使已经很廉价了,也要自己搞。这会非常浪费时间。过来的老板更注重产品形态,快速的出东西,所以选择已有的saas云服务。这也是国外环境更好的一个原因吧,在国外即使一个很小的点,可能都有小的团队已经在提提供saas服务了。
我个人的经验。在文档解析方面,三个人几个月过去了,也不会有什么好的结果。文档解析就是一个无底洞大坑。如果刚开始做,真的劝退。如果我是老板,我宁可花点小钱,去买saas服务。这块我们调研了几家,其中庖丁和阿里云的文档解析不错。
当然,如果真的下决心就要自己搞,也不是不行,只是时间问题。这里我分享一些开源的方案吧。可能有限推荐百度开源的paddlepaddle,它已经有OCR和版面分析了,效果也还不错。但是要知道只要是模型,就不太可能做到百分之百。PaddleOCR/ppstructure/recovery/README_ch.md at main · PaddlePaddle/PaddleOCR · GitHub
对于程序可以读取的文件,例如非扫描件PDF,我们是可以读取到内容的。这些需要依靠规则去解析,还蛮复杂的。后去文件的fulltext很容易,但是想要解析出来标题绝对不是一件容易的事情。想要解析出来表格也很困难。无法通过规则来定位哪里是表格,这里推荐使用计算机视觉的版面分析来定位,然后再用专门的工具去对定位后的表格进行解析。
这里还是想要分享新的玩法:现在是24年,大模型的的时代,文档解析多和大模型去结合,通常能够让事情变简单很多。当然成本会有点、不够我个人觉得这不是太大的问题。大模型的token卖的越来越便宜了。
文档解析几个重要的点
标题是非常重要的信息
文件数据的标准化转换比较重要
表格解析很重要,很多知识和消息藏在表格中,特别是财报类。
对于文档,不同粒度蕴含着不同的知识。例如句子里边可能包含的原子问题就一两个。对于段落,很有可能几个段落在描述一个件事情。