焦点期刊
投稿咨询

著作编辑 著作编辑

咨询邮箱:1117599@qq.com

计算机论文

中文分词的预处理技术探讨

时间:2023-07-01 12:52 所属分类:计算机论文 点击次数:

  摘要:分析基于词表的最大匹配分词算法,针对其缺陷设计了一个附近字表,内容为高频字在词表中出现的左边首字和右边首字。设计的算法根据高频词的特点,将句子尽可能多的分成段,然后将段进行最大匹配。当发现句子中高频词时,只取句子中高频词的左边首字和右边首字在附近字表中查找;若未找到,则表示句子中此高频字单独成词,无需在词表中匹配,从而减少高频字单独成词时的匹配时间,进而减少整个分词过程的时间。通过实验证明此技术能提高中文分词的效率。

  关键词:高频词; 预处理; 中文分词

  0 引言

  隨着自然语言处理的发展,分词作为基础任务成为研究重点,中文因其复杂性和特殊性成为分词热点话题。中国知网和Web of Science的相关论文显示,自2010年分词研究达到小高峰后,中文分词研究热度再次缓步增长。作为自然语言处理的基础任务,分词究竟有没有必要,Li等在2019年ACL会议上提出此观点,并在机器翻译、文本分类、句子匹配和语言建模4个NLP任务上验证分词的非必要性,但这并不说明分词研究不再有意义[1]。词级别模型欠佳表现在数据稀疏、过拟合、OOV以及数据迁移能力缺乏等方面,要解决此类问题,提高分词性能仍有重大意义。由于词是最小的能够独立运用的语言单位,而汉语文本不像西方的书面语言,其词与词之间没有任何空格之类的显式标志指示词的边界,因此汉语的自动分词问题就成了计算机处理汉语时的首要基础工作,涉及自动翻译、文本检索、语音识别、文本校对及搜索等领域,是诸多应用系统不可或缺的一个重要环节[2]。

  1 中文分词的现状

  分词就是将连续的字符串或序列按照一定规范重新组合成词序列的过程。目前,已经有很多成熟的汉语分词技术。邹海山等在现有分词技术的基础上提出一种基于词典的正向最大匹配和逆向最大匹配相结合的汉语分词方案,可以高效、准确地实现中文文档的主题词条抽取和词频统计;应志伟等基于一个实际的文语转换系统,改进最大匹配算法,从实用角度解决多音字的异读问题和中文姓名自动识别问题;欧振猛、余顺争采用基于自动建立词库的最佳匹配方法进行中文分词[3]。

  分词方法的性能可以从准确性、高效性、通用性和适用性等几个方面来衡量。但考虑到分词算法的应用领域大多对实时性和准确性两方面有很高的要求,因此,实现较简单的机械式分词法中的正向最大匹配法仍然是应用最为广泛的一种方法。

  吴育良在百度中文分词技术浅析一文中提出百度分词使用的就是正向最大匹配法的推测[4];而中科院软件所的张俊林在百度分词算法分析一文中提出百度分词采用的是双向最大匹配算法(即正向最大匹配和反向最大匹配相结合)的推测,同时提到Google采用的是正向最大匹配分词算法。下面就首先介绍正向最大匹配算法的基本原理,然后介绍本文中提高效率的预处理技术。

  2 正向最大匹配算法基本原理

  正向最大匹配算法的切分原理是:①将文本内容按标点符号分成句子集。②对于句子集中每一句子,假定词典中最大词长为L,对于待切分的句子,从句首取长度为L的字串进行匹配,如果匹配成功则认为此字串为一个词,再从下一个字开始继续该过程;如果匹配不成功,则去掉此字串的最后一个字进行匹配,直至匹配成功或子句为空。例如:对于文本中的字串ABCD,其中AB∈W,ABC∈W,ABCD[?]W,那么切分结果为:ABC/D。

  3 高频词的预处理技术及算法设计

  本算法与常用的基于词典的最大匹配算法不同之处在于:在文本按标点符号及段落切成若干小段过后,先进行高频词的匹配,而此匹配不同于最大匹配算法,词典的结构也有所不同,这将在后续章节中做详细阐述。这样提前处理的优点就是将段(按标点符号切分生成的)再继续切分,以减少之后最大匹配的次数,从而减少整个分词过程的时间,提高效率,这也是本算法的优势所在。由于此操作发生在最大匹配之前,故在本文中称之为预处理过程。

  本算法实验中用到的词库来自搜狗实验室的互联网词库(SogouW),其来自于对SOGOU搜索引擎所索引到的中文互联网语料的统计分析,统计所进行的时间是2020年10月,涉及到的互联网语料规模在1亿页面以上。统计出的词条数约为15万条高频词,除标出这部分词条的词频信息之外,还标出了常用的词性信息。

  3.1 算法理论基础

  举个最大匹配的例子:待切分字串为:ABCDEFG。词典中最大词长L为7。词典W内容为:AB、CD、EF。则匹配步骤为:①ABCDEFG[?]W、ABCDEF[?]W、ABCDE[?]W、ABCD[?]W、ABC[?]W、AB∈W,切分:AB/CDEFG;②CDEFG[?]W、CDEF[?]W、CDE[?]W、CD∈W,切分:AB/CD/EFG;③EFG[?]W、EF∈W,切分:AB/CD/EF/G;切分完成。可以看出:上述三步中,总共12次匹配,只有3次匹配是有效的,其他的匹配都是无效的。如果能有方法提前确定CD或EF是一个词,那么总的匹配次数将大大减少。

  本文的出发点就是提前确定句子中常用的词,然后进行最大匹配。为了减少这种提前操作的盲目性,本文提出了基于高频字的预处理技术,高频字的特点是在文章中出现频率很高,因此,本算法的目的就是通过对高频词提前识别这一预处理方式,来减少无效匹配的次数,从而提高分词的效率。

  3.2 高频词表的内容和数据结构设计

  高频词表的内容有两部分组成:①单个字的高频字;②含有①中高频字的所有词。在化柏林[5]的文中给出了从1989~2005年图书情报学中文核心期刊的42989篇论文的摘要中(其中1996年以前的很多论文没有摘要)经过分词提取,得到高频字,除了标点符号分别是:的、和、了、与、在、及、是、对、中、为、从、等、上、以、下、个。这就组成了本算法中高频词表内容中的第一部分。然后将词库(SogouW)中所有含第一部分高频字的词找出,构成了本算法中高频词表内容的第二部分,第二部分含有第一部分中的高频词的个数分别是:的(246)、和(347)、了(1113)、与(195)、在(767)、及(174)、是(493)、对(422)、中(2089)、为(890)、从(243)、等(250)、上(1415)、以(659)、下(1297)、个(491)。

  孙茂松[6]等人对整词二分法、Trie索引树和逐字二分法三种常用的分词词典机制进行了详细分析,这些机制都采用首字Hash索引,而本算法中第一部分中的高频词在第二部分中并不总是出现在首位,例如:含“的”的“的士”,“目的”和“有的放矢”。因此,本文根据原有的词典机制,设计出三个表组合的词典机制:高频字表(上述第一部分所有的高频字)、附近字表(上述第二部分包含高频字附近的词即左、右边首字)和词表(上述第二部分所有的词),其结构如图1所示。

  3.3 高频词表数据结构设计说明

  本算法设计了一个附近字表,其内容为高频字在词表中出现的左边首字和右边首字。当在句子中发现高频字时,则只取句子中高频字的左边首字和右边首字在附近字表中查找;若未找到,则表示句子中此高频单独成词(如“书和笔”中的“和”),无需在词表中匹配,从而减少高频字单独成词时的匹配时间。当句中高频字不单独成词(如“维护和平”中的“和”)时,会在附近字表中找到“平”,然后将首字和关键字两字一起出现的词(即“和平”)在词表中的区间进行匹配。

  3.4 算法描述

  輸入:一个文档数据中所有句子集合中的一个句子S:{t1,t2,……tn},tj为S中第j个字

  输出:经预处理后的句子NS

  // LH为高频字表,其中第k个区域是LHk:{Text,Num,Lpos,Rpos},Text为高频字;Num为含高频字的词的数目,Lpos为左边首字指向对应附近词表的起始位置;Rpos为右边首字指向对应附近词表的起始位置

  // LN为附近字表,其中第k个区域是LNk:{ Text, Num, Pos},Text为首字;Num为含首字和高频字组合的词的数目;Pos为指向对应词表的起始位置

  // LS为词表,其中第k个区域是LSk:{ Text,Len,Pos},Text为词;Len为词的长度,即所含字的个数;Pos为高频字在词中出现的位置

  // length为集合或表的长度,即元素的个数

  [integer LastPos;//记录当前句子最后一次分割的位置

  procedure segment ()

  LastPos←0;

  for j←1 to S.length do

  if LastPos>j then j←LastPos endif //分割位置在当前关键字位置之后,表示右部首词已分割,匹配从最后分割位置开始

  for k←1 to LH.length do

  if S.tj==LHk.Text then

  if S.tj-1≠NULL then

  for m←LHk.Lpos to LHk.Rpos do

  if S.tj-1==LNm.Text then call match(S,j,LNk);break; end if

  repeat

  end if

  if LastPos>j then break end if //分割位置在当前关键字位置之后,表示右部首词已分割

  if S.tj+1≠NULL then

  for m←LHk.Rpos to LHk.Num-LHk.Rpos do

  if S.tj+1==LNm.Text then call match(S,j,LNk);break end if

  repeat

  end if

  break //跳出循环,匹配句子中下一字

  end if

  repeat

  repeat

  end segment

  procedure match (S,j,LNk) //找出句子中含高频字的词,并放入NS中

  integer s,e

  for n← LNk.Pos to LNk.Pos+ LNk.Len do

  s← j - LNk.Pos , e← s + LNk.Len

  if LSn.Test== S.tsts+1……te then

  NS.put(S.tsts+1……te) //将匹配出成词的字串做出标记放入NS中

  LastPos←e

  end if

  repeat

  end match ]

  3.5 算法举例

  例句:“这个方案的目的是可以高效准确地实现中文文档的主题词条抽取和词频统计”。经过预处理后句子为:“这个/方案/的/目的/是/可以/高效准确地实现/中文/文档/的/主题词条抽取/和/词频统计”(加粗部分为本算法匹配出的高频词)。

  4 实验结果及分析

  本文的实验是基于Apache Jakarta家族中的开源项目Lucene,实验数据来自搜狗实验室的全网新闻数据(SogouCA)的精简版(一个月数据, 437MB),其数据来自若干新闻站点2020年5月-6月期间奥运、体育、IT、国内、国际等18个频道的新闻数据,提供URL和正文信息。本实验针对正向最大匹配算法,在相同实验环境下,选取不同的数据集,进行三次数据测试,其实验结果见表1。

  从表1可以看出,经过预处理后的变化:①分词速度有明显的提高,证明了此預处理技术的可行性;②分词正确率没有降低,因为此预处理过程同样是基于词典的匹配过程。这说明该方法具有一定的实用性。切分错误原因主要有两个方面:一是未登录到字典中的词;二是含有错别字的字串。

  5 结论

  随着中文信息处理技术的发展和互联网信息数据的日益增加,对中文分词的速率要求越来越高,作为中文分词基础的词典机制研究已成熟。本文研究现有的基于词典的最大匹配算法的机制,根据高频词的特点,通过提前匹配出所有高频词进而把整个文本分成更多的段,从而提高分词的速度,并且高频词出现次数越多,该算法的性能越好。当然此算法只是在分词速度上有所提高,而对于正向最大匹配算法的分词准确率及未登陆词的识别等没有改善。

  参考文献:

  [1] LI X, MENG Y, SUN X, et al. Is word segmentationnecessary for deeplearning of chinese representations?[c].Proceedings of the 57th Annual Meeting of the Association for Computational Linguistics,2019:359-401

  [2] 宗成庆.统计自然语言处理[M].北京:清华大学出版社,2008

  [3] 王佳楠,梁永全.中文分词研究综述[J].软件导刊,2021,20(4):247-252

  [4] 吴育良.百度中文分词技术浅析[J].河南图书馆学刊,2008,28(4):115-117

  [5] 化柏林.知识抽取中的停用词处理技术[J].知识组织与知识管理,2007(8):48-51

  [6] 孙茂松,左正平,黄昌宁.汉语自动分词词典机制的实验研究[J].中文信息学报,1999,14(1):1-6