我,RoboLoyer或如何查找文档中的异常

您能想象公司律师每小时要查看多少监管文件,而他的粗心会导致什么后果? 一位贫穷的律师必须阅读每份合同,尤其是在没有适合他的标准模板的情况下,这种情况经常发生。

考虑到公司律师的疲倦之眼,我们决定创建一项服务,以查找文档中的问题并将其告知打signal睡的律师。 结果,我们创建了一个解决方案,该解决方案在一定的合同基础上为知识提供了汇总,并向律师提供了提示,应特别注意。 当然,并非没有魔术。 数学魔术称为异常检测。

基本上,“异常检测”方法用于分析各种设备的行为以检测故障,或用于银行部门以确定欺诈。 并且我们尝试将这些算法应用于法律文件的分析。 按照削减来了解我们是如何做到的。


1.我们处理结构化信息


我们很幸运,因为 合同中的文本根据某些模板进行了充分的结构化,干燥和编译。 为了进行该项目,提出了基于合同和来自zakupki.gov.ru网站(我们获得200,000个文档)的合同实施原型的想法。 对于170,000张合同,我们能够确定结构:合同的序言,章节,段落和附件,并考虑关键字,在文本中的位置和编号。

2.各种类型的合同


有必要考虑合同可以是不同类型的事实。 它们在内容,合同主题,主要章节等方面都有很大差异。要优化每种合同的分析,有必要对合同进行分类或聚类。
也许您已经知道数据库中存在哪些合同类型,并且知道可以用来确定合同的标志。 在我们的案例中,我们有合同的原始主体,没有关于每个合同的任何其他信息,也没有关于采购合同分类的任何假设。 因此,我们被迫诉诸于我们的合同基础。

您可以使用tf-idf文档表示向量对集群进行标准化,但是出于娱乐目的,我们决定尝试Doc2Vec算法。 使用Doc2Vec算法,将合同转换为向量,并将生成的合同向量发送到聚类算法的输入。 我们使用K-means算法对向量进行聚类。 由于相似度通常使用余弦距离来衡量,因此我们使用它代替了欧几里得距离。

收到20簇文档后,有必要检查簇的质量。 由于我们没有合同的任何分类,因此我们无法将结果集群与现有分区进行比较。 然后,我们决定看看描述集群的词语。 为此,我们为每个群集取了“协议的主题”项目,删除了停用词,数字和在大多数群集中找到的单词。 然后,我们为每个聚类选择5个最常见的单词作为关键字。 以这种直接的方式,可以主观地评估聚类的质量。

描述簇的单词示例:

  • 房客,房东,公寓,出租,开发商
  • 能力,教学,教育,学术,专职
  • 总承包商,分包商,一般建筑,设计师,城市规划
  • 药房,检疫,支出,植物检疫,不透气
  • 侦探,保安员,镇压,焦虑,进攻
  • 被许可人,再许可人,电影,许可人,中继
  • 借款人,托管,债权人,贷款,抵押
  • 集中式,能源供应,区域内,管道,下水道

3.我们在合同中会遇到什么异常


让我们确定我们将考虑哪些异常情况以及如何处理它们。 我们确定了以下方案:

  1. 合同中增加了一个额外的条款,在此之前从未见过。 有必要提请律师注意他。
  2. 合同中没有以前在此类合同中遇到的条款。 我们必须建议律师添加它。
  3. 一段与故事中的某个点类似,但是以某种方式改写,添加或删除了一些单词。 您可以告诉律师并建议您进行编辑。

4.以什么形式提交合同


如前所述,合同由各章组成,各章分为多个段落,每个段落可以包含多个子段落,等等。 为了将合同分为章节,我们考虑了编号,转移和关键字:“章节”,“文章”等。 每个项目都包含一个或多个句子。 要将项目分解为句子,使用了nltk.tokenize模块中的send_tokenize。

合同本身包含几个全球性章节,其实质和内容可以通过标题找到:合同的主题,当事方的权利和义务,价格和结算程序...我们试图将这些章节与相同的标题组合在一起,并分别处理不同的章节。 这些章节的标题经常被改写,有错别字或额外的标点符号。 为了使各章组足够大,我们将在Levenshtein距离内接近的那些标题合并为一组。

我们肯定会遇到的问题之一是合同中大量的命名实体,它们通常是唯一的,并且可能被误认为是异常。 合同中有许多实体,例如名称,公司名称,日期,地址等,随合同的不同而不同。 有必要在合同中找到并消除此类实体,即 将合同转换为某种模板形式。 我们对数据集很幸运,因为 在卸载合同时,有很大一部分模板合同,即用下划线代替命名实体。 我们已经确定了通常在哪个短语之间使用下划线,以便在完整的文档中找到这些短语并从中删除命名的实体。 显然,我们没有删除所有命名实体。 因此,我们再次使用Natasha库浏览了船体,并删除了她找到的实体。

