C# の敏感な単語フィルタリング アルゴリズムの実装

C# の敏感な単語フィルタリング アルゴリズムの実装

この記事はWeChatの公開アカウント「UP Technology Control」から転載したもので、著者はconanです。この記事を転載する場合は、UP Technology Controlの公式アカウントまでご連絡ください。

繊細な単語やテキストのフィルタリングは Web サイトの重要な機能であり、適切で効率的なフィルタリング アルゴリズムを設計することが非常に重要です。

テキスト フィルタリングを実装するためのアルゴリズムの中で、DFA は唯一の比較的優れた実装アルゴリズムです。 DFA は Deterministic Finite Automaton の略で、決定論的有限オートマトンです。イベントと現在の状態から次の状態を取得します。つまり、イベント + 状態 = 次の状態です。センシティブな単語フィルタリングを実装するためのアルゴリズムでは演算を削減する必要がありますが、DFA アルゴリズムでは計算はほとんどなく、状態遷移のみになります。

C#で実装する方法を見てみましょう

1. センシティブワードライブラリクラスを構築する

  1. プライベートブール LoadDictionary()
  2. {
  3. var wordList = 新しいリスト<文字列>();
  4. _memoryLexicon == null場合
  5. {
  6. _memoryLexicon = 新しいWordGroup[ char .MaxValue];
  7. var words = new SensitiveWordBll().GetAllWords();
  8. if ( 単語 == null )
  9. 戻る 間違い;
  10. foreach (文字列 word in words)
  11. {
  12. wordList.Add (単語) ;
  13. var chineseWord = Microsoft.VisualBasic.Strings.StrConv(word,
  14. Microsoft.VisualBasic.VbStrConv.TraditionalChinese、0);
  15. if (単語 != 中国語単語)
  16. wordList.Add (中国語の単語) ;
  17. }
  18. foreach (var word in wordList)
  19. {
  20. (単語の長さ > 0)
  21. {
  22. var group = _memoryLexicon[単語[0]];
  23. if (グループ== null )
  24. {
  25. グループ= 新しい WordGroup();
  26. _memoryLexicon[単語[0]] =グループ;
  27. }
  28. グループ.Add (単語.部分文字列( 1));
  29. }
  30. }
  31. }
  32. 戻る 真実;
  33. }

2. センシティブな単語検出クラスを構築する

  1. プライベート boolチェック(文字列 blackWord)
  2. {
  3. _wordlength = 0;
  4. //ソースの次のカーソルを検出します
  5. _nextCursor = _cursor + 1;
  6. var 見つかりました = false ;
  7. var 継続チェック = 0;
  8. //各単語を走査して一致するものを探す
  9. (var i = 0; i < blackWord.Length; i++)の場合
  10. {
  11. //特殊文字オフセットカーソル
  12. var オフセット = 0;
  13. _nextCursor >= _sourceText.Length の場合
  14. {
  15. (i - 1 < blackWord.Length - 1) の場合
  16. 見つかりました = false ;
  17. 壊す;
  18. }
  19. それ以外 
  20. {
  21. // 下の文字が漢字、数字、文字ではないかどうかを確認し、オフセットを1増やします
  22. (var y = _nextCursor; y < _sourceText.Length; y++)の場合
  23. {
  24. if (!IsChs(_sourceText[y]) && !IsNum(_sourceText[y]) && !IsAlphabet(_sourceText[y]))
  25. {
  26. オフセット++;
  27. //特殊文字を避け、下カーソルが文字列の長さ以上の場合はジャンプします
  28. (_nextCursor + offset >= _sourceText.Length) の場合
  29. 壊す;
  30. _単語長++;
  31. }
  32. そうでなければ中断します。
  33. }
  34. (_nextCursor + offset >= _sourceText.Length) の場合
  35. {
  36. 見つかりました = false ;
  37. 壊す;
  38. }
  39. if (blackWord[i] == _sourceText[_nextCursor + offset])
  40. {
  41. 見つかりました = true ;
  42. 継続チェック = 0;
  43. }
  44. それ以外 
  45. {
  46. // 一致するものが見つからない場合は、さらに4文字を一致させようとします
  47. (continueCheck < 4 && _nextCursor < _sourceText.Length - 1) の場合
  48. {
  49. チェックを続行します++;
  50. 私 - ;  
  51. }
  52. それ以外 
  53. {
  54. 見つかりました = false ;
  55. 壊す;
  56. }
  57. }
  58. }
  59. _nextCursor = _nextCursor + 1 + オフセット;
  60. _単語長++;
  61. }
  62. 戻り値が見つかりました。
  63. }
  64. }

