好的,我会了解一下。服务器端的问题比较复杂,那是巨头主导的领域,是生态的问题而不是技术的问题,所以我一直声明对云端平台不持立场,避免卷入巨头商业竞争的漩涡。但正如这个PC端的解决方案一样,先把路打通,找到一条可行的技术路线,一个可行的解决方案,对所有人都是有参考价值的,对解决问题都是有帮助的。这个问题从有发票以来,二十几年来就没有好的解决方案,已经成为了税收大数据应用卡脖子的瓶颈,是必须要解决的。
问题已全部解决,更新了文章,速度又快了几倍,谢谢 @hankcs 及大家!
HanLP识别发票货物劳务名称之三 GPU加速
https://www.meipian5.cn/392u3ehj?share_depth=3&user_id=ohbsluMlQdetvNnxURjpDJEDPPfg&sharer_id=ojq1tt5xL274R407dIdSCXQFWH7I&first_share_to=&s_uid=85567411&first_share_uid=ohbsluMlQdetvNnxURjpDJEDPPfg&share_source=timeline
期待LZ的进一步成果,感谢楼主无私、详尽的介绍。
利用依存分析来对发票名称进行处理值得我们借鉴。我们这几天也正在评估是否可以通过语法分析来进一步提高我们的货物名称算法。
自从有发票以来这个问题确实没有好的解决方案。厚着脸皮介绍一下目前我们的货物名称算法已取得的成果吧:基于全国发票数据统计、利用海量发票数据训练了专用于货物名称领域的BERT模型、结合统计方法与深度学习模型、经优化计算速度最低不低于3000条每秒(普通服务器单线程无GPU)。在已有的解决方案里,我可打包票我们目前已有的算法是处于第一梯队的。
关于语法分析的评估,后续我也会在这个楼里给出回复
老兄您客气了,能够拿到全国发票数据对于研究是非常好的条件,期待你们早日解决好这个卡脖子的问题。在下只是个人兴趣的散兵游勇,你们才是国家信任的中央军。如果方便的话,可以介绍一下你们的研究,让我学习一下,也期待看到你们评估的结果。
个人觉得,要落地应用的话,首先是准确率的问题,准确之后再提高速度。准确率如果低于90%,落地应用的效果就不理想。另外业务上开票指引也要根据大数据应用的需要修订规范,每张票要有并且只有一样货劳名称,即使是汇总货劳名称。
前些天我跟另外一个搞AI及NLP的网友讨论过发票NLP的解决方案,他也想直接通过深度学习建立模型。然后我提出了几个观点:
1)标注的工作量大。在迭代训练的过程中,所有新的用例,如果预测不正确,都要标注,然后整个模型重新训练一遍。
2)训练计算量大,模型迭代更新的代价大。
3)发票货劳名称的专有名词多,语料在社会生活各领域语料中出现的频率低,深度学习训练的效果不一定很好。现在我已经看到你们训练了发票货物劳务名称领域的专用模型,所以关键还是准确率。
4)发票货劳名称名词短语、名称在后等内在的特征没有很好利用,这部分关键信息丢弃了很可惜。
我的方案正好克服了这几个问题:
1)模型迭代中,基础部分的分词、词性标注、句法/语义分析是通用的预训练模型,不需要随迭代更新。当然算法的准确率也取决于这些通用预训练模型的效果,目前看来,效果不错。
2)模型迭代中,预测不准确的新用例,更新的主要是发票专用的自定义词典,新的专有名词直接加进去即可。这样迭代的效率就高很多,建立自定义词典的代价就比较小,维护也很简单。我估计如果全国用的话,最终词典的规模不会超过社会上近年内流通货劳种类的10%~20%,大约30~60万条。
3)通过句法/语义分析建立名词短语内在的结构,充分利用了货劳名词短语自身的特征信息,配合自定义词典,达到了95%以上的准确率,效果非常不错。
4)广度优先遍历语法树/语义图,这个算法也需要在迭代中完善。发票中应该有很多种特殊的情况,也就是有明显可归纳的规律,比如我文章中提到的那些并列结构,包装修饰等,当然如果用深度学习应该也可以处理,但如果在预处理与遍历算法中直接利用,效率与准确率都好很多。
5)通用预训练模型、自定义词典、预处理与遍历算法这几个方向的迭代完善是并行不悖的,它们的改善实现了乘法的效应,所以这个方案一上来在小数据集上的准确率就超过了95%,我相信它可以维持并逼近98%~99%的极限。GPU版测试通过则解决了速度的问题,所以我觉得这是可行的技术路线与解决方案。
6)我的方案另一个优势是,通过先对货物劳务名称汇总,按频数降序排序的次序来处理,准确率迭代收敛的速度很快,与深度学习训练迭代应该不在一个数量级上。
如果它对解决问题有所参考帮助,那是很欣慰的事,功成不必在我。
期待你们的工作成果,祝你们成功。
看了大家的讨论和文章,又学到了不少,
老哥谬赞了
深度学习模型如果直接用来预测货物名称的分类,是很困难的,因为原始发票对应到编码的准确率很有限。如你所说,标注很困难。直接做一个多分类任务的话,有如囫囵吞枣,解决不了太多实际问题。
而基于bert的预训练模型,其主要意义是能够将文本转换为向量(hanlp中也有基于bert的预训练模型)。市面上已有很多可以将文本转换为向量的算法或预训练模型,有一定的效果,但是还可以进一步提升,因为这些预训练模型都是针对中文全景领域的,不是针对货物名称这一垂直领域的。因此我们用发票数据训练一个专门应用于发票领域的预训练模型,用来将货物名称转换为向量。至于后续的任务是做有监督、无监督、抑或其他任务,都可以自由发挥。
如果你自己训练一个bert模型替换hanlp读取的bert模型,或许也会提升在发票这个领域的效果的。
我们是第三方的财会软件公司,近年来发票数据管理愈发正规、严格,其实我们接触数据也是相当困难的…发票都来源于同一个省市也有其好处。例如你在小规模数据测试中的一条数据,提取到的名词是“零件”。零件在A市对应的可能都是金属零件,在B市的可能都是塑料零件。但是放在全国来看,反而分不清这是个什么零件了。也预祝你在该项目的算法研究上不断突破
说说我们算法在处理货物名称分类上的大致思路吧:
1.可用统计方法。很常见的货物名称,其实大部分的开票人是填写正确的;
2.用中文分词技术处理稍微复杂的情形。这一步的准确率我们一直想找办法提升,打算尝试一下利用语法分析;
3.用前面介绍的深度学习模型也可以得出结果;
4.其他发票信息也可能对货物名称分类有所帮助。
这些思路可以做成多个组件,组件之间可以串行,也可以并行,最后综合输出分类结果。
NLP我真的是小白哈,象HanLP这样易用的比较适合我这类的用户。我的研究是探讨技术路线与解决方案的可行性,鉴于目前的测试效果已经非常不错,95%与98%没有质的差别,我暂时不打算在这个方向继续推进。拱桥的一端建好了,需要推进另一端了。后面有空再认真读读小何博士的书 @hankcs 。
正如前面所说,在云端大规模落地应用是比较复杂的博弈,那是IT巨头们的战场,还有其它汹涌的潜流,主要不是技术上的问题。我的身边已经没有平静的车库与书桌了,这些事就不去操心了。
大部分人填写是正确的,赞同这个假设。只有这个假设成立了,通过基于概率论的各种分类算法建立货物劳务名称与商品税收分类代码之间的对应关系,贯通微观宏观才成为可能。学习交易网络的特征,总结交易网络中行业、产业链、虚开链的特征才成为可能。期待见到你们发布的研究成果。
我同意这个观点。虽然我们学术界人士为了0.3%的准确率提升而绞尽脑汁,但其实在实际应用中,几个百分点的差异都对下游应用影响不大。
@hankcs: 小何博士有时间可以了解一下 Orange Text,Orange开源可视化数据挖掘环境上的文本挖掘组件,(https://orange.biolab.si/ )。字母文字语言的支持已经做好了,他们正在做中文支持,主要是要加入中文分词,可能会用结巴分词,因为相对于Orange而言,HanLP的模型数据文件比较大。这是Python语言上非常优秀的可视化开发环境,也许你可以与他们交流一下。
谢谢,我给他们留了言:
但我不觉得他们的产品会成功。从他们选择NLTK就可以看出他们的技术和品位并不高。要知道NLTK仅仅是个教学工具,稍微top一点的实验室或者正经公司都不会用NLTK做研究/产品。如果他们的目标仅仅是做教学的话,可能还有点市场,否则就太落后了。