sensitive-word v0.13 特性版本釋出 支援英文單詞全詞匹配

發表於2024-02-26

擴充閱讀

sensitive-word-admin v1.3.0 釋出 如何支援分散式部署?

sensitive-word-admin 敏感詞控臺 v1.2.0 版本開源

sensitive-word 基於 DFA 演算法實現的高效能敏感詞工具介紹

更多技術交流

view

業務背景

對於英文單詞 Disburse 之類的,其中的 sb 字母會被替換,要怎麼處理,能不能只有整個單詞匹配的時候才替換。

針對匹配詞進一步判斷

說明

支援版本:v0.13.0

有時候我們可能希望對匹配的敏感詞進一步限制,比如雖然我們定義了【av】作為敏感詞,但是不希望【have】被匹配。

就可以自定義實現 wordResultCondition 介面,實現自己的策略。

系統內建的策略在 WordResultConditions#alwaysTrue() 恆為真,WordResultConditions#englishWordMatch() 則要求英文必須全詞匹配。

入門例子

原始的預設情況:

final String text = "I have a nice day。";

List<String> wordList = SensitiveWordBs.newInstance()
        .wordDeny(new IWordDeny() {
            @Override
            public List<String> deny() {
                return Collections.singletonList("av");
            }
        })
        .wordResultCondition(WordResultConditions.alwaysTrue())
        .init()
        .findAll(text);
Assert.assertEquals("[av]", wordList.toString());

我們可以指定為英文必須全詞匹配。

final String text = "I have a nice day。";

List<String> wordList = SensitiveWordBs.newInstance()
        .wordDeny(new IWordDeny() {
            @Override
            public List<String> deny() {
                return Collections.singletonList("av");
            }
        })
        .wordResultCondition(WordResultConditions.englishWordMatch())
        .init()
        .findAll(text);
Assert.assertEquals("[]", wordList.toString());

當然可以根據需要實現更加複雜的策略。

如何自定義自己的策略

可以參考 WordResultConditions#englishWordMatch() 實現類,只需要繼承 AbstractWordResultCondition 實現對應的方法即可。

策略的定義

以 englishWordMatch 實現類為例:

package com.github.houbb.sensitive.word.support.resultcondition;

import com.github.houbb.heaven.util.lang.CharUtil;
import com.github.houbb.heaven.util.util.CharsetUtil;
import com.github.houbb.sensitive.word.api.IWordContext;
import com.github.houbb.sensitive.word.api.IWordResult;
import com.github.houbb.sensitive.word.constant.enums.WordValidModeEnum;

/**
 * 英文單詞必須要全詞匹配
 *
 * https://github.com/houbb/sensitive-word/issues/45
 *
 * @since 0.13.0
 */
public class WordResultConditionEnglishWordMatch extends AbstractWordResultCondition {

    @Override
    protected boolean doMatch(IWordResult wordResult, String text, WordValidModeEnum modeEnum, IWordContext context) {
        final int startIndex = wordResult.startIndex();
        final int endIndex = wordResult.endIndex();
        // 判斷當前是否為英文單詞
        for(int i = startIndex; i < endIndex; i++) {
            char c = text.charAt(i);
            if(!CharUtil.isEnglish(c)) {
                return true;
            }
        }

        // 判斷處理,判斷前一個字元是否為英文。如果是,則不滿足
        if(startIndex > 0) {
            char preC = text.charAt(startIndex-1);
            if(CharUtil.isEnglish(preC)) {
                return false;
            }
        }

        // 判斷後一個字元是否為英文
        if(endIndex < text.length() - 1) {
            char afterC = text.charAt(endIndex+1);
            if(CharUtil.isEnglish(afterC)) {
                return false;
            }
        }

        return true;
    }

}

策略的指定

然後用引導類指定我們的策略即可:

List<String> wordList = SensitiveWordBs.newInstance()
        .wordResultCondition(new WordResultConditionEnglishWordMatch())
        .init()
        .findAll(text);

小結

實際應用的場景會被預想的複雜,所以此處設計為介面,內建一些常見的實現策略。

同時支援使用者自定義擴充。

開原始碼

https://github.com/houbb/sensitive-word
本文由部落格一文多發平臺 OpenWrite 釋出!

相關文章