解决词义分类合并问题的一种方法

2022-09-10

当人们使用电子词典对批量的单词数据进行翻译时, 常常使用基于词汇匹配的方法进行处理。经过一定的预处理步骤, 常常会得到某一词汇翻译结果的如下表达形式:

其中, M表示词义, S表示词义与所属专业的分隔符号, P表示专业分类, […]表示其中的内容是可选的。出现式 (1) 的结果, 一方面有电子词典本身数据的组织编排问题, 另一方面也可能是由前面的预处理步骤造成的问题。如何对上面的结果进行调整, 使之转换为式 (2) 的表达形式, 以便更清晰的将翻译结果展示出来, 也有利于今后翻译结果的分类统计工作。

举例来讲, 对于词语polarization, 经过匹配阶段的预处理步骤, 可以得到匹配结果如下:

定位性[专业]电;极化作用[专业]电磁电子;极化强度[专业]电磁;偏振作用[专业]物。

现在需要经过词义分类合并将其变换为:

定位性[专业]电;极化作用, 极化强度[专业]电磁;极化作用[专业]电子;偏振作用[专业]物。

经过按专业合并词义之后, 翻译结果的形式更加清晰了。对于后续处理, 无论是进一步按统一规范化文本的形式展现和存储, 还是按照具体需求, 依据分类标准对文本信息进行提取和词义内容的统计分析, 都变得更加便捷。

1 相关技术概要

1.1 DataTable对象

DataTable类是.NET Framework类库中System.Data命名空间的成员, 可以独立创建和使用DataTable, 也可以与其他.NETFramework对象一起使用。使用DataTable构造函数初次创建DataTable时, 是没有表架构的。要定义表的架构, 必须创建DataColumn对象并将其添加到表的Columns集合中。除架构以外, DataTable还必须具有行, 在其中包含数据并对数据排序。DataRow类表示表中包含的实际数据。DataRow及其属性和方法用于检索、计算和处理表中的数据。在访问和更改行中的数据时, DataRow对象会维护其当前状态和原始状态。

1.2 泛型

泛型是一个强大的特性, 对于集合类尤其如此。泛型类使用泛型类型, 可以根据需要用特定的数据类型替换泛型类型。它减少了由于集合元素进行装箱和拆箱操作所带来的性能损失, 并减少了不必要的类型转换, 提升了元素的类型安全, 此外, 使用泛型编程还有利于代码的重用和扩展。

1.3 String对象与StringBuilder对象

文本数据处理中常常涉及大量字符串的串联操作。String类和StringBuilder类是最为常用的处理词类问题的对象。String对象串联操作总是用现有字符串和新数据创建新的对象, 它比较适合于串联固定数量的String实例;而StringBuilder对象维护一个缓冲区, 以便容纳新数据的串联。如果有足够的空间, 新数据将被追加到缓冲区的末尾;否则, 将分配一个新的、更大的缓冲区, 原始缓冲区中的数据被复制到新的缓冲区, 然后将新数据追加到新的缓冲区。因此, 如果串联任意数量的字符串, 使用S t r i n g Builder则会极大的提高性能。

2 解决方案

2.1 方案基本思路

本方案分为数据整理和生成输出两个阶段, 如图1所示。

具体来讲, 处理过程是按照下面的顺序进行的。

(1) 在数据整理阶段, 输入数据由多个形如式 (1) 的数据序列组成, 之间由分隔符号连接 (此处为;) 。处理程序首先按照分隔符号将数据序列分割成多个子序列。

(2) 建立DataTable对象myTb和List对象lstzy, 其中, myTb用来按照分类存储词义, lstzy则用来存储各个专业类别。

(3) 遍历步骤1得到的数据序列, 每个序列可以拆解为词义+专业 (一个或多个) 组合的形式。将唯一专业类别存入lstzy, 将词义及所属专业存入myTb。

(4) 遍历lstzy, 根据当前的遍历值, 从myTb中取得对应的词义 (一个或多个) , 使用StringBuilder组合起来, 最终生成形如式 (2) 的输出结果。

2.2 关键步骤与实现

(1) 数据存储单元的建立。

