1、基于 Spark 的中文新词提取 丁祥武 张东辉 东华大学计算机科学与技术学院 摘 要: 为提高新词提取的准确率, 根据新词在时间上的性质引入时间频率函数值特征, 提出自动阈值获取算法。针对高处理效率特性, 基于 Spark 平台对海量语料库中新词提取方案进行研究, 提出一种分布式新词提取方案。对文本预处理, 统计文本中字串的特征值如互信息、上下文信息熵、时间频率函数值等, 建立巨大的领域及时间相关的结构化数据库, 通过阈值及背景词库的过滤实现新词提取, 将提取的新词添加到背景词中。实验结果表明, 该算法具有较高的准确率, 在大规模语料库处理效率上相比传统方法有了大幅提升。关键词: 新词识别;
2、 互信息; 上下文熵; 时间频率函数; 阈值; 作者简介:丁祥武 (1963-) , 男, 湖北仙桃人, 博士, 副教授, 研究方向为数据库、列存储、分布式处理技术;作者简介:张东辉 (1997-) , 男, 河北保定人, 硕士研究生, 研究方向为大数据处理技术、分布式处理等。E-mail:收稿日期:2016-09-23基金:上海市科技行动计划基金项目 (15511106900) Extraction of new words based on SparkDING Xiang-wu ZHANG Dong-hui School of Computer Science and Technology
3、, Donghua University; Abstract: To improve the accuracy of new word extraction, the time frequency function value was introduced according to the nature of new words in time, and an automatic threshold acquisition algorithm was proposed.For the characteristics of high processing efficiency, based on
4、 Spark platform, a method of extracting new words from massive corpus was studied, and a scheme of distributed word extraction was presented.The corpus was preprocessed, and its eigenvalue such as mutual information, context entropy, time frequency function value etc.were counted, and a vast field a
5、nd time related structured data pool was established.Through the threshold filter and the filter of background vocabulary words, the extraction of new words was achieved.These words were added in the background word lexicon.Results of the conducted experiment show that the proposed algorithm has hig
6、her accuracy rate.Compared to the traditional method in large-scale corpus processing, the efficiency is greatly improved.Keyword: new word detection; mutual information; context entropy; time frequency function; threshold; Received: 2016-09-230 引言新词提取主要分为两个阶段:文本预处理及新词识别。对于文本预处理, 目前方法主要分为两种:一种是基于词典的
7、分词 (以词为单位) , 选取中国科学院研发的汉语词法分析系统 (institute of computing technology Chinese lexical analysis system, ICTCLAS) 作为分词工具对语料进行中文分词1,4。基于词典的词语切分方案, 好处是可以大幅降低计算复杂度, 不足是若切分词语错误, 则这种错误会向后传递, 致使可能是新词的字串无法被提取;另外一种是基于统计 (以字为单位) , 张海军等5使用重复模式依据词频、前缀、后缀等特征信息提取候选新词。申国伟等6使用左右侧信息熵以及结合度, 并通过手动设置阈值进而对字串进行扩展, 提高了新词、口语化词
8、的准确率。新词识别的方法主要有两种:一种是基于规则, 主要依靠专有词典和规则来识别新词。丁建立等7使用免疫遗传算法, 并在此基础上借助构词规则对候选新词进行过滤与召回。基于规则的方法准确率高、针对性强, 但由于汉语的灵活性, 不同领域文档的词语分布规则存在差异、难以穷尽、处理代价高、可移植性差、维护困难, 因此该方法覆盖面较窄、适应性较差。另外一种是基于统计, 提取词的多个特征值, 使用特征值的阈值过滤方法, 完成新词识别。李勇等8统计其特征值, 如串长、互信息和色子矩阵等, 通过阈值过滤的方式进行新词的提取。基于统计的方法有较强的适应性, 但需要以大规模的语料作为前提, 此外传统的阈值过滤方
9、法中阈值的设定, 完全依赖于用户9, 这显然是不合理的。综合上述原因, 本文进行了基于 Spark 的中文新词提取方案的研究与实践, 提出了相应的中文新词提取算法。1 相关概念1.1 技术1.1.1 SparkSpark 是一种快速、通用的分布式集群框架10, 其基于内存计算以及粗粒度的 RDD (resilient distributed datasets) 机制非常适合于迭代型的分布式计算。RDD 中包含两种操作算子:转换算子 (transformation) , 常见的方法有map、filter、takeSample。执行算子 (action) , 常见的方法有collect、reduc
10、eByKey、saveAsTextFile。1.1.2 HDFSHadoop 分布式文件系统 (Hadoop distribute file system, HDFS 简称 DFS) 被设计成可运行于普通的硬件之上的分布式文件系统11, HDFS 具有强大的容错能力, 高数据吞吐能力。非常适合大规模数据集上的应用。1.2 定义1.2.1 字串定义定义一个字串 s, s 的长度 n 表示构成该字串的单字个数。s i表示构成 s 的子串, ni表示 si的长度, 则字串 s 可以表示为1.2.2 新词定义第一, 从词的性质上看, 新词应该是可以独立成词的;第二, 从时间性质上看, 新词应该是这个词
11、语在某个时间点之前一段时间是没有出现的, 刘长征12在大规模语料库之上, 验证了新词曲线将来的变化趋势将会在短时间内达到一定高度之后逐渐下降;第三, 从分布空间上看, 新词的出现应该是具有领域相关性的;第四, 从构成上看, 中文新词是除去时间词、纯英文词和数量词之外的词。综上所述, 本文将具有如上性质的字串 s 定义为新词。1.3 公式1.3.1 共现概率公式字串共现概率即相邻字串在文档中重复出现的频率, 我们定义 Co (s, s) 为字串 s 与 s的共现概率, 则共现概率定义如下其中, C (s) 表示字串 s 在语料库中出现的频数, C (s, s) 表示字串 s 与s在语料库中同时出
12、现的频数。1.3.2 互信息公式互信息是信息论中的一个概念, 可以用来衡量两个事件的相关程度。传统的互信息公式为其中, p (s) 是字串 s 在语料库中出现的概率。传统的公式过高地估计低频且共现的字串间的结合度13, 因此本文对传统的互信息进行拓展, 改进原有互信息使其能够评测多个事件相关程度, 由于 s 有多种成词模式14, 故而本文互信息公式定义如下1.3.3 左右侧上下文熵公式研究表明, 语料中一个有意义的词语往往能够灵活地出现在各种不同的环境中, 具有丰富的左邻字集合和右临字集合。信息熵能够反映已知一个事件的结果后平均会带来多大的信息量。本文左右侧信息熵定义如下其中, C (l i,
13、 s) 表示 li与 s 共现的次数, l i表示与该词相邻的左侧单字, r i表示与该词相邻的右侧单字, n 为总字串数量, m 为去重后 s 的邻侧单字个数。1.3.4 时间频率函数新词的产生必定与时间有关, 刘长征12在大规模语料库之上, 验证了新词曲线的变化趋势。据此, 本文提出了时间频率函数, 定义基本时间单位为 g, 某一领域下语料库时间跨度为 t, 则可将该领域语料库划分为 个单位时间, 在此基础上, 定义时间频率函数如下所示其中, C i (s) 表示字串 s 在第 i 个单位时间里出现的频数, n 表示语料库中不同字串的数量, w 表示该语料库中字串的总数, p i表示该语料
14、库中所有字串在第 i 个单位时间里的频率总和, C (s) 表示该语料库中字串 s 出现的频数。2 新词提取方案2.1 时间频率函数值特征一个词的时间频率函数值特征 (word time frequency, WordTF) 是指其在各个单位时间内通过时间频率函数获取的时间频率函数值 (0) 的整体变异系数。为了验证该特征值对新词与登录词的识别是否有效, 本文首先计算新词抽取结果 (未包含时间频率函数值阈值过滤) 中时间频率函数值特征的变异系数极差, 然后按百分比依次取极差的 20%, 40%, 60%, 80%为阈值对结果进行过滤, 从结果中随机选取 50 条记录, 绘制登录词和未登录词的条
15、形图如图 1 所示。图 1 新词与登录词条形图 下载原图从图 1 可以中可以看, 随着变异系数的逐渐增大, 新词的所占比例也逐渐增多。因此, 该特征值是有效的, 这意味着在新词识别阶段, 对该特征值的过滤将进一步提高新词提取算法的准确率。2.2 自动阈值获取算法由于词与非词之间的特征值在总体上一定有一个比较大的区别, 故而本文将词与非词的特征值与特征值频次绘制成散点图, 之后对散点图进行曲线拟合, 并对拟合后的曲线做进一步研究。图 2 是以互信息 (10) 与其频数为研究对象对其进行拟合的结果。图 2 互信息曲线拟合 下载原图从图 2 中可以看到拟合后的曲线大体上符合散点图的走势, 且阈值的人
16、为选择较难, 这便说明本文提出的针对拟合后曲线进行自动阈值获取的工作是有意义的, 具体自动阈值获取算法如算法 1 所示:算法 1:GetThreshold输入:输出:阈值(1) 使用 Spark MLlib StandardScaler 对原始特征值进行缩放和标准化。(2) 将缩放标准化后的结果保存至 HDFS。(3) 从 HDFS 中获取步骤 (2) 中数据, 使用 Python 绘制散点图, 并对原始数据进行曲线拟合。(4) 在拟合曲线上顺序等间隔取 3 点, 分别记为 A (x0, y0) , B (x1, y1) , C (x2, y2) (x0格式保存。(4) 以字串 s 为 Key
17、 并将原始 RDD (date, s, count) 转化为 RDD (s, 1) , 调用 reduceByKey 方法获取该领域下不同字串的数量 n。(5) 以字串 s 为 Key 并将原始 RDD (date, s, count) 转化为 RDD (s, count) , 调用 reduceByKey 方法获取该领域下字串 s 的频数 C (s) , 并以RDD (s, C (s) ) 格式保存。(6) 以字串 s 以及时间序号 date 作为 Key 并将原始 RDD (date, s, count) 转化为 RDD ( (date, s) , count) , 使用 reduceBy
18、Key 方法获取该领域及某一时间序号下字串的数量 Ci (s) , 通过转换, 最终以 RDD (s, (date, Ci (s) ) ) 格式保存。(7) 将 RDD (s, (date, Ci (s) ) ) 和 RDD (s, C (s) ) 做左外连接, 通过转换最终以 RDD ( (s, date) , (C (s) , Ci (s) ) ) 格式保存。(8) 依据时间频率函数, 计算某一词在单位时间内的时间频率函数值, 并绘制历时变化曲线图。(9) 依据新词与非新词的曲线特征, 统计字串的时间频率函数值特征值, 并通过自动阈值获取算法提取出阈值。(10) 循环步骤 (2) 步骤 (
19、9) 操作直至提取完所有领域值。2.4 新词提取流程新词提取中有两个主要的待处理问题:其一, 将原始语料库高效转化为结构化数据。其二, 新词识别。因此, 本文设计新词的提取流程如图 4 所示。图 4 新词提取总体流程 下载原图如图 4 所示, 本文新词提取主要分为 3 个阶段:第一, 文本预处理, 基于 Spark平台将原始语料库转化为结构化数据, 并将结构化数据存储在 HDFS 中。第二, 新词识别, 根据背景词滤除当前词组合中的旧词, 并获取结构化数据中特征值的阈值, 通过阈值过滤进而得到符合成词规则的词组合。第三, 完善背景词库, 添加新词到背景词库。2.4.1 文本预处理阶段在新词提取
20、的流程中, 对文本进行预处理是新词提取的基础, 本文选取搜狐新闻语料库作为研究对象。有研究指出 99%以上的词, 其长度都在五字及五字以下, 故本文将语料库划分为 n 字串 (n=2, 3, 4, 5, 6) , 图 5 是对文本数据进行预处理阶段的流程。图 5 文本预处理流程 下载原图原始搜狐新闻语料库中记录部分内容示例如下:国际足联主席布拉特抛出“6+5”计划已经有一段时间了, 当时他的计划就遭到了欧盟的反对, 如今德国足球名宿鲁梅尼格也站出来反对布拉特的“6+5”计划。(责任编辑:严国平) 如上述记录所示, url 内容中 sports 表示领域 (体育) 信息, 20080625 表示
21、时间 (2008 年 6 月 25 日) 信息, content 内容即为文本内容。本文借助于 Spark ETL 方案思想, 先统一化研究对象格式, 并滤除原始文本中的研究对象中无用的符号、字串, 然后对规则文本进行分词并对分词后的字串进行特征信息统计, 比如互信息、频数、左右侧上下文熵等等, 最终得到结构化数据存储在 HDFS, 具体本阶段的算法如算法 3 所示:算法 3:TextETL输入:原始记录输出:结构化数据(1) 从原始记录中提取领域 type、时间信息以及主体文本 msg。(2) 对提取的信息进行全角字符转半角字符操作, 并将提取信息中无用符号、无用字串、停用词替换为空格, 将
22、时间转化为时间戳。(3) 依据单位时间的设定, 将时间划分为 个单位时间, 并递增标注时间序号 date, 最终以 RDD (type, date, msg) 格式存储。(4) 以文本中空格、换行符、制表符为分隔符将文本划分为句子组合。以 RDD (type, date, List (msg) ) 格式存储。(5) 从首字开始直到尾字递增截取句子中长度不超过 Max (n) 的字串 s, 不足长度的在句子末尾添加 MYM 符号, 将生成的字串存储为 RDD (type, date, s) 。(6) 以 type, date 作为 key 对 RDD 进行 Combine 操作, 结果保存为 R
23、DD (type, date, List (s) ) 。(7) 对 RDD 中的字串数组进行排序, 排序方式为获取字串字节数组 bytes, 以字节数组中相同位置的 byte&0xFF 值作为排序依据, 并将排序后的字串保存在数组中。(8) 循环遍历排序后的字串数组, 提取字串 s 的首字 head, 之后递增截取 s 的子串 pre 及 pre 的右侧相邻字 suf, 统计 pre 的右侧相邻非重复字个数 rcount, 以及 pre 出现的次数 count。(9) 若循环过程中 head 与之前不同或访问到最后元素, 则表明已经完成以head 为首字的全部字串的统计工作, 依据上下文熵公式
24、计算信息熵 ce。将结果以格式保存到数组中。(10) 将步骤 (4) 中得到的字串数组中的所有字串颠倒顺序并保存在数组中, 之后执行步骤 (5) 步骤 (9) , 将得到的结果存储到另外一个数组中。(11) 将步骤 (10) 获取的中的 pre 颠倒顺序。(12) 将步骤 (9) 获取的结果及当前结果均以 pre 作为排序依据, 得到两个排序好的。(13) 将得到的结果进行合并, 并以格式保存。(14) 构建三分搜索树 (ternary search trees) 将每一组中 pre 及 count 插入到树中的一个节点。(15) 依据 pre 长度 n 获取其所有成词模式, 对 pre 进行
25、划分得到子串s 1s2si,根据互信息公式计算互信息 dmi。将结果以格式保存到 HDFS。2.4.2 新词识别阶段新词提取流程中, 新词识别是新词提取的关键, 新词识别一般过程是先对结构化数据中的非词进行滤除, 然后基于背景词滤除旧词, 最后通过时间频率函数值滤除遗漏的旧词及非词, 图 6 是新词识别阶段的流程。图 6 新词识别流程 下载原图具体本阶段对应的算法如算法 4 所示:算法 4:WordsFilter输入:RDD (type, date, pre, count, lce, rce) , RDDwords说明:words 表示背景词输出:领域相关新词(1) 背景词串滤除。(2) 针对
26、不同的特征值, 将步骤 (1) 中的 RDD 分别转换为 RDD (pre, 1) , RDD (lce, 1) , RDD (rce, 1) 。(3) 借助 WordCount 思想将特征值的 RDD 转化为 RDD (特征值, 频次) 。(4) 通过算法 1 获取特征值对应阈值。并据此对结构化数据进行 filter 操作, 最终将结果保存为 RDD (type, date, pre, count) 。(5) 将数据输入到算法 2 中获取时间频函数值的阈值, 并据此对结构化数据进行 filter 操作, 最终将结果以保存到 HDFS。2.4.3 完善背景词库阶段完善背景词库是新词提取的最终目的, 本阶段将提取到的新词从 HDFS 中提取并添加到原始背景词库。3 实验及结果分析