半结构化文本信息提取数据通道设计
信息提取任务
针对Word或Excel类半结构化文件,即有一定的文章结构和形式的文件,提取感兴趣的键值对。
信息提取工作的难点
信息提取的工作是将感兴趣的键值对从文档中提取出来,并以结构化格式保存。该任务的难点包括:
文档格式多样性
数据格式不统一。不同的文件可能是Word文档,也有可能是Excel文档,不同的文档格式也不尽相同,有比较老的格式如.doc和".xls"类,也有比较新的格式例如".docx"和".xlsx"类,这些格式还包括大写扩展名例如".XLSX",另外很多文档还有信息丢失和文档保护或文档加密情况。
报告类别多样性
报告类别繁多。主要包括两个问题:1.不同的文档包括不同类别的报告,例如一个文件包括“A报告”、“B报告”等多个报告。2.同类报告格式不一。大量的报告类别使报告分类工作显得尤其重要,但是如何准确的对报告进行分类是难点之一。
报告类别重复
同一个文档中包含同一类别的多份报告问题。例如,出于工作需要,在同一份文档中包含多份“A报告”。
报告结构多样性
同一类报告结构不统一。同一类别的报告,也可能存在不同的报告结构。
关键字多样性
同一关键字在不同报告内的表述方式不同。在同一类别的报告中,同一个关键字的表述方式不同,也会造成关键字的多样性,例如,同样表示“名称”的关键字,由于不同的写报告的人的习惯不同,可能有“姓名”、“名字”、“申请人”等各种不同的说法。为了实现结构化,必须把所有不同的表述映射为唯一的关键字名称。
不同类别关键字重复
不同报告包含相同关键字问题。即便所有报告中包含的关键字均被映射成为唯一的标准关键字,仍然存在重复关键字的问题,即在不同的报告中包含同一个关键字,例如,在同一个文档的“A报告”和“B报告”中均包含”名称“,在这种情况下,存在使用哪个名称作为唯一的关键字的问题,即重复关键字的选择问题。或者当无法使用唯一关键字时,则考虑是否扩展关键字集。
同类别关键字重复
同一报告包含相同关键字问题。在同一个报告中,也有可能同一个关键字在文章中的多处出现,例如有时一个报告的内容实际上是由多份子报告合并而成,这同样造成了如何选择唯一关键字或关键字集扩展的问题,
键值对匹配难题
与关键字对应的值是什么的问题。当我们检索到感兴趣的关键字,其对应的值不一定就在关键字的后面,有时候在下一行,或下面多行,或者有时干脆是空字符。
实体识别问题
如何准确的识别值中感兴趣的实体问题。例如“两年期我还是青铜,上个月已经是王者了”这句话是关键字“晋级历程”的值,其中的“青铜”和“王者”是关键字“初始段位”和“当前段位”的值,但是如何从这句话中准确的提出段位信息实体是一个难题。
人为错误问题
无论数据处理的流程设计的如何严谨,总会出现意料之外的人为错误,例如写错字、忘记删除多余文字、或者在Excel类型的文档中将某些行隐藏或干脆调整为非常小的行高,以隐藏信息。这些情况给信息提取带来了更大的难度。
信息提取工作的度量标准
判断信息提取工作最终的结果优劣,需要一套完整科学的度量标准。
提取的准确度
准确性指的是能够想要提取的键值对与实际的键值对的匹配程度, 我们使用
代表提取出的键值对,使用
表示真实的键值对,单个键值对提取的准确性
可以定义为:
a和b是(0,1)区间的小数。
对于全部键值对的准确
可以采用取平均的方式,即
是全部键值对的数量。
提取的完整度
完整度指的是提取的关键字正确的键值对数量占全部真实键值对数量的比例。我们使用
代表x的数量,
代表提取比例则有:
提取的效率
提取的效率指的是算法的效率,不难想象,如果一个算法只遍历一遍所有单元(根据算法的设计,单元有可能是每个字符或者每一行)就实现了全部信息的提取,即认为达到了最大效率,算法d效率为
,
是基本单元的数量。
数据处理流程
为了有效解决上述问题,我们提出采用数据管道的方式,分阶段处理。具体管道包括6个步骤,即文档分类、文档格式转换、文档切分、报告分类、关键字提取、关键字分类、键值对匹配。
文档分类用于将输入文档按照文件格式归档;归类后的文档采用不同的工具进行文档格式转换,一般来说转换为txt格式;然后提取并统计报告类型;对不同的报告类型进行合并归档;针对每一种类型的报告进行关键词提取;将所有关键词合并为“标准关键词”;最后提取报告键值对,并将关键字映射为标准关键字。
下面分别介绍每个步骤的处理过程。
文档分类
为了解决上一节提出的“文档格式多样性”问题,首先要进行文档分类,该过程使用一个文档分类器遍历所有文件,该分类器的输入是待处理的文档,输出是该文档的文件格式。
这里我们定义文档集合为
,其中
,n是全部文档的数量。
我们用
代表该分类器,
代表文件格式,其中
,m是全部文件格式的数量,那么该分类器作用的数学形式如下:
的确定
如果文件格式较少,可以通过人为设定的方式,在只有4类文件的情况下可以设定:
如果文件格式较多,则首先对全部文档进行遍历,遍历后得到所有文件类别,出于效率的考虑,一般将文档分类和判别工作合二为一,过程如下:
文档分类器的另一个作用是缓解“报告类别多样性”问题,引起该问题的原因之一是来自不同公司同一类别的报告也会采用不同的格式。 因此将公司名称作为文档判定其的类别,同样可以将文档归档。
文档分类器能够这部分解决“文档格式多样性”和“报告类别多样性”的问题。但是该步骤只是将文档进行了归类,依然还存在不同的文件格式。
文档格式转换
在文档分类器工作的基础上,为了解决彻底解决“文档格式多样性”的问题,还需要使用“格式转换器”。
我们用
表示该转换器,该转换器的作用是检索输入文件的格式,使用对应的转换工具将文件转换为指定的格式。
根据输入和输出的数量,该转换器可以有多-多、多-单、单-多的三种,根据任务不同,选择不同的转换器,本文的目的是解决“文档格式多样性”问题,因此选择“多-单”转换器。转换器的工作流程如下:
对于商检数据来说,该转换器将Word或Excel格式文档转换为txt格式并保存,得到的结果如下
文档切分
经过文档分类和文档格式转换,基本解决了“文档格式多样性”的问题,一定程度上解决了“报告类别多样性”问题,但是文档中包含的不同类别的报告依然是待解决的问题,无法解决该问题,即便我们将键值对提取出来,也无从得知该键值对来自于哪个报告,数据也就没有任何意义,因此本节我们讨论如何将文档切分为不同报告。
我们提出使用“文档切分器”将文档切分为多个报告。
使用
代表切分得到的报告,其中
,p是所有文档中报告数量的最大值,值得注意的是,不是所有文档都能得到p份报告。
代表切分器,则有:
该切分器的输入是一个报告和参数,输出是一个报告的集合。
开始标识和结束标识
观察上式,切分器的输入不仅包括文档,还包括
和
,这两个变量是文档切分器的参数,
是开始标识,
是结束标识。下面具体介绍:
文档切分器的工作过程基于开始标识和结束标识的定义,这两个标识代表报告的开始和报告的结束,一般来说报告的开始有一个较明显的标识就是报告标题,报告的结束也有一定规律,例如出现“综上所述”、“备注”等字眼,或者出现类似“* * end * * ”的固定格式。对于Excel类报告来说,有一个天然的切分方式就是在一个工作簿中不同的工作表自然就是一个个报告。
文档切分的工作流程如下:
文档切分基本解决了“报告类别多样性”和“不同类别关键字重复”的问题,但还有一个细节问题待处理,那就是报告分类的问题。
报告分类
文档经过切分,得到了报告集,想从这些报告集中抽取数据,自然想到的一个方法就是将报告分类,逐个类别提取信息。但是报告分类面临的困难是,同一类报告的名称不一定相同,例如“A报告”,有可能的名称包括"a报告"、 "A证书"、 "A文件"等等。
我们采用第二个分类器,即报告分类器,解决上述问题。
假设用
表示报告分类器,该分类器的作用是得到输入报告的类别,l代表某一个类别,l的范围是1到q,q是全部类别的数量。
报告名-类别映射表
报告分类器的数学表达式中包含一个参数
,该参数是报告名称到报告类别的映射表,是报告分类器的核心参数。
举例来说,报告映射表的映射过程如下:
"A证书" -> “A报告”
"a报告" -> “A报告”
"A文件" -> “A报告”
...
确定映射表
如何确定映射表有多种方法,例如根据报告题目中出现的字判断,根据报告的格式判断,或根据报告的文字统计判断等等,这些方法有各自的优势,但是对于专业性较强的报告,采用专家规则法能够得到最准确的结果。
简化报告名称
在实际处理报告名称的过程中,有可能出现不同的名称过多的情况,如果不同的报告名称数量超过了1000个,则认为采用专家规则的方式复杂度过高,所以需要对报告名称进行简化处理。通过简化报告名称的方式,亦可以达到粗略分类报告的目的。
简化报告名称的方式可以采用两步的方法,第一步根据报告出现的次数简化。第二步根据报告名称的长度简化。第三步删除名称中的无用字符,例如空格、制表符等。具体来说本文设定报告出现次数少于3次则不予考虑,并取去除无用字符后所有报告名称的最后10个字符作为简化名称。
报告分类过程
报告分类的过程如下图所示:
关于“报告类别重复”和“报告结构多样性”问题的讨论
处理好报告分类器的细节,能够解决报告类别重复的问题。如果在保存报告时,想将报告名称保存为报告类别,简单有效的方法是对报告进行编号,例如"A报告1.txt"、"A报告2.txt"等。另外一种方式是采用数据库保存报告,将报告类型作为其中一个字段。
虽然可以把统一类型的报告,按照排版结构的不同继续分类,以解决“报告结构多样性”的问题。但是考虑到该工作的难度和工作量与对信息提取带来的提升的比较,可以简单的认为同一类别报告的排版格式大致一样,后面的实践也进一步证明了,设计好后续步骤可以有效的减少该问题带来的不确定性。
关键字提取
有了某一类报告,如何提取其中的关键字?主要有两种方法:第一种是设定需要提取的关键字集,在报告中检索其中的关键字。第二种方法是先检索所有关键字,再将其映射为标准关键字。
第一种方法的问题在于,我们无法在没有事先把所有报告都看过的前提下,定义一个包含全部可能出现的关键字的集合,这大大影响了关键字提取的准确性。所以,出于精度的考量,我们采用先盲检索后分类的方法,即一种“基于分隔符的逐行关键字提取方法”。
基于分隔符的逐行关键字提取方法
基于分隔符的逐行关键字提取方法以报告的行为单位元素,以预先设定的分隔符为提取依据,通过“关键字提取器”提取关键字。
我们设
为关键字提取器,
为报告中的第s行,其中
,r为该报告的最大行数,
为分隔符的集合,
为第r个关键字,则有。
这种方法基于一个基本的假设,关键字之后一定有一个分隔符用于区分关键字与值。如果出现异常情况,这种方法则会失效。
分隔符的确定
一般来说使用中英文的冒号、制表符等作为分隔符,也可以结合多个分隔符,当检测到使用了某一个分割符时,该分割符前面的字符串即认定为关键字。
多个分隔符的情况
如果一行中出现多个分割符,那么对该行的分割得到的字符串将超过2个,这种情况下如何判断哪个是关键字,需要通过设定规则来解决。
我们假设
经过分割后得到
个字符串,对应每种字符串串长度设定提取规则。例如如果字符串长度为偶数,那么奇数项认为是关键字,偶数项认为是该项前面一个奇数项关键字的值。如果字符串长度为奇数,那么将奇数项认定为关键字,偶数项认定为值,最后一个关键字自动删除,因为它没有值。当然,这个规则需要根据报告的具体形式而设定。
逐行提取的优势
采用逐行提取的方式可以提高检测的效率,遍历一遍报告的所有行即可得到全部关键字,效率较高。但是该方式也基于一个基本假设,即关键字与分隔符一定在同一行,如果出现了违背该基本假设的情况,则该方法失效。
关键字提取流程
关键字分类
完成关键字提取工作后,等待我们的是“关键字多样性”和“同类别关键字重复”的问题,这一节将探讨如何解决这两个问题。
我们用
代表关键字分类器,该分类器的输入是待分类的关键字和核心参数,该核心参数是“关键字-标准关键字”映射表,经过分类后,输出是标准化的关键字
。
获取关键字映射表
关键字映射表与报告类型映射表的获取方式类似,采取专家规则的方法虽然效率较低,但是能够保证数据的准确性。
简化关键字
如果关键字提取器提取出来的关键字种类太多,创建关键字映射表的过程将非常复杂和耗时,所以我们同样需要使用三步简化的方式。第一步去掉无意义的字符,例如空格、制表符等。第二步去掉无意义的关键字,例如关键字是纯数字或纯符号等。第三步取关键字的最后10个字符(也可以是其他任意的字符或从字符串的开始部分取,这个数字应该既保证有足够的信息区分不同的关键字,又能够有效的减少数量)。
关键字分类流程
键值对匹配
键值对的提取需要解决“键值对匹配难题”、“实体识别问题”。也就是,怎么找到与某个关键字对应的值的问题,以及如何从该值中提取出我们需要的内容的问题。
关于键值对匹配难题的解决方案
我们使用键值对匹配器完成匹配任务。
上两节提到的关键字提取器和关键字分类器能够从报告中发现关键字并标准化。我们认为除了报告中除了关键字都是值,这时需要解决的问题是哪些值与哪些关键字匹配。
Word类文档转换的报告(以下简称Word报告)与Excel类文档转换的报告(以下简称Excel报告)在解决这个问题上采取不同策略,因为这两类文件需要基于不同的基本假设。
- Excel报告假设与某个关键字匹配的值是位于同一行的该关键字之后的字符串,或者位于同一行的该关键字与下一个关键字之间的字符串。
- Word报告假设与某个关键字匹配的值是该关键字与下一个关键字之间的字符串,不一定在同一行。
键值对匹配器的输入是一个有顺序的关键字序列和一个有顺序的值序列,关键字序列的形式采用“关键字提取”章节的形式,即
,记该序列为
;值序列的数学形式为
,记该序列为
。其中每个关键字或值的下角标代表该变量的顺序,r与w可能相等也可能不等。
对于Excel类文档转换的报告来说,每处理一行数据,即可得到对应的
和
,因为我们假设关键字和值在同一行。而对于Word报告来说,我们需要将整体报告遍历处理完成后才能得到
和
(即使提取关键字的过程仍然是基于逐行的处理)。
有了
和
,我们还需要一个策略库,用于应对不同类型的报告,这同样有助于解决“报告类别多样性”的问题,这也体现了报告分类步骤的重要性,因为如果没有报告分类,我们可能需要一个规模庞大的策略库,而基于报告分类,需要指定的策略库只需覆盖最小的报告类型数量。
匹配策略库
匹配策略库是键值对匹配器的核心参数,库中的策略决定了该匹配器的匹配精度。
举例来说,对于封面类型的报告(Excel类报告),假设
和
的数量相等,即
,一个简单的策略是按顺序依次匹配,即得到键值对集合
。
当然,实际情况比这个简单策略复杂的多,不变的是,对于不同的报告类别,我们需要指定一套不同的策略,这些策略的集合组成策略库,设策略库为
,记为
,这里的l和q与表示报告类型的
中的
和
含义相同。
键值对匹配器的输出是匹配好的键值对集,记为
。
基于上述说明,设键值对匹配器为
,键值对匹配器的数学表达如下所示:
当然,输出的键值对集合中的关键字应该映射为标准关键字,这一步可以在键值对匹配之前或之后完成。
键值对匹配器工作流程
关于实体识别问题的讨论
实体识别问题是一个自然语言处理的传统问题,对于如何识别出人名和电话号码等实体的研究较多。想要识别出一个字符串中的特定实体,高效率和高精准度的方法一般建立在有合适的语料库和该领域的字典的前提下。
总结
对于“半结构化文本信息提取”任务,想得到比较好的结果,需要理论与实践的结合,具体来说既要定义好问题、度量和方法,又要实现步骤设计、策略和工程部署。
总结我们的工作,主要得到了以下成果:
一、定义了“信息提取”工作的难点
能够正确的定义问题就解决了问题的一半。我们定义了10个待克服的困难,包括:文档格式多样性、报告类别多样性、报告类别重复、报告结构多样性、关键字多样性、不同类别关键字重复、同类别关键字重复、键值对匹配难题、实体识别问题和人为错误问题。
二、定义了“信息提取”工作的度量标准
没有工作度量标准,无法判断解决方案的效果,我们提出了“提取准确度”、“提取完整度”、“提取效率”的三维度度量标准。
三、实现了“数据管道”的设计
数据通道的设计方式将一个复杂的项目分解为相互依赖的分项目,具体管道包括6个步骤,即文档分类、文档格式转换、文档切分、报告分类、关键字提取、关键字分类、键值对匹配。这样设计的好处在于工程上易于实现和维护,且一个设计好的管道可以对其他数据复用,减少重复工作量,另外,管道的设计是理论与实践的结合,可以在工程实现上采用理论设计的逻辑搭建管道。
四、部分解决了信息提取工作的难点
数据管道的每一步骤设计都充分考虑了如何解决信息提取的难点。