3. テストと使用方法

  1. _illegalWords = 新しいリスト<文字列>();
  2. if (string.IsNullOrEmpty(sourceText) && string.IsNullOrEmpty(_sourceText))
  3. {
  4. ソーステキストを返します
  5. }
  6.  
  7. if (!string.IsNullOrEmpty(sourceText))
  8. _sourceText = ソーステキスト;
  9. _カーソル = 0;
  10. もしも (!LoadDictionary())
  11. {
  12. _sourceText を返します
  13. }
  14.  
  15. var tempString = _sourceText.ToCharArray();
  16. var sourceTextDbc = ToDBC(ソーステキスト);
  17. (var i = 0; i < SourceText.Length; i++)の場合
  18. {
  19. //この単語を最初の文字として含むフレーズをクエリします
  20. varグループ= _memoryLexicon[sourceTextDbc[i]];
  21. if (グループ!= null )
  22. {
  23. (var z = 0; z <グループ. Count (); z++)の場合
  24. {
  25. 文字列 word = group.GetWord (z);
  26. if (word.Length == 0 || Check (word))
  27. {
  28. if (isFirstCheckedReturn)
  29. {
  30. 戻る ヌル;
  31. }
  32.  
  33. var blackword = 文字列.Empty;
  34. (var pos = 0; pos < _wordlength + 1; pos++)の場合
  35. {
  36. blackword += tempString[pos + _cursor].ToString();
  37. tempString[pos + _cursor] = ReplaceChar;
  38. }
  39. _illegalWords.Add (ブラックワード) ;
  40.  
  41. _cursor = _cursor + _wordlength;
  42. i = i + _単語長;
  43. 壊す;
  44. }
  45. }
  46. }
  47. _カーソル++;
  48. }
  49. 新しい文字列(tempString)を返します
  1. var フィルター = 新しい SensitiveWordFilter();
  2. filter.SourceText = "dddddd" ;
  3. var ソーステキスト = filter.SourceText;
  4. フィルターをリセットします。
  5. var datetime = DateTime.Now;
  6. var ss = filter.Filter();
  7. var datetime2 = DateTime.Now;
  8. var ミリ秒 = (datetime2 - datetime).TotalMilliseconds;
  9. Console.WriteLine(ミリ秒);
  10. Console.WriteLine(ss);
  11. var words = System.IO.File.ReadAllLines(@ "D:\Recv\Sensitive Word Library.txt" , System.Text.Encoding.UTF8);
  12. var ssx = ソーステキスト;
  13. var datetimex = DateTime.Now;
  14. foreach (var word in words)
  15. {
  16. (単語の長さ > 0)
  17. ssx = ssx.Replace (word, "*" .PadLeft(word.Length, '*' ));
  18. }
  19. var datetime2x = DateTime.Now;
  20. var millisecondx = (datetime2x - datetimex).TotalMilliseconds;
  21. Console.WriteLine(ミリ秒x);
  22. コンソールに行を書き込む

<<:  Google は NLP モデルのデバッグを許可しており、必要なのは「ドラフト ペーパー」だけです。

>>:  AIは地球を救うことができるのか

ブログ    

推薦する

...

人工知能はドローンの将来にどのような影響を与えるのでしょうか?

人工知能の破壊的な可能性を解き放ち、それがドローンの未来をどのように変えるのかを探ります。常に進化を...

...

...

...

...

なぜ人工知能は高度な数学を解くことができるのでしょうか?

まずは大学院入試から始めましょう。大学院入試の重要性は大学入試の重要性に匹敵します。数字で言うと、2...

パスワードを解読する方法: 暗号ハッシュアルゴリズムの識別

Q: パスワードのビットシーケンスから暗号化アルゴリズムを識別することは可能ですか? A: 外部ソー...

マイクロソフトが27億パラメータのPhi-2モデルを発表、多くの大規模言語モデルを上回る性能を発揮

マイクロソフトは、Phi-2 と呼ばれる人工知能モデルをリリースしました。このモデルは、その 25 ...

データサイエンスにおける一般的な課題は何ですか?

2017 年後半を迎えるにあたり、データ サイエンスと機械学習を活用する企業が直面する共通の課題に...

...

...

SFが現実になる?偉大な劉慈欣がAI企業に入社

[[411067]]サイエンスフィクションと現実がこれほど近づいたことはかつてありませんでした。 「...

...

モバイル写真と人工知能が出会うとき

現在では、カメラ機能はスマートフォンの標準機能となり、スマートフォンの大きなセールスポイントとなって...