DFA在C#中的實現:過濾敏感詞
導讀 |
DFA即Deterministic Finite Automaton,也就是確定有窮自動機,它是是通過event和當前的state得到下一個state,即event+state=nextstate。在實現敏感詞過濾的演算法中,我們必須要減少運算,而DFA在DFA演算法中幾乎沒有什麼計算,有的只是狀態的轉換。
|
敏感詞、文字過濾是一個網站必不可少的功能,如何設計一個好的、高效的過濾演算法是非常有必要的。
在實現文字過濾的演算法中,DFA是唯一比較好的實現演算法。DFA即Deterministic Finite Automaton,也就是確定有窮自動機,它是是通過event和當前的state得到下一個state,即event+state=nextstate。在實現敏感詞過濾的演算法中,我們必須要減少運算,而DFA在DFA演算法中幾乎沒有什麼計算,有的只是狀態的轉換。
下面看下在c#方法下實現方式
1、構建敏感詞庫類
private bool LoadDictionary() { var wordList = new List(); if (_memoryLexicon == null) { _memoryLexicon = new WordGroup[char.MaxValue]; var words = new SensitiveWordBll().GetAllWords(); if (words == null) return false; foreach (string word in words) { wordList.Add(word); var chineseWord = Microsoft.VisualBasic.Strings.StrConv(word, Microsoft.VisualBasic.VbStrConv.TraditionalChinese, 0); if (word != chineseWord) wordList.Add(chineseWord); } foreach (var word in wordList) { if (word.Length > 0) { var group = _memoryLexicon[word[0]]; if (group == null) { group = new WordGroup(); _memoryLexicon[word[0]] = group; } group.Add(word.Substring(1)); } } } return true; }
2、構建敏感詞檢測類
private bool Check(string blackWord) { _wordlenght = 0; //檢測源下一位遊標 _nextCursor = _cursor + 1; var found = false; var continueCheck = 0; //遍歷詞的每一位做匹配 for (var i = 0; i < blackWord.Length; i++) { //特殊字元偏移遊標 var offset = 0; if (_nextCursor >= _sourceText.Length) { if (i - 1 < blackWord.Length - 1) found = false; break; } else { //檢測下位字元如果不是漢字 數字 字元 偏移量加1 for (var y = _nextCursor; y < _sourceText.Length; y++) { if (!IsChs(_sourceText[y]) && !IsNum(_sourceText[y]) && !IsAlphabet(_sourceText[y])) { offset++; //避讓特殊字元,下位遊標如果>=字串長度 跳出 if (_nextCursor + offset >= _sourceText.Length) break; _wordlenght++; } else break; } if (_nextCursor + offset >= _sourceText.Length) { found = false; break; } if (blackWord[i] == _sourceText[_nextCursor + offset]) { found = true; continueCheck = 0; } else { // 匹配不到時嘗試繼續匹配4個字元 if (continueCheck < 4 && _nextCursor < _sourceText.Length - 1) { continueCheck++; i--; } else { found = false; break; } } } _nextCursor = _nextCursor + 1 + offset; _wordlenght++; } return found; } }
3、測試與使用方法
_illegalWords = new List(); if (string.IsNullOrEmpty(sourceText) && string.IsNullOrEmpty(_sourceText)) { return sourceText; } if (!string.IsNullOrEmpty(sourceText)) _sourceText = sourceText; _cursor = 0; if (!LoadDictionary()) { return _sourceText; } var tempString = _sourceText.ToCharArray(); var sourceTextDbc = ToDBC(SourceText); for (var i = 0; i < SourceText.Length; i++) { //查詢以該字為首字元的片語 var group = _memoryLexicon[sourceTextDbc[i]]; if (group != null) { for (var z = 0; z < group.Count(); z++) { string word = group.GetWord(z); if (word.Length == 0 || Check(word)) { if (isFirstCheckedReturn) { return null; } var blackword = string.Empty; for (var pos = 0; pos < _wordlenght + 1; pos++) { blackword += tempString[pos + _cursor].ToString(); tempString[pos + _cursor] = ReplaceChar; } _illegalWords.Add(blackword); _cursor = _cursor + _wordlenght; i = i + _wordlenght; break; } } } _cursor++; } return new string(tempString); var filter = new SensitiveWordFilter(); filter.SourceText = "dddddd"; var sourctText = filter.SourceText; filter.ResetMemoryLexicon(); var datetime = DateTime.Now; var ss = filter.Filter(); var datetime2 = DateTime.Now; var millisecond = (datetime2 - datetime).TotalMilliseconds; Console.WriteLine(millisecond); Console.WriteLine(ss); var words = System.IO.File.ReadAllLines(@"D:\Recv\敏感詞庫大全.txt", System.Text.Encoding.UTF8); var ssx = sourctText; var datetimex = DateTime.Now; foreach (var word in words) { if (word.Length > 0) ssx = ssx.Replace(word, "*".PadLeft(word.Length, '*')); } var datetime2x = DateTime.Now; var millisecondx = (datetime2x - datetimex).TotalMilliseconds; Console.WriteLine(millisecondx); Console.WriteLine(ssx);
原文來自:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2847587/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JAVA使用DFA演算法過濾敏感詞Java演算法
- 過濾或者查詢敏感詞(DFA 演算法)演算法
- DFA演算法之內容敏感詞過濾演算法
- 教你如何實現Python 過濾敏感詞Python
- js實現敏感詞過濾演算法JS演算法
- 用laravel框架實現敏感詞彙過濾功能Laravel框架
- JavaWeb - 【Filter】敏感詞過濾JavaWebFilter
- 【面試被虐】說說遊戲中的敏感詞過濾是如何實現的?面試遊戲
- 基於PHP + TRIE樹實現敏感詞過濾演算法PHP演算法
- 高效的關鍵詞替換和敏感詞過濾工具
- JavaScript評論敏感詞過濾程式碼JavaScript
- springboot專案結合filter,jdk代理實現敏感詞過濾(簡單版)Spring BootFilterJDK
- 開源了一個 JavaScript 版敏感詞過濾庫JavaScript
- python輕鬆過濾處理髒話與特殊敏感詞彙的方法Python
- IM敏感詞演算法原理和實現演算法
- 非法詞彙過濾
- 編譯器前端之如何實現基於DFA的詞法分析器編譯前端詞法分析
- 從點陣圖到布隆過濾器,C#實現過濾器C#
- PbootCMS設定當前站點模板,模板子目錄,黑白名單,敏感詞過濾等boot
- SpringBoot中的過濾器和攔截器的實現Spring Boot過濾器
- mysql過濾複製的實現MySql
- java中listFiles(Filefilter filter)檔案過濾器的實現過程JavaFilter過濾器
- 在document.createTreeWalker()中過濾(3)
- 基於JavaScript的關鍵詞過濾示例JavaScript
- 匹配關鍵詞和敏感詞
- SQL Server 通過REVERSE實現C#中lastIndexOf的效果SQLServerC#ASTIndex
- 【log4j2日誌框架】敏感字元過濾框架字元
- Safari網頁敏感文字過濾外掛:Profanity Filter for Mac網頁FilterMac
- filter在JavaScript中過濾陣列元素FilterJavaScript陣列
- Java實現過濾中文亂碼Java
- PHP實現布隆過濾器PHP過濾器
- vivo 敏感詞匹配系統的設計與實踐
- 實現布隆過濾器的三種方式過濾器
- C#二維陣列在SLG中的實現和使用C#陣列
- 在 Python 中實現函式過載Python函式
- [C#] [WPF] 在MVVM中實現拖拽功能 - 入門C#MVVM
- WPF/C#:在WPF中如何實現依賴注入C#依賴注入
- 爬蟲敏感圖片的識別與過濾,瞭解一下?爬蟲