日期:2014-05-18  浏览次数:20828 次

脏字过滤问题
我想在java类中写一个脏字过滤类,现在已经能过滤了,但是例如这个功能还没有实现:我想过滤 "法轮功 ", "学习法轮功 "中的 "法轮功 "要过滤,但是 "拒绝法轮功 "中的 "法轮功 "就不能过滤,请各位高手帮帮忙,给个例子!!

------解决方案--------------------
这个涉及语义分析...我晕,一个简单的类没法做到,

给一种简单的解决方案吧:定义组合。
比如定义A+B
A:学习/接收/宣传
B:法轮功/法轮大法

进行这样的组合过滤
------解决方案--------------------
^_^,正解在此!

if (s.equals( "脏 "))
{
// 过滤
}
else
{
// 不过滤
}
------解决方案--------------------
我写了一个脏字组合过滤的程序,不过是asp写的,看能否借鉴
(原文发表于:http://blog.randem.cn/20071118/filter-asp-instr-xor/ )

近日越来越多非法/低俗的信息在大跳蚤深圳二手市场(http://www.datiaozao.cn)网站发表,在这种大的信息交互的平台进行人工审核又几乎是不可能,因此极有可能被网监/信息部门警告,在客户强烈要求下,我只有补写了一个发布信息时的过滤的过程,来降低这种几率.程序是asp开发的,因为单篇的信息不是很大,所以采用了instr()函数来过滤(据说instr函数最大只能处理20k的数据),通过split来分割所定义脏字串. 用 Xor 异或 运算来处理.

程序代码如下.

‘************************************************
‘* 函数 FilterTxt (StrTxt)
‘* 信息发布敏感词语过滤函数
‘* 程序发布于: http://blog.randem.cn
‘* 如果含有脏字,返回逻辑值False,否则返回True
‘*************************************************
Function FilterTxt(StrTxt)
 Dim BlackTxt,FilterArray,Str,Word,Txt,I,J,K
 BlackTxt = “手机@窃听:定位:跟踪|三@唑@仑|迷:醚@魂:烟:药|走私”
 if IsNull(StrTxt) or StrTxt=”" then
response.write “<div style=’margin : 4px 8px ; padding:5px ; background-color : #f0f0f0 ; border:#dddddd 1 solid’>没有输入内容</div>”
 else 
FilterArray = Split(BlackTxt,”|”) ’划分过滤组 
For I=0 to UBOUND(FilterArray)
NoBlackTxt = False
Str = Split(FilterArray(I),”@”) ‘划分字符串 @间隔

if Ubound(Str)>0 then ‘过滤组中超过一个以上字串
For J=0 to Ubound(Str)
Word = Split(Str(J),”:”) ‘划分字串中的近似词 :间隔

If UBound(Word)>0 Then ‘字串中超过一个以上近似词
For K=0 To UBound(Word)
NoBlackTxt = False
if Instr(StrTxt,Word(K))>0 then
NoBlackTxt=NoBlackTxt Xor False 

Exit For
else
NoBlackTxt= True
end If
Next
If NoBlackTxt= True Then Exit For
Else ’字串中只有一个近似词
if Instr(StrTxt,Str(J))>0 then
NoBlackTxt=NoBlackTxt Xor False
else
NoBlackTxt= True
end If
End If
Next
Else ‘过滤组中只有一个字串
if Instr(StrTxt,FilterArray(I))>0 then
NoBlackTxt= NoBlackTxt Xor False
else
NoBlackTxt= True
end if

end if
if NoBlackTxt= True then
FilterTxt = True
Else
FilterTxt = False ‘返回函数值
Exit for
end if
Next

End if

End Function

过滤组用 ‘|’ 划分, 如:A|B|C 三个过滤组

进一步,过滤组中的字符串可以组合通过‘@’ 分割, 比如含有 ‘A’ 和 ‘B’ 同时存在才进行处理 写法: A@B|C|D . 支持超过2个以上的脏字组合验证: A@B@C|D

再进一步,有些人很狡猾,用别字替代, 这时候需要再进行一次验证,加入了 ‘:’区分的近似词处理. 写法 A:a@B:b@D:d:T|E这里的A:a@B:b@D:d:T 过滤组就 限制了 含有: ABD,ABd,ABT,AbD,Abd,AbT… 的信息的出现,一条过滤组限制了多个字符的出现.

应用时可以直接通过返回值来进行要求审核,或者直接限制信息的发布. 目前这个过滤过程已经在www.datiaozao.cn 应用了,大家可以去测试. (手机@窃听:定位:跟踪) 手机 跟踪 ; 手机 定位 ;手机 窃听 的组合都拒绝发布.

延伸设计:我想深一步应该可以在不同过滤组之间加一个处理等级的返回值A=-1|C=0|D=1 返回-1就是拒绝发表 ,返回0就是可以发表,需要等待审核,其他的比如 1就是直接替换成处理. 这样的话过滤处理更灵活.