5.合同中异常条款的定义


我们已经能够使用聚类按类型将合同分开,并且能够识别相似章节的组。 现在,使用对某种合同类型的某些条款的累积知识,我们可以了解当前合同中需要解决的问题。 让我们计算该章中每个句子出现异常的可能性。

对于每组章节,我们将满足的所有要约存储在国家采购的培训文档集中。 因为 其中有很多,对于Word2Vec模型的每组章节都经过训练,每个句子都与其中包含的单词的向量的加权和(通过tf-idf)和一个向量相关联。 此外,类似于用于文档的向量的划分,将句子向量划分为簇。

现在,当提出一项建议时,我们将确定它来自哪个合同组,哪个章节组,最接近哪个提案组,并在这个最接近的提案组中找到。 到最近报价的距离可以视为该报价有多异常的度量。 如果到最近的报价的距离为零,则我们的报价不是异常。 随着距离的增加,我们越来越怀疑该提议是否包含异常情况。 他很可能出了点问题。

6.如何处理缺失的物品


我们想出了如何在合同中找到异常点的方法,但是没有学习如何以丢失句子或分数的形式发现异常的点。 如果我们手上有此类协议的模板,则很容易发现这种异常,但是,例如,有时其他公司向我们发送了根据我们自己的模板制定的协议。
为了检测这种异常,我们需要为合同创建模板,该模板具有一组强制性要约/条款,这同样仅基于我们的合同。

我们提出并测试了用于构建模板的算法。 该算法假定在我们的合同数据库中有一个相似的章节,其中包含正确的项目集,我们希望将它们识别并指示为模板。

算法:


  1. 对于每组章节,都基于MinHashLSH算法进行预训练模型,该模型使您可以快速找到闭合文本。
  2. 对于下载的合同的每一章,从数据库中找到与其接近的段落列表。
  3. 基于获得的接近段落,构建语言模型,并选择该语言模型预测的最高概率作为模板段落。

收到每个章节的模板后,我们可以识别模板中存在但当前合同中不存在的缺失项目,并建议律师添加它们。

7.完整的管道


总结并汇总所有步骤:

一,合同总公司的收集,加工和贮存
A.组装模型合同的主体。
B.按类型分类/分类合同。
C.将合同分解为章节,段落和句子。
D.从合同中删除命名实体。
E.按章节标题分组。
F.对于每个章节组,训练Word2Vec。
G.将每个句子与其中包含的单词的向量的加权和的向量进行匹配。
H.对接收到的句子向量进行聚类,并分别存储每个聚类,以在最接近的聚类中快速搜索最接近的向量。
I.对于每个章节组,训练MinHashLSH。

II。在新文件中搜索异常
A.突出异常点
1.定义合同类型(类或类)
2.将文档分为章节,段落和句子
3.对于每个章节,在数据库中找到相应的章节组
4.用向量匹配每个句子
5.为合同的每个要约找到最接近的要约群,并在其中找到最接近的要约
6.计算提议向量之间的距离,并根据获得的距离为句子着色。
7.仅对句子的某些部分涂上颜色,如果最接近的部分在几个单词中有所不同。
8.建议以下一句话的形式进行编辑。
B.搜索丢失的物品
1.为每一章构建一个模板
2.建议从模板中添加缺少的项目

8.质量评估


为了评估问题解决方案的质量,形成了一组测试合同。 异常是通过删除单词的一部分,在单词中插入单词/短语,在其他章节中插入句子,删除句子的形式人为地添加到合同中的。 我们评估了每种异常类型的质量,并获得了以下确定误差分布:


也就是说,提出的算法允许我们在5个案例中的4个案例中确定不正确的包含。 应当指出,随着培训样本数量的增加和不同类型合同的聚类,我们可以在此评估中得到改进。

9.可视化


为了可视化解决此问题,已实现了一个Web界面,可以在其中加载新合同,该合同的文本将显示在页面上,并突出显示异常报价。 句子的颜色越深,我们确信它是反常的。 因为 我们找到了最近的报价,建议您以下一个报价的形式为用户进行编辑,或者如果下一个报价与原始报价有细微差别,我们建议更改报价的特定部分。



10.适用时?


在需要对大量相同类型文件的法律纯性进行“流式”检查的情况下,例如在向公众发行抵押贷款(抵押,汽车贷款和保险)时,最终服务的实际应用是最合适的。 例如,对于抵押贷款,这些是房地产销售合同,房地产和借款人保险合同,财产评估合同等。 -每个客户档案中的数百页文字,几乎可以立即进行分析,异常位置将“突出显示”给律师,以进行风险或欺诈分析。

因此,有血有肉的律师离不开完全,但是现代技术使他们的生活更轻松。

Elena Sannikova( helen_sunny )准备的材料。

Source: https://habr.com/ru/post/zh-CN419837/


All Articles