2月底,我辭了公司工作,開始為自己奮斗,立志在敏感詞過濾方面走出一條路來。原以為憑借ToolGood.Words開源項目所領悟的算法及多年優化經驗,我可以在3個月內快速完成,然而我用了6個月,在6個月內,我換了三套核心算法,每次重寫都讓人心身疲憊,甚至有點自我懷疑,一個人單干真得太難了。
敏感詞過濾是一項非常復雜項目,而很多人卻不這么認為。在去年我組建了一個【敏感信息過濾研究會】Q群,Q群不熱鬧,干貸卻不少。以下為我總結出來幾個現象:
一, 很多程序員認為開源免費的就是好的,就是一套可用的完整的技術,github上的星星就是最好的驗證。盲目的使用ToolGood.Words項目,使用過一段時間就發現問題了,就來問我“生日”怎么是敏感詞,我幫他檢測了一下,告訴他這敏感詞列表內有”日”字,要排除誤測需要使用NLP來過濾。
二,很多程序員認為寧可錯殺,也不可放過一個,只要檢測到第一個就判斷有敏感詞。真的心很大,不怕用戶流失而扣獎金嘛。
三,對企業來說數據保密很重要。我碰過一個程序員設置敏感詞時,使用base64字符串,檢測的文本也是base64字符串,一測試就出問題了,跟我說ToolGood.Word內存占用大,而且檢測不准。原因很簡單,轉base64字符串,如【准】就轉成【5YeG】,【1准】就轉成【MeWHhg==】這個例子就很容易說明,內存大是字符變長,檢測不准是轉base64字符串后內容變得不一樣了。
技術小白可能不知道,文本轉base64字符串是依據6位bit來轉化的,而一個byte有8位bit,Base64編碼是每3個原始字符編碼成4個字符,當原始字符串長度不能被3整除,使用0來補充原始字符串。如【准】就轉成【5YeG】,【1准】就轉成【MeWHhg==】,
四,對於網上敏感詞過濾的吐槽,吐槽原因主要是“不准“,”太嚴了“。 大廠也是吐槽對象。因為大廠的產品定位是嚴,否則會出現封站問題,名聲越大負面消息傳得越快。
五、有不少網友跟我反饋,ToolGood.Words開源項目內的敏感詞列表還是比較不錯的,第一次聽時,我比較詫異,那個敏感詞列表是我隨手找的,內有大量誤判的敏感詞。后來我明白了,小平台對敏感詞過濾要求很低,目標客戶目標范圍都比較小,基本不會有涉政內容,能過濾95%的違規內容就可以了,也因為是目標范圍小,一些誤判的敏感詞也涉及不到,而且大部分都有用戶舉報功能,最后,如百度這些搜索引擎也不會特意去顯示違規內容。
六,很多敏感詞過濾企業開始往AI方面發展,原因很簡單,領導認為使用DFA技術過濾信息是很low的,無法在客戶面前吹牛。往AI方面發展有多少坑,下面我會講一下。
AI的路有多難走?
往AI方向發展是趨勢,但繞不開性能問題,乘法、除法太耗運算資源了。所以企業都會選擇DFA算法+AI算法。
AI算法的一個基礎概念是詞向量,詞向量的維數少的可以取20,多的可以取500,漢字的組詞實在太多了,很難全部訓練完成,很多公司為了偷懶為了快速完成項目,都將單個漢字設為詞向量,也就埋下了一個bug。
在某平台測試,會發現【買犢賣刀】是辱罵詞,建議屏蔽。【買犢賣刀】原義:賣劍買牛。原指放下武器,從事耕種。后比喻改業務農或壞人改惡從善。為什么出現這種情況?原因很簡單,訓練詞庫內有大量含【賣】的臟詞、以及大量含【犢】的臟字,兩個合在一起就出問題了。
AI算法的局限主要來源訓練數據樣本不均衡,但這個問題是解決不了的,因為我們有口頭、書面語,高頻詞、低頻詞,而且時代變遷,很多詞的意思都帶了上不同意思,如“公主”、“小姐”。
每個公司的敏感詞過濾定位不一樣,決策也不一樣。
敏感詞過濾公司,以空間換時間,內存使用量達100多G,16K文本檢測速度達到毫秒級。
新聞平台對涉政文章是允許的,而小平台基本是不允許的。
醫療平台對含器官、病症文章是允許的,而小平台基本是不允許的。
游戲論壇對裝備交流涉及武器、刀具是允許的,而小平台是不允許的。
大平台對外部鏈接普遍保持開放態度,而小平台是不允許的。
大平台對引流至公眾號平台也是默許的,而小平台是不允許的。
我對產品的定位是性能要高、內存使用量要小、單文件部署。性能要高、內存使用量要小,讓我改了三次核心源碼。內存從將class轉成struct,將檢測每一個int,string等有效范圍,嘗試bool代替int類型、int類型代替string類型;性能從一個個算法、一個個if、一個個循環中扣出來,一次次修改代碼、生成應用、生成數據、測試准確性、測試性能、駁回修改,漫長又枯燥。。。
現在已完成了目標,加載數據后內存使用量在100M以下,檢測速度小文本(6-10字)每秒25W條,大文本(18W字)每秒5條,實際環境下,cpu、內存卡和網絡傳輸都會影響性能。
內存少了,敏感詞卻沒少,是因為算法優秀。
可以下文字去我的平台(toolgood.com)測試。拼接后的臟詞有26303904組(約2630W)。
c|C|⒞|c|ⓒ|C|C|ℂ|Ⓒ|с|С|𝐜|𝑐|𝚌|𝒸|𝒄|𝓬|𝕔|𝖼|𝗰|𝘤|𝙘|𝐂|𝐶|𝙲|𝒞|𝑪|𝓒|𝖢|𝗖|𝘊|𝘾|©
a|A|⒜|ā|á|ǎ|à|a|ⓐ|A|A|Ⓐ|а|А|𝐚|𝑎|𝚊|𝒶|𝒂|𝓪|𝕒|𝖺|𝗮|𝘢|𝙖|𝐀|𝐴|𝙰|𝒜|𝑨|𝓐|𝔸|𝖠|𝗔|𝘈|𝘼|Α|α
o|O|⒪|ō|ó|ǒ|ò|o|ⓞ|O|O|Ⓞ|о|О|𝐨|𝑜|𝚘|𝒐|𝓸|𝕠|𝗈|𝗼|𝘰|𝙤|𝐎|𝑂|𝙾|𝒪|𝑶|𝓞|𝕆|𝖮|𝗢|𝘖|𝙊|Ο|ο|σ
㚷|伱|你|倪|呢|妮|妳|尼|您|擬|昵|汝|沵|泥|禰|邇|鈮|鉨|your|you|亻尓|女尓|ni
㐷|嗎|嘛|媽|娘|嫲|嬤|榪|溤|犘|獁|瑪|痲|碼|禡|蔴|螞|馬|罵|鰢|鷌|麻|嚒|ma
注:堅線為分隔符。
后記:
我准備開寫兩個系列文章,《dotnet單文件部署》和《敏感詞過濾簡史》。全是實用干貨哦。
敏感詞會隨時間增多,這是一個不爭的事實,社會上的一些極端分子總是喜歡造一些詞羞辱別人。當然部分敏感詞也會隨時間消失。
敏感詞過濾項目是一件助人的項目,凈化網絡,消除負面氣息,避免人被請去喝茶。
預告:下一篇文章《普通公司敏感詞審核度制》