版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
敏感詞過濾技術文檔
目錄1. 背景 32. 算法描述 33. 效率的瓶頸 54. 使用詳解 64.1 publicstaticIList<string>[]GetKeyWordArray(IList<string>KeyWordList,boolIsIgnoreCase) 64.2 publicstaticIList<string>[]GetKeyWordArray(string[]KeyWordList,boolIsIgnoreCase) 64.3 publicstringFilterSingleThread(stringContent,IList<string>[]SensitiveArray,charReplaceChar,boolIsIgnoreCase) 64.4 publicstringFilterSingleThread(stringContent,IList<string>[]SensitiveArray) 74.5 publicstringFilterMuliThread(stringContent,IList<string>[]SensitiveArray,intThreadCount,charReplaceChar,boolIsIgnoreCase) 74.6 publicstringFilterMuliThread(stringContent,IList<string>[]SensitiveArray,intThreadCount) 74.7 publicstringReplace(stringContent,IList<string>[]KeyWordArray,stringLeftStr,stringRightStr,boolIsIgnoreCase) 84.8 publicstringReplace(stringContent,IList<string>[]KeyWordArray,stringLeftStr,stringRightStr) 85. 一些細節(jié) 86. 其他 9
背景在天朝,很多東西都要被過濾。鑒于各大網站論壇博客等都有敏感詞過濾,**網站的社區(qū)局部當然也要作相應處理。算法描述首先要根據(jù)關鍵詞表的首字符建立索引〔將char轉成int型〕。IList<string>[]arr=newList<string>[65535];因為Unicode碼最大是65535個,所以建立一個65535大小的數(shù)組,相同首字符的關鍵詞放入string的泛型集合中。注意:關鍵詞表最好是預先根據(jù)長度降序排好序的。比方,“法O功”和“法O功組織”都是關鍵字,需要過濾的文本內容為“今天法O功組織集合”,如果前者比后者先執(zhí)行過濾的話,過濾后就變成“今天***組織集合”,但理想情況是“今天*****集合”,所以要把長的關鍵詞放前面。接著逐個讀取目標字符串的字符,轉成int型后判斷索引數(shù)組中是否有值,為空那么將該字符添加到結果集中〔一個StringBuilder〕;不為空那么循環(huán)該首字符開頭的關鍵詞,逐個字符比擬,有匹配的那么以等長的特殊字符代替〔默認是*號〕。模擬步驟如下:關鍵詞表為:“法O功組織”,“法O功”,“李洪志”字符“法”轉成int為27861字符“李”轉成int為26446因此索引數(shù)組的下標27861的值為長度2的泛型集合,下標26446的值為長度1的泛型集合,其余都為空。目標字符串為“今天法O功組織集合,李洪志發(fā)表李洪”1逐個字符讀取,“今”和“天”相應的索引數(shù)組的值為空,將它們放入結果集中?!布t色字符表示當前下標讀取的字符〕目標:今天法O功組織集合,李洪志發(fā)表李洪結果:今天2“法“對應的索引數(shù)組值不為空,那么循環(huán)該泛型集合,逐個字符比對目標:今天法O功組織集合,李洪志發(fā)表李洪泛型集合:法O功組織完全匹配,那么結果集中放入5個*號。結果:今天*****3“集”“合”“,”對應的索引數(shù)組值都為空,將它們放入結果集中。目標:今天法O功組織集合,李洪志發(fā)表李洪結果:今天*****集合,4“李“對應的索引數(shù)組值不為空,那么循環(huán)該泛型集合,逐個字符比對目標:今天法O功組織集合,李洪志發(fā)表李洪泛型集合:李洪志完全匹配,那么結果集中放入3個*號。結果:今天*****集合,***5“發(fā)”“表”對應的索引數(shù)組值都為空,將它們放入結果集中。目標:今天法O功組織集合,李洪志發(fā)表李洪結果:今天*****集合,***發(fā)表6“李“對應的索引數(shù)組值不為空,那么循環(huán)該泛型集合,逐個字符比對目標:今天法O功組織集合,李洪志發(fā)表李洪泛型集合:李洪志 不匹配,將“李“放入結果集中。結果:今天*****集合,***發(fā)表李 7“洪”對應的索引數(shù)組值都為空,將它放入結果集中。目標:今天法O功組織集合,李洪志發(fā)表李洪(讀到末尾)結果:今天*****集合,***發(fā)表李洪最后過濾結果就是:“今天*****集合,***發(fā)表李洪”當執(zhí)行替換操作時,只是在關鍵字匹配的時候,在關鍵字左右加上給定的字符串,其余和過濾操作一樣。比方將“周公”替換為“--周公==”效率的瓶頸最開始的版本,判斷當前下標后面的字符串時候與關鍵詞匹配,用SubString方法,過濾200K的文本需要143秒時間;然后改成逐個字符去比對,時間減少到11秒;接著用首字符作索引,減少到0.078秒;最后對new結果集StringBuilder對象時指定了目標字符串的長度,并且逐個字符比對關鍵詞時從下一個字符開始〔因為當前字符可由對應的索引數(shù)組不為空得出肯定匹配的結論〕,最后耗時為0.048秒。后來考慮可以將目標字符串平均拆分,開啟幾個線程同時去過濾,但是效率提升效果不是很明顯〔詳見〕。結論:SubString方法效率極低,建議不要在循環(huán)次數(shù)很多的時候使用。如果能預先知道StringBuilder的長度或者是大概的范圍,new該對象的時候指定,能大大提高效率。〔因為如果不指定大小,它內部是預先設成長度為16,當容量不夠時,自動翻倍,這時會有一個數(shù)組擴容和復制內容的過程,耗時不小〕,這同樣適用于集合,比方List多線程不一定總是能提高效率,在數(shù)據(jù)量沒到達某個數(shù)量級的時候,系統(tǒng)維護線程池所帶來的開銷不一定能抵過多線程帶來的效率。使用詳解publicstaticIList<string>[]GetKeyWordArray(IList<string>KeyWordList,boolIsIgnoreCase)方法解釋:靜態(tài)方法,用于根據(jù)關鍵詞列表的首字符獲取索引數(shù)組。當設為不分大小寫時,首字符的大寫和小寫對應的索引都會添加。索引數(shù)組建議緩存起來。參數(shù):KeyWordList:關鍵詞列表IsIgnoreCase:是否不分大小寫publicstaticIList<string>[]GetKeyWordArray(string[]KeyWordList,boolIsIgnoreCase)方法解釋:靜態(tài)方法,用于根據(jù)關鍵詞列表的首字符獲取索引數(shù)組。當設為不分大小寫時,首字符的大寫和小寫對應的索引都會添加。索引數(shù)組建議緩存起來。參數(shù):KeyWordList:關鍵詞列表IsIgnoreCase:是否不分大小寫publicstringFilterSingleThread(stringContent,IList<string>[]SensitiveArray,charReplaceChar,boolIsIgnoreCase)方法解釋:單線程處理過濾,根據(jù)給定的敏感詞過濾表數(shù)組過濾給定字符串,〔適合在數(shù)據(jù)量小的時候〕,替換成指定字符。參數(shù):Content:需要處理的字符串SensitiveArray:索引數(shù)組ReplaceChar:替換后的字符IsIgnoreCase:是否不分大小寫,注意這里最好與調用GetKeyWordArray方法的IsIgnoreCase參數(shù)一致。publicstringFilterSingleThread(stringContent,IList<string>[]SensitiveArray)方法解釋:單線程處理過濾,根據(jù)給定的敏感詞過濾表數(shù)組過濾給定字符串,不分大小寫,〔適合在數(shù)據(jù)量小的時候〕,替換成*號。參數(shù):Content:需要處理的字符串SensitiveArray:索引數(shù)組publicstringFilterMuliThread(stringContent,IList<string>[]SensitiveArray,intThreadCount,charReplaceChar,boolIsIgnoreCase)方法解釋:多線程處理過濾,根據(jù)給定的敏感詞過濾表數(shù)組過濾給定字符串,〔適合在數(shù)據(jù)量大的時候〕,替換成指定字符。參數(shù):Content:需要處理的字符串SensitiveArray:索引數(shù)組ThreadCount:線程數(shù)量。僅測試,對8M以內的數(shù)據(jù)設為2就夠了,多了效果也不明顯。ReplaceChar:替換后的字符IsIgnoreCase:是否不分大小寫,注意這里最好與調用GetKeyWordArray方法的IsIgnoreCase參數(shù)一致。publicstringFilterMuliThread(stringContent,IList<string>[]SensitiveArray,intThreadCount)方法解釋:多線程處理過濾,根據(jù)給定的敏感詞過濾表數(shù)組過濾給定字符串,不分大小寫,〔適合在數(shù)據(jù)量大的時候〕,替換成*號。參數(shù):Content:需要處理的字符串SensitiveArray:索引數(shù)組ThreadCount:線程數(shù)量。僅測試,對8M以內的數(shù)據(jù)設為2就夠了,多了效果也不明顯。publicstringReplace(stringContent,IList<string>[]KeyWordArray,stringLeftStr,stringRightStr,boolIsIgnoreCase)方法解釋:執(zhí)行替換操作,根據(jù)給定的關鍵詞替換表數(shù)組替換給定字符串,對符合條件的關鍵詞左右加上給定的字符串。替換操作目前不提供多線程版本。參數(shù):Content:需要處理的字符串KeyWordArray:索引數(shù)組LeftStr:在左邊加上的字符串RightStr:在右邊加上的字符串IsIgnoreCase:是否不分大小寫,注意這里最好與調用GetKeyWordArray方法的IsIgnoreCase參數(shù)一致。publicstringReplace(stringContent,IList<string>[]KeyWordArray,stringLeftStr,stringRightStr)方法解釋:執(zhí)行替換操作,根據(jù)給定的關鍵詞替換表數(shù)組替換給定字符串,對符合條件的關鍵詞左右加上給定的字符串,不分大小寫。替換操作目前不提供多線程版本。參數(shù):Content:需要處理的字符串KeyWordArray:索引數(shù)組LeftStr:在左邊加上的字符串RightStr:在右邊加上的字符串一些細節(jié)在以多線程作過濾,用KeyWordThreadMOD作為輔助實體類,記錄某個線程中處理的目標字符串的起始下標、結束下標以及結果集、是否處理完畢的信息。當開了線程去執(zhí)行時,以一個死循環(huán)來拖住主線程,在里面判斷是否所有的線程都已處理完畢,處理完了才跳出死循環(huán),如果沒處
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 大廈物業(yè)長期租賃合同范例
- 外聘退休人員勞務合同范例
- 大棚農莊租賃合同范例
- 工地個人勞務合同范例
- 奉賢折臂吊車租賃合同模板
- 義齒代理加工合同范例范例
- 山林承租合同范例
- 小學建設用地買賣合同模板
- 公司食堂租賃合同范例
- 2024年湖州公交車從業(yè)資格證考試題庫
- 建國集團財務制度匯總
- 安裝工程預算照明配管配線
- 區(qū)最新關于生活垃圾分類工作推進會上的講話稿
- 除塵器安裝專業(yè)監(jiān)理實施細則
- 任現(xiàn)職以來教學改革情況
- 八年級黃金矩形(數(shù)學活動)ppt課件
- 銷售技巧個頂尖電梯銷售技巧
- 工程施工管理協(xié)議書(共7頁)
- 《幼兒園衛(wèi)生保健后勤材料資料》幼兒園保健醫(yī)生每日檢查工作記錄表
- 換鋪長鋼軌施工方案(工機段版)
- 第二章算法與問題解決PPT課件
評論
0/150
提交評論