首先建立DataTable对象的实例myTb, 以便按照专业类别扁平化存储词义。myTb建立后, 必须要结合DataColumn对象才具备实际应用的价值。DataColumn是创建DataTable的架构的基本构造单元, 可以通过向DataColumnCollection中添加一个或多个DataColumn对象来生成这个架构。DataColumn定义了DataTable中某列的属性, 例如, 该列的数据类型、长度, 以及其它的对数据的输入和更新施加限制的、从而确保数据完整性的属性。在本方案中, 我们使用以下的语句构造所需的Datable。

此外, 还使用Listlstzy=new List () 建立了唯一化存储专业类别的动态数组。List类是ArrayList类的泛型等效类, 该类使用大小可按需动态增加的数组实现IList泛型接口。后面在对List中已经存储的专业类别进行判断时, 调用了Contains方法, 有效的提升了性能, 增强了类型安全。

(2) 数据存储操作。图2

此过程是循环遍历已被分割成统一格式的子序列数据的集合, 对集合中的每一个元素, 按照预定的格式规则取出专业类别及词义解释, 存至上面建立的存储单元lstzy及myTb中。提取规则可以按照词义和专业的分隔标志[专业]来操作, 如这里的有关实现代码为:

接着, 就可以将提取的内容放至相应的单元中去。需要注意的是, 为保证存至lstzy的专业类别的唯一性, 在存储之前, 需要调用List的Contains方法对该元素是否已经存在于集合中进行判别, 若已经存在该专业类别, 则lstzy的本次存储操作就无须进行了。此外, 注意到一种词义可以属于多个专业类别, 故而上面提取的所属专业内容仍然需要进一步的精细化处理, 以便将该词义对应的全部专业类别一一提取出来。

(3) 生成输出操作。

生成输出是通过遍历唯一化的专业类别集合lstzy, 对于专业类别的当前值, 从myTb中提取有关的词义解释, 生成最终的形式化表达方式。这里的一个关键点是使用DataTable类的Select方法, 它依照条件从存储单元中动态提取全部符合要求的记录, 类似于通常的数据库的Select操作, 若当前遍历到的专业类别值为_zy, 则提取代码为:

其中, rowsfind为方法调用成功后返回的数据行的集合, 可以通过遍历此集合获得该专业类别下的所有词义解释。另一关键点是使用StringBuilder来处理形式化表达结果的生成, 它使用动态追加值的方式, 避免了像String类那样每次处理新字符串时都要在内存中重新开辟空间, 从而极大地提升了处理性能。

图2展示了应用上述方法解决词义分类合并问题的一个演示实例。可以看到, 通过转换, 词义序列被成功转换成了按照专业类别划分的表达形式。

3 结语

本文提供了一个基于.Net平台利用DataTable类并结合泛型类及StringBuilder类处理的解决方法。希望通过提供一个技术上能够实现的思路和方案, 为实际工作中的同类问题拓宽技术途径。

摘要:在文本处理的工作中, 经常会碰到按一定标准对预处理得到的文本进行合并分类的问题, 使用词典进行词汇批量匹配后的进一步分专业处理和统计是此类任务之一。为了高效处理大批量此类问题的数据, 本文提供了一种基于.Net框架下的解决方法, 以期抛砖引玉, 为解决类似的问题提供一种技术实现的途径。

关键词:词义合并,分类,.Net技术,DataTable

参考文献

[1] SahilMalik.Pro ADO.NET 2.0[M].Apress, 2005:112~115, 216~222.

[2] Nagel, C., Evjen, B., Glynn, J, 等[著].李敏波[译].C#高级编程[M].北京:清华大学出版社, 2006:245~256, 534~541.

[3] Microsoft.MSDN Library for Visual Studio[J].2005.

[4] Jay Hilyard, Stephen Teihet.C#Cookbook (2nd Edition) [M].2006.

[5] AllenJones, MatthewMacDonald.VisualC#2005Recipes:AProblem-SolutionApproach[M].Apress, 2006:31~33.

本文来自 99学术网(www.99xueshu.com),转载请保留网址和出处

上一篇:试论大学生安全责任观的培养下一篇:大学生英语合作学习的调查与分析

热门文章

解决方案