发明内容
本发明提供一种可过滤人工干扰的敏感词并且在实际应用中易于实现的基于文本内容的敏感词过滤方法。
本发明采用的技术方案是:一种基于文本内容的敏感词过滤方法,包括以下步骤:
构建中文敏感词库,将中文敏感词库中的中文词向中拼混合词进行扩充,形成中拼混合敏感词库;
通过单词查找树结构建立确定有限状态自动机中各个敏感词的转换函数,将中拼混合敏感词库中的敏感词构建成敏感词树;
根据敏感词树的结构在文本中对敏感词进行检索,对检索到的敏感词使用指定符号进行替换,完成敏感词过滤。
进一步的,所述单词查找树结构如下:
根节点不包含任何字符;除根节点以外的每个节点记录不定量的字符数以及结束标志位符号,子节点采用哈希机制;从跟节点到某一个节点路径上的所有字符串连接起来构成新的字符串;每个词的公共前缀共享一个分支。
进一步的,所述构建敏感词树包括以下步骤:
S1:以敏感词文本中的一行为一个元素添加到敏感词集合中;
S2:获取敏感词集合中的元素个数,初始化Map容器,即sensitiveWordMap,初始化nowMap=null;
S3:判断敏感词集合中的所有元素是否被访问,如果是,则结束,如果否,则转入步骤 S4;
S4:获取敏感词集合中的当前元素,即当前敏感词,初始化开始标志位,start=0;
S5:使nowMap指向sensitiveWordMap;
S6:获取当前敏感词的长度length,初始化敏感词的个数标j=0;
S7:若j≥length,则转入步骤S3;若j<length,则转入步骤S8;
S8:获取敏感词集合中的当前元素的第j个字符,若当前字符是“(”,则标志位start=j, j++并转入步骤S7;若当前字符是“)”,则截取start+1到j的字符串,赋给临时的字符串变量,并转入步骤S9;若是字母,则j++,并转入步骤S7;若为汉字,则把当前汉字赋给临时字符串变量,并转入步骤S9;
S9:将字符串变量给一个对象WordMap,若当前Map,中存在该敏感字,则nowMap指向WordMap,并转入步骤S10;若WordMap中不存在当前敏感字,则构建新的Map,即newWordMap,使nowMap指向newWordMap,并先把结束标志位设置为0;
S10:判断是否是该词中的最后一个字,若是,则设置结束标志位设置为1,并转入步骤S3;若不是,则j++,并转入步骤S7。
进一步的,所述中拼混合敏感词库构建过程如下:
S1:获取中文敏感词库中的汉字词语及对应的拼音;
S2:以汉字词语的每个字为单位放入一个字符串数组,将拼音以分隔符为单位放入另一个字符串数组,并获取词语的长度length;
S3:将汉字词语中的第一个字和拼音中的第一个拼音分装进队列,若length≥2时,初始化i=2,j=1,并转入步骤S4;若length=1,则转入步骤S9;
S4:若i<length,则转入步骤S5,若i≥lengh,则转入步骤S9;
S5:若j<2i,则转入步骤S6,若j≥2i,则使i++,j=1,并转入步骤S4;
S6:取出队列的头元素;
S7:取出的头元素后追加汉字数组中的第i个元素,并在取出的元素后追加拼音数组中的第i个元素,形成新的元素;
S8:将步骤S7中形成的元素分别***队尾,j++,并转入步骤S5;
S9:以队列中的一个元素为一行依次写入敏感词文本中,构成中拼混合敏感词库。
进一步的,所述敏感词检索过程如下:
S1:初始化敏感词结束标识flag=false,匹配标识数matchFlag=0,获取的文本内容中的当前字符word=0,word转化为字符串的标识key=null,nowMap=sensitiveWordMap,i=beinIndex 开始检测的位置,新建一个字符串变量StringBuffer对象给pinyin变量;
S2:若i<txt.length()被检测文本内容长度,则转入步骤S3,否则执行S4;
S3:获取被检测文本内容中的当前字符给获取的文本内容中的当前字符word,将word 转化为字符串变量String类型给key,检测当前的key是否为汉字,若为汉字,则转入步骤 S4,若不是汉字,则转入步骤S5;
S4:在nowMap中获取指定的key对应的value,若nowMap中不存在指定的key,即nowMap=null,则转入步骤S7;若nowMap!=null,则转入步骤S6;
S5:若获取的文本内容中的当前字符word是字母,则在pinyin后追加当前的字母,并且matchFlag++,i++,并转入步骤S3;若获取的文本内容中的当前字符word是空格并且当前的pinyin.length()>0,则把pinyin转换为String数据类型并给Key,同时清空pinyin中的内容,并转入步骤S4;若既不是汉字也不是拼音则判定为无意义符号,此时匹配标识数matchFlag++,i++,并转入步骤S3;
S6:对匹配标识数matchFlag加1后,判断结束标识isEnd是否为1,若isEnd=1,结束标识flag设置为true,同时判断匹配类型是否为指定的匹配类型matchType,,若满足则转入步骤S7;若isEnd!=1,i++,则转入步骤S3;
S7:若匹配标识数matchFlag<1或flag的值为真,则判断不是敏感词,使matchFlag=0,并返回matchFlag的值,否则直接返回matchFlag的值。
本发明的有益效果是:
(1)本发明对于无干扰的敏感词都可以成功过滤,并且保留不在敏感词库中的词;
(2)本发明对于人工干扰中符号干扰的敏感词、中拼混合干扰的敏感词和同时具有符号和拼音的符号干扰的敏感词能正确过滤;
(3)本发明的查全率高、在实际应用中易于实现。
具体实施方式
下面结合附图和具体实施例对本发明做进一步说明。
如图1所示,一种基于文本内容的敏感词过滤方法,包括以下步骤:
构建中文敏感词库,将中文敏感词库中的中文词向中拼混合词进行扩充,形成中拼混合敏感词库;
中文敏感词库向中拼混合敏感词文本的扩建,是根据排列组合的思想,把每个中文词语和对应的拼音进行排列组合的扩充,实现敏感词库的完整性和全面性;所述敏感词表示带有敏感政治倾向、暴力倾向、不健康色彩的词或不文明语。
中拼混合敏感词库可表示为:
Csen_word={c0,c1,c2,...,ci,...,cn-1},(0≤i<n)
式中,n为敏感词的个数,ci为第i个敏感词;其中对ci有:
ci={ci0,ci1,...,cij,...,cim-1},(0≤j<m)
式中:m为第i个敏感词的长度,cij为第i个敏感词的第j个敏感字。
中拼混合敏感词库构建过程如下:
S1:获取中文敏感词库中的汉字词语及对应的拼音;
S2:以汉字词语的每个字为单位放入一个字符串数组,将拼音以分隔符为单位放入另一个字符串数组,并获取词语的长度length;
S3:将汉字词语中的第一个字和拼音中的第一个拼音分别装进一个已定义的队列中,若 length≥2时,初始化i=2,j=1,并转入步骤S4;若length=1,则转入步骤S9;
S4:若i<length,则转入步骤S5,若i≥length,则转入步骤S9;
S5:若j<2i,则转入步骤S6,若j≥2i,则使i++,j=1,并转入步骤S4;
S6:取出队列的头元素;
S7:取出的头元素后追加汉字数组中的第i个元素,并在取出的元素后追加拼音数组中的第i个元素,形成新的元素;
S8:将步骤S7中形成的元素分别***队尾,j++,并转入步骤S5;
S9:以队列中的一个元素为一行依次写入敏感词文本中,构成中拼混合敏感词库。
通过敏感词查找树结构建立确定有限状态自动机DFA中各个敏感词的转换函数,将中拼混合敏感词库中的敏感词构建成敏感词树;
敏感词查找树结构为:根节点不包含任何字符;除根节点以外的每个节点记录不定量的字符数以及结束标志位符号,子节点采用哈希机制;从跟节点到某一个节点路径上的所有字符串连接起来构成新的字符串;每个词的公共前缀共享一个分支。
DFA的数学模型如下:
MDFA=(S,∑,δ,S0,F)
式中:S为有限非空状态集,∑是输入字符的字母表,δ是转移函数,用来表示一个状态在某个输入字符触发后转移到下一个确定的状态,S0为初始状态,F是终止状态集合。
构建敏感词树包括以下步骤:
S1:以敏感词库中的一个词语为一个单位添加到敏感词集合keyWordSet中;
S2:获取敏感词集合keyWordSet中的元素个数size,初始化Map容器(Map是按键-值对存储数据的一种集合类),即sensitiveWordMap,初始化nowMap=null(nowMap为存储当前敏感字的一个Map对象);
S3:判断敏感词集合keyWordSet中的所有元素是否被访问,如果是,则结束,如果否,则转入步骤S4;
S4:获取敏感词集合中的当前元素,即当前敏感词key,初始化开始标志位,start=0;
S5:使nowMap指向sensitiveWordMap(初始化后的Map容器);
S6:获取当前敏感词的长度length,初始化敏感词的个数标j=0;
S7:若j≥length,则转入步骤S3;若j<length,则转入步骤S8;
S8:获取敏感词集合中的当前元素的第j个字符,若当前字符是“(”,则标志位start=j, j++并转入步骤S7;若当前字符是“)”,则截取start+1到j的字符串,赋给临时的字符串变量,并转入步骤S9;若是字母,则j++,并转入步骤S7;若为汉字,则把当前汉字赋给临时字符串变量,并转入步骤S9;
S9:将字符串变量smallKey给一个对象wordMap(wordMap是盛装当前获取的内容的一个对象),若当前Map中存在该敏感字,则nowMap指向wordMap,并转入步骤S10;若wordMap中不存在当前敏感字,则构建新的Map,即newWordMap,使nowMap指向 newWordMap,并先把结束标志位isEnd设置为0;
S10:判断是否是该词中的最后一个字,若是,即j==k.length-1,则设置结束标志位设置为1sEnd=1,并转入步骤S3;若不是,则j++,并转入步骤S7。
根据敏感词树的结构在文本中对敏感词进行检索,对检索到的敏感词使用指定符号进行替换,完成敏感词过滤。
敏感词检索指对文本内容中的无干扰敏感词、无意义符号干扰敏感词、中拼混合干扰敏感词、拆分干扰敏感词的检索;为了识别出文本中的拼音,假设拼音后使用空格隔开,无意义符号定义为:敏感词中夹杂的一切符号;无意义符号干扰敏感词指在敏感词中加载无意义符号来进行干扰,以抵抗对敏感词的过滤效率;如对于敏感词“阿扁堆翔”,加入无意义符号变形为“@¥阿%…扁…&堆+=翔!”;中拼混合干扰敏感词指在一个敏感词中使用某个汉字的拼音代替该字,如对于敏感词“阿扁堆翔”,增加拼音干扰后变形为“a扁duixiang”;拆分干扰敏感词指把敏感词中的某些字进行拆分,如对于敏感词“阿扁堆翔”,加入拆分干扰后变形为“阿扁土住羊羽”,如图3所示。
检索与过滤敏感词的方法包括:检测文本中的敏感词和替换文本中的敏感词两部分,具体过程如下:
S1:初始化敏感词结束标识flag=false,匹配标识数matchFlag=0,获取的文本内容中的当前字符word=0,word转化为字符串的标识key=null,nowMap=sensitiveWordMap,i=beinIndex 开始检测的位置,新建一个字符串变量StringBuffer对象给pinyin变量(盛装拼音的一个对象);
S2:若i<txt.length()(txt.length()表示被检测文本的长度)被检测文本内容长度,则转入步骤S3,否则执行S4;
S3:获取被检测文本内容中的当前字符给获取的文本内容中的当前字符word,将word 转化为字符串变量String类型给key,检测当前的key是否为汉字,若为汉字,则转入步骤 S4,若不是汉字,则转入步骤S5;
S4:在nowMap中获取指定的key对应的value,若nowMap中不存在指定的key,即nowMap=null,则转入步骤S7;若nowMap!=null,则转入步骤S6;
S5:若获取的文本内容中的当前字符word是字母,则在pinyin后追加当前的字母,并且matchFlag++,i++,并转入步骤S3;若获取的文本内容中的当前字符word是空格并且当前的pinyin.length()>0(pinyin.length()表示拼音变量的长度),则把pinyin转换为String数据类型并给Key,同时清空pinyin中的内容,并转入步骤S4;若既不是汉字也不是拼音则判定为无意义符号,此时匹配标识数matchFlag++,i++,并转入步骤S3;
S6:对匹配标识数matchFlag加1后,判断结束标识isEnd是否为1,若isEnd=1,结束标识flag设置为true,同时判断匹配类型是否为指定的匹配类型matchType,,若满足则转入步骤S7;若isEnd!=1,i++,则转入步骤S3;
S7:若匹配标识数matchFlag<1或flag的值为真,则判断不是敏感词,使matchFlag=0,并返回matchFlag的值,否则直接返回matchFlag的值。
获取文本中的所有敏感词的方法是,在文本中使用上述敏感词检测算法检测到敏感词后,把当下检测到的敏感词放在集合中,然后对文本继续检测;因此,当文本被访问结束时,对整个文本的敏感词检测也结束;当在文本中检测到敏感词以后,使用指定符号进行替换,达到对敏感词过滤的目的。
检索匹配过程,存在两种匹配规则:a、最小匹配规则;b、最大匹配规则;最小匹配规则是指在当检索到一个词语的结束标识为结束符号时,例如本发明中的isEnd为1时,就立即判定检索结束,判定敏感词被检索到;最大匹配规则是指当检索到结束标志位为结束符号时,继续再向后检索,看是否还存在后续,若不存在,则判定为当前检测到的敏感词;若存在,则直到检测到的结束标识符没有后续为止的敏感词为当前所检索到的敏感词;以文本中同时存在“AB”和“ABCD”两个敏感词为例来说明最小和最大匹配规则;若被检索的文本中存在敏感词“ABCD”,当检索到“B”字时,此时的结束标志位为结束标识符,也就是isEnd=1,对于最小匹配规则,就立即判定当前的敏感词为“AB”;对于最大匹配规则,还要继续检索,看“B”字之后是否还存在后续,发现有后续“C”,则继续向后检索,直到获取到“D”字的结束标识为结束标示符isEnd=1,再向后检索判断“D”字后是否有后续,发现没有,则判定当前的敏感词为“ABCD”;因此,对于不同的要求和不同的应用,在检索算法中应用不同的规则,对于精度要求更高的,就采用最大匹配规则,对于时间要求更高的就采用最小匹配规则;上述算法中使用的是最小匹配规则。
为了说明本发明的效果,对本发明的算法的抗人工干扰能力、查全率、查准率进行评估;所述的抗人工干扰的能力评估是指,算法对于加入人工干扰后的敏感词的过滤能力;目前,敏感词过滤技术的关键问题中的人工干扰包括无意义符号干扰、中拼混合干扰、拆分干扰;本算法能很好的解决人工干扰问题。
查全率指能够将人工判断应该过滤出来的所有敏感词均识别出来;定义为,使用***过滤算法过滤出来与人工判定应该过滤出来相吻合的敏感词;与人工判定应该过滤出来的敏感词数的比率;对于查全率的定义如下:
查准率的定义为,人工判定应该过滤出来的敏感词数,与***过滤算法过滤出来的总的敏感词数的比率,定义为:
对本发明的方法进行测试,采用Java语言对算法进行验证;根据网上提供的一个敏感词库,共敏感词1030个,其中字符数为2~4的1022;根据数据可以得到,实际应用中敏感词的字符数在2~4的个数约占99%;为了对人工干扰中的中拼混合干扰测试,首先对原敏感词文本中的敏感词进行了中拼扩充;为了评价抗人工干扰能力,在文本中加入了符号干扰、中拼混合干扰及符号干扰加中拼混合干扰;经测试本发明能成功地过滤掉无干扰敏感词、无意义符号干扰敏感词、中拼混合干扰敏感词以及无意义符号干扰加中拼混合干扰敏感词,并且保留非敏感内容;经测试查准率为100%,查全率约为87%~100%;经测试对于不含敏感词的文本,其查准率为100%,查全率为100%;对于***500个敏感词的文本,查准率为100%,查全率为97%;对于全为敏感词库的文本,其查准率为100%,查全率为87%;即在最坏的情况下,其查全率在87%左右,其他情况的查全率大于87%。
敏感词检索方法中txt表示被检测的文本内容,数据类型为String,beinIndex表示开始检测的位置,数据类型为int,matchType表示匹配类型,数据类型为int,flag表示敏感词结束标识,数据类型为boolean,matchFlag表示匹配标识数,数据类型为int,word表示获取的文本内容中的当前字符,数据类型为char,key表示word强制转化为字符串的标识,数据类型为String。
本发明对于无干扰的敏感词,无论词的长度为多少,只要在可表示的长度范围内,都可以成功地过滤,而保留不在敏感词库中的词;解决了人工干扰中符号干扰的敏感词能正确过滤;解决了人工干扰的中拼混合的干扰问题,并对于内容中的非敏感词保留;可以过滤同时有拼音和符号干扰的敏感词;对于不含敏感词的文本,其查准率为100%,查全率为100%;对于***500个敏感词的文本,查准率为100%,查全率为97%;对于全为敏感词库的文本,其查准率为100%,查全率为87%,也就是,在最坏的情况下,其查全率在87%左右,其他情况的查全率大于87%。