敏感詞過濾算法


如果有字符串為xwabfabcff,敏感詞為abc、bf、bc、m,若這個字符串中包含敏感詞,則使用***代替敏感詞,實現一個算法。

算法如下:

1.使用三個指針,指針1指向根節點,指針2指向字符串下標起始值,指針3指向字符串當前下標值。指針1為tempnode=rootnode,指針2為begin=0,指針3為position=0,創建sb來保存結果;

2.遍歷x,tempnode未找到子節點x,將x報存到sb中,begin=begin+1;position=begin,tempnode=rootnode;

遍歷w,tempnode未找到子節點w,將w報存到sb中,begin=begin+1;position=begin,tempnode=rootnode;

遍歷a,tempnode找到子節點a,tempnode指向a節點,則position++;

遍歷b,tempnode發現a節點下有b這個子節點,所以,tempnode指向b節點,則position++;

遍歷f,tempnode發現b節點下沒有f這個子節點,所以,代表以begin開頭的字符串,不會有敏感字符,因此,將a存入sb中。position=begin+1;bigin=position;tempnode=rootnode

遍歷a,tempnode找到子節點a,tempnode指向a節點,則position++;

遍歷b,tempnode發現a節點下有b這個子節點,所以,tempnode指向b節點,則position++;

遍歷c,tempnode發現b節點下有c這個子節點,而且c值敏感詞結尾標記,所以,打碼。將***寫入sb中,同時,begin=position+1;position=begin;tempnode=rootnode;

遍歷f,tempnode發現根節點下沒有f這個節點,因此,將f存入sb中。position=begin+1;bigin=position;tempnode=rootnode;

遍歷f,tempnode發現根節點下沒有f這個節點,因此,將f存入sb中。position=begin+1;bigin=position;tempnode=rootnode;

因此,最后sb中為:xwa******ff;

這里每次是將position指向的字符挨個的與tempnode的子節點進行比較,因此,代碼中的while條件應該是

while (position < text.length()){}
同時,需要思考:
如果字符串為xwabfabcfb,則最后,begin指向b下標,position指向b下標,tempnode發現根節點下有b節點,因此position++;然后就退出循環了。而此時,sb中還只保存了xwa******f,
所以,我們在循環的最后,還要將最后一串字符串加進來。
 result.append(text.substring(begin));

分析后,整個代碼如下:
/**
* 過濾敏感詞
*/
public String filter(String text) {
if (StringUtils.isBlank(text)) {
return text;
}
String replacement = DEFAULT_REPLACEMENT;
StringBuilder result = new StringBuilder();

TrieNode tempNode = rootNode;
int begin = 0; // 回滾數
int position = 0; // 當前比較的位置
while (position < text.length()) {
char c = text.charAt(position);
tempNode = tempNode.getSubNode(c);
if (tempNode == null) {
result.append(text.charAt(begin));
// 跳到下一個字符開始測試
position = begin + 1;
begin = position;
// 回到樹初始節點
tempNode = rootNode;
} else if (tempNode.isKeywordEnd()) {
// 發現敏感詞, 從begin到position的位置用replacement替換掉
result.append(replacement);
position = position + 1;
begin = position;
tempNode = rootNode;
} else { //還不確定是不是敏感詞
++position;
}
}
result.append(text.substring(begin));

return result.toString();
}


 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM