文本中不良文字信息的过滤方法及过滤系统的制作方法_2

文档序号:9708285阅读:来源:国知局
len的值,通过Mexlen对待过滤文本进行分词;
[0068]该步骤为关键步骤,对文本进行有效分词,能提高后续敏感词汇过滤的速度。为此,发明人进行了认真的思考和探索,得到如下分词需要遵循的原则:
[0069]1)颗粒度越大越好:用于进行语义分析的文本分词,要求分词结果的颗粒度越大,即单词的字数越多,所能表示的含义越确切。
[0070]2)切分结果中非词典词越少越好,单字字典词数越少越好,这里的“非词典词”就是不包含在词典中的单字,而“单字字典词”指的是可以独立运用的单字。
[0071]3)总体词数越少越好,在相同字数的情况下,总词数越少,说明语义单元越少,那么相对的单个语义单元的权重会越大,因此准确性会越高。
[0072]在现有分词技术中通常使用的是正向最大匹配算法,其主要弊端在于初始词长MaxLen的值固定不变,S卩分词过程中切分出一个词之前,总是先对MaxLen赋一个固定的初始值。最大词长初始值不变容易导致两个问题:(1)词长过短,长词就会被切错;(2)词长过长,效率就比较低。
[0073]初始化待切分字串S1,输出词串S2,最大词长Maxlen;假设分词词典中最长词条所含的汉字个数是MaxLen,每次从待切分字串S1的开始处截取一个长度为MaxLen的字串W,令W同词典中的词条依次相匹配,如果某个词条与其完全匹配则把W作为一个词从S1中切分出去,然后再从S1的开始处截取另一个长度为MaxLen的字串,重复与词典中词条相匹配的过程,直到待切分字符串为空。如果在词典中找不到与W匹配的词条,就从W的尾部减去一个字,用MaxLen-Ι长度的字符串继续与词典中词条匹配,如果匹配成功则切分出一个词,否则再从W尾部减去一个字,重复匹配过程,直到匹配成功。它的工作流程如图1所示。
[0074]基于词典的分词方法之所以有算法设计简单、易实现、切词速度快等优点,很大程度在于设计了较好的词典结构。词典是切分出每一个词的依据,所能切分出词的数量取决于词典的规模。词典的结构是结合分词算法设计的。因此,为了配合上述算法,对词典进行了调整。
[0075]定义1以同一个字开头的、有相同长度(词条中含有的汉字个数相同)的一组词条称为词组。
[0076]定义2—个词典由很多的词组构成。
[0077]算法中查找词典时,一个字串总是先匹配以同一汉字开头的最长词,匹配不成功则匹配次长词条,如果此字串与有相同首字的所有词条相匹配,会浪费大量的时间;匹配不成功时此字串末尾去掉一个字再匹配词典,而词条递减长度不总是1,也可能会浪费时间。所以可以把以相同首字、相同长度的词条存为一组,这样可把整个词典存储于有序表中。一个字串再匹配词典时就只与具有相同首字、相同长度的组中的词条匹配,匹配次数大大减少。基于此,设计了适合于本文算法的词典存储结构。
[0078]所有词条先放在文本文件中。首先,词条按照首字字典顺序排列;其次,以同一个字开头的词,按照每个词的长度从长到短排列。词条排列有如从"阿拉伯联合酉长国"、"阿尔巴尼亚〃到〃阿姨〃,词条长度递减。在分词之前将词典读到内存中,词典在内存中的数据结构如图2所示。
[0079]词典由三部分组成:
[0080](1)首字哈希表
[0081]汉字在计算机中以内码形式存在,将内码计算后转为为区位码,再将区位码转换为一个十进制的数字,这个数字就是该汉字在Hash表中的序号。该序号指示了以该字为首字的词的词长表的入口地址。入口地址的计算为:
[0082]offset= (chl-0xB0)x94+(ch2-0xAl) (1)其中,offset为该字在Hash表中的序号,ch1、ch2分别为该字机内码的高字节和低字节。
[0083](2)词索引表
[0084]使词长记录了有共同首字的词条的长度,比如以〃辩〃为首字的词的长度有6、4、3、2这四个词长。词指针指示具有某个词长的词条的首地址。
[0085](3)词典正文
[0086]以组为单位存储词条。
[0087]基于上述算法改进思想及词典的对应性编排,该改进的正向最大匹配算法为:
[0088]FMM算法是一个在词典上顺序查找词的过程,最大词长MaxLen初始值为分词词典中最长词条长度,表1中显示大部分词是二字词、三字词和四字词,因此顺序查找往往是比较浪费时间的。缩小查找范围、减少查找时间、分出来的词长词优先是本改进算法要解决的问题。本文提出利用词典中词条的长度动态地确定词长MaxLen的值,根据所确定的词长从待切分字符串左边取相应长度的字符串与词典匹配,从而解决了分词过程中MaxLen初始值不变所带来的长词被切分错误和时间长、效率低的问题。对改进后的FMM算法描述如下:
[0089]输入:S1:待分词字符串;词典。
[0090]输出:S2:分词之后的词串,词之间用〃/〃间隔;S3:未登录词串,词之间用〃/〃间隔。
[0091]算法:
[0092]1)初始化:为S1赋初值,S2、S3初始值为空;
[0093]2)S1是否为空,如果不为空,继续,否则转15);
[0094]3)S1是否为单字,S卩S1的长度SILen是否等1。如果不是单字,继续,否则转14);
[0095]4)取S1左边第1个字W,通过Hash(W)查找到W在哈希表中位置,根据W在哈希表中位置得到指向以W开头的词的长度WLen的指针PLen ;
[0096]5)根据PLen找到词的长度WLen ;
[0097]6) S1 Len是否小于WLen,如果不小于,继续,否则转11);
[0098]7)根据词长指针PLen找到指向词条的指针Qw;
[0099 ] 8)取S1中长为WLen的字串Word与词典中长为WLen的词条逐一匹配,S卩与Qw指向的词条相匹配,匹配过程中Qw后移,遇到〃~ 〃结束移动;
[0100]9)长为WLen的字串是否与词典中同长度的一个词条相匹配,若匹配成功,继续,否则转11);
[0101]10)S2 = S2+fford+/// ’ ; SI = Sl-fford;转2); //分出一个词
[0102]ll)WLen是否为2,如果是,继续,否则转13);
[0103]12)S2 = S2+W+〃/ ’ ; S3 = S3+fford; SI = SI_W;转2); //S3为未登录词串
[0104]13)PLen++;转5);
[0105]14)S2 = S2+S1+II/II;//S1 是单字,直接把 S1 分出
[0106]15)输出 S2,S3。
[0107]由于每次都是从待分字串的左边切出一个词来,如果一个短词是一个长词的一部分,则把这个长词分出来,长词尽可能地长。比如〃中华人民共和国〃,这个词包含了 〃中华"、"人民"、"共和国"、"中华人民共和国"四个词,按本文算法,把这样的长词作为一个整词分出来。所以体现了〃长词优先〃的原则,并且使分出来的词的数量尽可能地少,也尽可能地减少了歧义。对于分不出来的词,则把词的首字输出到S2中,根据词典中以此首字开头的词条的长度取S1中的词串输出到未登录词串S3。
[0108]该基于该改进算法的待切分字串的切分方法为:
[0109]对一篇文档进行分词,需经过以下四个阶段:
[0110](1)加载词典阶段加载分词词典到内存中。首先在哈希表中存储首字。其次按照深度优先存储词长和词条。图2为词典在内存的数据结构。
[0111](2)文本预处理阶段标点符号是句子间的天然分隔符,按标点符号将文档切分成一个个句子,句子之间用〃/F隔开。文中如果有数字,则把相邻的数字分为一个词。全部标点符号存于标点符号过滤词典中,全半角的阿拉伯数字存于数字词典中,使用前把此二文本文件调入内存,以强类型列表List〈T>的形式存储。
[0112](3)分词阶段如果文档中有英文字符串,就按照有几个英文字符串就分成几个词。如果文档中有数字,则有几个数字串就分成几个词。这样整片文档中没有分词的只有汉字串。再对汉字串使用改进的正向最大匹配算法进行分词。
[0113](4)处理分词结果阶段所有与字典中没有匹配成功的词都将作为未登录词处理。经审核后,手工将未登录词添加到词库中。对已分出的词与敏感词库再做比对,屏蔽掉存在于敏感词汇中的词语,输出文本结果。
[0114]步骤3,循环判断分词后的每个词汇是否为敏感词汇,如果是敏感词汇,采用非敏感词汇替换敏感词汇后,输出替换敏感词汇后的文本。
[0115]在实际应用中,将封装好的分词算法嵌入程序中,加载自定义词典库、自行设定的敏感词库。文本内容通过分词技术后会被切分成若干词汇,依次比对词汇是否在敏感词库中,在敏感词库中则屏蔽。
[01
当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1