網(wǎng)站ui設(shè)計(jì)例子軟文廣告的案例
開源項(xiàng)目
敏感詞核心 https://github.com/houbb/sensitive-word
敏感詞控臺(tái) https://github.com/houbb/sensitive-word-admin
版本特性
大家好,我是老馬。
敏感詞標(biāo)簽分類一直是大家比較想要的一個(gè)功能特性,v0.24.0 了開始內(nèi)置支持標(biāo)簽分類,同時(shí)實(shí)現(xiàn)了多種策略。
快速開始
maven 引入
<dependency><groupId>com.github.houbb</groupId><artifactId>sensitive-word</artifactId><version>0.24.0</version>
</dependency>
敏感詞標(biāo)簽
說明
有時(shí)候我們希望對(duì)敏感詞加一個(gè)分類標(biāo)簽:比如社情、暴/力等等。
這樣后續(xù)可以按照標(biāo)簽等進(jìn)行更多特性操作,比如只處理某一類的標(biāo)簽。
主要特性支持版本:v0.24.0
標(biāo)簽接口
這里只是一個(gè)抽象的接口,用戶可以自行定義實(shí)現(xiàn)。比如從數(shù)據(jù)庫查詢、文件讀取、api 調(diào)用等。
public interface IWordTag {/*** 查詢標(biāo)簽列表* @param word 臟詞* @return 結(jié)果*/Set<String> getTag(String word);}
內(nèi)置實(shí)現(xiàn)
方法列表
為了方便大部分情況使用,內(nèi)置實(shí)現(xiàn)一些場(chǎng)景策略在 WordTags
類中
實(shí)現(xiàn)方法 | 說明 | 備注 |
---|---|---|
none() | 空實(shí)現(xiàn) | v0.10.0 支持 |
file(String filePath) | 指定文件路徑 | v0.10.0 支持 |
file(String filePath, String wordSplit, String tagSplit) | 指定文件路徑,以及單詞分隔符、標(biāo)簽分隔符 | v0.10.0 支持 |
map(final Map<String, Set> wordTagMap) | 根據(jù) map初始化 | v0.24.0 支持 |
lines(Collection lines) | 字符串列表 | v0.24.0 支持 |
lines(Collection lines, String wordSplit, String tagSpli) | 字符串列表,以及單詞分隔符、標(biāo)簽分隔符 | v0.24.0 支持 |
system() | 系件文件內(nèi)置實(shí)現(xiàn),整合網(wǎng)絡(luò)分類 | v0.24.0 支持 |
defaults() | 默認(rèn)策略,目前為 system | v0.24.0 支持 |
chains(IWordTag… others) | 鏈?zhǔn)椒椒?#xff0c;支持用戶整合實(shí)現(xiàn)多個(gè)策略 | v0.24.0 支持 |
格式約定
敏感詞標(biāo)簽的格式我們默認(rèn)約定如下 敏感詞 tag1,tag2
,代表這 敏感詞
的標(biāo)簽為 tag1 和 tag2
比如
五星紅旗 政治,國家
所有的文件行內(nèi)容,和指定的字符串行內(nèi)容也建議用這種方式。如果不滿足,自定義實(shí)現(xiàn)即可。
系統(tǒng)內(nèi)置實(shí)現(xiàn)(默認(rèn)效果)
v0.24.0 版本開始,默認(rèn)的單詞標(biāo)簽為 WordTags.system()
。
說明:目前數(shù)據(jù)統(tǒng)計(jì)自網(wǎng)絡(luò),存在不少疏漏。也歡迎大家指正,持續(xù)改進(jìn)中…
SensitiveWordBs sensitiveWordBs = SensitiveWordBs.newInstance()
.wordTag(WordTags.system())
.init();
Set<String> tagSet = sensitiveWordBs.tags("博彩");
Assert.assertEquals("[3]", tagSet.toString());
這里為了壓縮大小優(yōu)化,對(duì)應(yīng)的類別用數(shù)字表示。
數(shù)字的含義列表如下:
0 政治
1 毒品
2 色情
3 賭博
4 違法
文件入門例子
這里以文件為例子,演示一下如何使用。
final String path = "~\\test\\resources\\dict_tag_test.txt";// 演示默認(rèn)方法
IWordTag wordTag = WordTags.file(path);
SensitiveWordBs sensitiveWordBs = SensitiveWordBs.newInstance().wordTag(wordTag).init();Set<String> tagSet = sensitiveWordBs.tags("零售");Assert.assertEquals("[廣告, 網(wǎng)絡(luò)]", tagSet.toString());// 演示指定分隔符
IWordTag wordTag2 = WordTags.file(path, " ", ",");
SensitiveWordBs sensitiveWordBs2 = SensitiveWordBs.newInstance().wordTag(wordTag2).init();
Set<String> tagSet2 = sensitiveWordBs2.tags("零售");Assert.assertEquals("[廣告, 網(wǎng)絡(luò)]", tagSet2.toString());
其中 dict_tag_test.txt
我們自定義的內(nèi)容如下:
零售 廣告,網(wǎng)絡(luò)
單詞標(biāo)簽和敏感詞發(fā)現(xiàn)的聯(lián)動(dòng)
我們?cè)讷@取敏感詞的時(shí)候,是可以設(shè)置對(duì)應(yīng)的結(jié)果處理策略,從而獲取對(duì)應(yīng)的敏感詞標(biāo)簽信息
// 自定義測(cè)試標(biāo)簽類
IWordTag wordTag = WordTags.lines(Arrays.asList("天安門 政治,國家,地址"));// 指定初始化
SensitiveWordBs sensitiveWordBs = SensitiveWordBs.newInstance().wordTag(wordTag).init();List<WordTagsDto> wordTagsDtoList1 = sensitiveWordBs.findAll("天安門", WordResultHandlers.wordTags());
Assert.assertEquals("[WordTagsDto{word='天安門', tags=[政治, 國家, 地址]}]", wordTagsDtoList1.toString());
我們自定義了 天安門
關(guān)鍵詞的標(biāo)簽,然后通過指定 findAll 的結(jié)果處理策略為 WordResultHandlers.wordTags()
,就可以在獲取敏感詞的同時(shí),獲取對(duì)應(yīng)的標(biāo)簽列表。
單詞標(biāo)簽與結(jié)果匹配聯(lián)動(dòng)
有時(shí)候我們可能希望對(duì)匹配的敏感詞進(jìn)一步限制,比如雖然我們定義了【av】作為敏感詞,但是不希望【have】被匹配。
標(biāo)簽分類也可以和結(jié)果匹配聯(lián)動(dòng)。支持版本: v0.23.0
我們可以只返回隸屬于某一種標(biāo)簽的敏感詞。
我們指定了兩個(gè)敏感詞:商品、AV
MyWordTag 是我們定義的一個(gè)敏感詞標(biāo)簽實(shí)現(xiàn):
/*** 自定義單詞標(biāo)簽* @since 0.23.0*/
public class MyWordTag extends AbstractWordTag {private static Map<String, Set<String>> dataMap;static {dataMap = new HashMap<>();dataMap.put("商品", buildSet("廣告", "中文"));dataMap.put("AV", buildSet("色情", "單詞", "英文"));}private static Set<String> buildSet(String... tags) {Set<String> set = new HashSet<>();for(String tag : tags) {set.add(tag);}return set;}@Overrideprotected Set<String> doGetTag(String word) {return dataMap.get(word);}}
測(cè)試用例如下,我們模擬了兩個(gè)不同的實(shí)現(xiàn)類,每一個(gè)關(guān)注的單詞標(biāo)簽不同。
// 只關(guān)心SE情
SensitiveWordBs sensitiveWordBsYellow = SensitiveWordBs.newInstance().wordDeny(new IWordDeny() {@Overridepublic List<String> deny() {return Arrays.asList("商品", "AV");}}).wordAllow(WordAllows.empty()).wordTag(new MyWordTag()).wordResultCondition(WordResultConditions.wordTags(Arrays.asList("色情"))).init();// 只關(guān)心廣告
SensitiveWordBs sensitiveWordBsAd = SensitiveWordBs.newInstance().wordDeny(new IWordDeny() {@Overridepublic List<String> deny() {return Arrays.asList("商品", "AV");}}).wordAllow(WordAllows.empty()).wordTag(new MyWordTag()).wordResultCondition(WordResultConditions.wordTags(Arrays.asList("廣告"))).init();final String text = "這些 AV 商品什么價(jià)格?";
Assert.assertEquals("[AV]", sensitiveWordBsYellow.findAll(text).toString());
Assert.assertEquals("[商品]", sensitiveWordBsAd.findAll(text).toString());
小結(jié)
希望本文對(duì)你有所幫助,如果喜歡,歡迎點(diǎn)贊收藏轉(zhuǎn)發(fā)一波。
我是老馬,期待與你的下次相遇。
敏感詞系列
sensitive-word-admin 敏感詞控臺(tái) v1.2.0 版本開源
sensitive-word-admin v1.3.0 發(fā)布 如何支持分布式部署?
01-開源敏感詞工具入門使用
02-如何實(shí)現(xiàn)一個(gè)敏感詞工具?違禁詞實(shí)現(xiàn)思路梳理
03-敏感詞之 StopWord 停止詞優(yōu)化與特殊符號(hào)
04-敏感詞之字典瘦身
05-敏感詞之 DFA 算法(Trie Tree 算法)詳解
06-敏感詞(臟詞) 如何忽略無意義的字符?達(dá)到更好的過濾效果
v0.10.0-臟詞分類標(biāo)簽初步支持
v0.11.0-敏感詞新特性:忽略無意義的字符,詞標(biāo)簽字典
v0.12.0-敏感詞/臟詞詞標(biāo)簽?zāi)芰M(jìn)一步增強(qiáng)
v0.13.0-敏感詞特性版本發(fā)布 支持英文單詞全詞匹配
v0.16.1-敏感詞新特性之字典內(nèi)存資源釋放
v0.19.0-敏感詞新特性之敏感詞單個(gè)編輯,不必重復(fù)初始化
v0.20.0 敏感詞新特性之?dāng)?shù)字全部匹配,而不是部分匹配
v0.21.0 敏感詞新特性之白名單支持單個(gè)編輯,修正白名單包含黑名單時(shí)的問題
v0.23.0 敏感詞新特性之結(jié)果條件拓展,內(nèi)置支持鏈?zhǔn)?#43;單詞標(biāo)簽
v0.24.0 新特性支持標(biāo)簽分類,內(nèi)置實(shí)現(xiàn)多種策略