面向模式的文本数据描述模型
来源:用户上传
作者:
摘 要:实际应用中常有从非结构化文本中提取符合指定模式信息的需求。在分析了使用正则表达式处理这类问题的缺陷之后,提出了一种面向模式的文本数据描述模型,将模式分为终端模式、结构体模式、联合体模式和數组模式,并详细介绍了各模式在文本匹配以及数据映射中的作用,最后通过相应的示例演示了模型的结构性与便利性。
关键词:面向模式;非结构化文本;模式识别;信息提取
中图分类号:TP391.1 文献标志码:A 文章编号:2095-2945(2020)10-0028-03
Abstract: In practical applications, there is often a need to extract information from unstructured text that conforms to a specified pattern. After analyzing the defects of using regular expressions to deal with such problems, a pattern-oriented text data description model is proposed, which is divided into terminal patterns, structural patterns, union patterns and array patterns, and the role of each kind of pattern in text matching and data mapping is introduced in detail. Finally, the structure and convenience of the model are demonstrated by the corresponding examples.
Keywords: pattern-oriented; unstructured text; pattern recognition; information extraction
引言
文字是人类用于交流的重要工具,计算机的发展使得文字能以文本形式存放于各类存储介质中。截止2014年8月,全世界已经有接近20亿台个人电脑,这些电脑中存储着各式各样的文本数据,对其中一些公开文本进行信息提取成为颇具价值的技术。文本按照结构化程度可分为结构化文本、半结构化文本和非结构化文本三类。结构化文本指逻辑上以表或者其他严格统一形式存储的文本,如csv文件、dsv文件等,这类文本由于具有很强的格式性,其中的文本含义很容易通过事先的定义得出,例如csv中可以添加表头来给每列数据设置列名,这类文本一般很容易处理;半结构化文本是结构与内容混合在一起的文本结构,兼具格式性和可扩展性[1],常见的半结构化文本有HTML文档、JSON文档等;非结构化文本是完全没有结构或只含有语义结构的一类文本[2],这类文本扩展性很强,但难以通过统一的规则处理,因此常利用机器学习方法来提取文档中的信息。对于海量非结构化文本数据,一般使用文本挖掘技术来提取其中的信息。文本挖掘技术最初被用于文本文档的分类,但不久后它就发展为一种提取文本信息的技术。此后对文本信息提取的实际需求不断驱使着文本挖掘的发展。人工智能则是文本信息提取的支撑,自然语言处理(NLP-Natural Language Processing)就是人工智能领域的一个研究人与计算机之间使用自然语言沟通的各种理论与方法的分支,一些文本挖掘技术所采用的基础理论就来源于NLP领域。广义的文本挖掘可定义为从文本中获取有价值信息和知识的一种手段,除使用数据挖掘方法进行文本挖掘外,还可使用模式识别方法从文本中获取符合一定模式的文本信息。虽然两者的主要目的都是从文本中提取有用的信息,但是数据挖掘手段关注文本内容本身,例如提取文档特征、抽取文档关键字和文本语义理解;而文本模式识别则将模式作为关注点,即重点在需要的信息上。对文本进行模式识别信息提取的过程一般分为两步:首先通过模式描述所需信息结构,然后从文本中提取符合模式的文本片段。正则搜索就是文本模式识别的一种成熟应用,用户使用正则表达式(Regular Expression)定义需要的文本信息的模式,然后利用正则搜索引擎从待识别文本中搜索出若干满足表达式模式的文本片段。部分情况下,用户使用正则表达式搜索出的符合目标模式的文本不需要具有特定结构,即搜索结果仅表现为文本串;但是在某些需求下,搜索出的目标文本片段需要被切分成更小的文本片段,这些片段每部分都有特定的意义,这时便会用到正则表达式中捕获组的概念。捕获组是正则表达式中显式标记的子表达式,分为普通捕获组和命名捕获组。普通捕获组的匹配结果将按照捕获组编号规则依次存储在一个结果列表中,而命名捕获组的匹配结果则存储在一个组名称到结果映射的字典中。
在实际应用中存在这样一种需求,从指定非结构化文本中抽取需要的数据。这种非结构化文本中包含所需信息的文本片段具有某种句式结构,即模式。一种实现这种需求的简单方法为正则搜索,模式可以通过正则表达式来表示,所需的子数据模式则可标记为捕获组[3]。直接编写正则表达式可以处理目标文本片段模式不复杂的情况,但如果目标文本片段的模式复杂,那么对应的正则表达式就会非常复杂,而且还需要标记各部分子数据的捕获组,并在匹配完成后将各捕获组的数据存放到内存中相应含义的变量上。概括来讲,直接使用正则表达式来处理这类问题较复杂,并且用于匹配相应数据的正则表达式不易于维护。因此,本文提出了一种面向模式的文本描述模型,将模式抽象为终端模式、结构体模式、联合体模式和数组模式四类,并将模式映射到程序语言中定义的数据类型,模式在匹配到文本片段后,可自动在内存中生成相应类型的数据。 1 模型定义
面向模式的文本数据描述模型包含四个关键的概念:终端模式、结构体模式、联合体模式和数组模式(简称终端、结构体、联合体和数组),这与各类面向过程以及面向对象的编程语言对数据的表示形式相似,其中终端类似于编程语言中的基础数据类型,例如整数、浮点数和字符串等。各类模式之间可以进行“|”运算(即或运算),表示多个模式任选其一,或运算的结果为联合体。
1.1 终端模式
在面向模式的文本数据描述模型中,终端(Terminal)被定义为表示最小数据单元的模式,最小数据单元包括数字字符串、日期字符串和关键词等,具体的最小数据单元可按特定问题的需求进行扩充。对于一个日期型最小数据单元,它对应的终端可以为:一个1000到3000的整数(年)+连接号(-)+一个1到12的整数(月)+连接号(-)+一个1到31的整数(日)或(|)一个1到12的整数(月)+连接号(-)+一个1到31的整数(日)+连接号(-)+一个1000到3000的整数(年)或...。该终端可以匹配的日期格式有两类:“年-月-日”(如2020-1-1),以及“月-日-年”(如01-01-2020)。与正则表达式不同的是,该模式不仅表达了文本的字符序列信息,还包含文本所表示的更高一级数据信息——整数。
1.2 结构体模式
结构体(Structure)是文本数据到内存数据的映射,映射定义过程在映射函数Construct中进行,映射函数以(终端,字段名)或(结构体,字段名)或(数组,字段名)元组集合作为输入,将模式与程序中定义的数据结构对应的字段进行绑定,需要注意的是,一个结构体可以表示多种映射,即Construct函数可以被多次调用;而实际的数据映射过程则在构建函数Build里进行,对于某一个成功的匹配,Build函数会返回一个结构体绑定类型的实例。对于面向对象的程序设计语言来说,这种数据结构可以是类,字段则是类的字段。例如现有一个类Product,它包含整数型ID和日期型ProductionDate两个字段,对应的结构体记为Structure<Product>,相应的映射函数输入则是{(整数终端,ID),(日期终端,ProductionDate)}。在结构体Structure <Product>匹配到所有需要映射的数据后,Build函数首先会创建一个新的Product类型实例,然后根据映射表把对应的匹配数据赋值给该实例相应的字段。
1.3 联合体模式
联合体(Union)用于表示可匹配多种模式中的任意一种,多种模式称为联合体的备选模式,备选模式可以是终端、结构体、联合体和数组,备选模式进行“|”运算(即或运算符)得到联合体。联合体仅表示对多种模式的选择,没有具体的映射作用。
1.4 数组模式
在所需的目标数据的模式中,可能存在某个终端或某个结构体循环出现的情况。所以设计了数组(Array)这种模式用于描述此类循环结构,循环结构的基本单元称为数组的元模式。许多程序设计语言中都有数组这个概念,数组即相同类型数据的序列,因此数组应有预定义的类型来限定其中数据的类型,本文所提出的数组模式也有相应的类型限定,可表示为Array<Data Type>。数组分为可空数组和不可空数组,可空数组如其名称所示,其中的元素模式可以不匹配任何文本,类似于正则表达式中的“*”限定符;不可空数组则表示必须至少有一个元素模式匹配到文本,和正则表达式中的“+”类似。与上文所述的结构体相同,Array也有映射和构建两个过程,其映射函数叫Item,以终端或结构体作为输入参数,当多次调用Item函数进行映射时,表示数组的元模式可以是这些参数模式中的任意一种,即“或”的关系;Build函数在构建时首先会根据元模式匹配到的数据数量创建一个对应长度的数组,然后将这些数据按匹配顺序赋值到相应索引的数组单元中。
2 模型应用示例
为了具体地阐述模型的使用方法,本节将通过数据提取示例来演示模型定义过程。假设有一段文本:“......。产品信息:A的价格为100元,于2020年1月1日出厂,销往北京、上海和天津;B的价格是200元,出厂于2020年1月5日,销往广州、贵阳以及成都。...”,需要提取的信息以C#中的类表示如下:
class Product
{
public string name; // 產品名
public double price;// 价格
public string[] salesArea;// 销往地区
}
classProductCollection
{
public Product[] products; // 存储多个产品的
信息
}
接下来通过本文提出的模型来定义模式。
首先定义终端:posInt(正数),date(日期),location(地点关键词)=北京|上海|天津|广州|贵阳|成都,any(任意字符),然后定义数据映射,以下代码所使用的语法都为C#语法:
var locations = new Array<string>(“、”, “和”, “以及”); // 参数表示数组元素之间的分隔符
locations.Item(location); // 设置元模式
varproduct = new Struct<Product>();
product.Construct((any, “name”), Keyword(“的价格”), Keyword(any), (posInt, “price”), Keyword(any), Keyword(“销往”), (locations, “salesArea”)); // Keyword(string)是一个函数,将输入的字符串打包成元组(关键词终端[string],null)。用于表示模式需要匹配的关键词,但因为其对应的字段名为null,该词在Build时不会被记入相应的类实例中。Keyword(终端)是Keyword(string)的重载函数,它直接将输入的终端打包成元组(终端,null)。 varproductArr = new Array<Product>(); // 产品数组
productArr.Item(product); // 将元模式设置为product
varproducts = new Struct<ProductCollection>();
products.Construct(Keyword(“产品信息:”, (productArr, “products”));
以上就是以产品集合类数据为目标数据定义的面向模式的文本数据描述模型,其中联合体的关键字Union没有显式出现过,它通常仅作为“|”运算的返回值而不需要单独存储于变量中。
3 结束语
本文定义了面向模式的文本数据描述模型中四个关键的概念:终端、结构体、联合体和数组,详细描述了各类模式在匹配过程中的作用。终端为最基本的子模式,它在匹配过程中体现匹配实际内容的作用;结构体和循环体表示了两种结构的模式,用于将模式与数据进行映射,并自动创建数据实例;联合体在匹配过程中起到模式任选的作用。最后通过实例演示了该模型的使用方法,体现了模型的结构性与便利性。目前该模型仅有抽象的定义,用于模式匹配的引擎未在文中涉及,这是下一步需要完善的研究内容。
参考文献:
[1]丁玉飞,王曰芬,刘卫江.面向半结构化文本的知识抽取研究[J].情报理论与实践,2015,38(03):101-106.
[2]王云鵬.非结构化文档数据抽取与分析系统的设计与实现[D].天津大学,2012.
[3]Zhe Fu, Li Jun. Spectral Clustering based regular expression grouping[A]//ANCS 2014-10th 2014 ACM/IEEE Symposium on Architectures for Networking and Communications Systems[C]. Marina del Rey, CA, United states: Association for Computing Machinery, Inc, 2014:243-244.
转载注明来源:https://www.xzbu.com/1/view-15180095.htm