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は地球を救うことができるのか

ブログ    
ブログ    
ブログ    

推薦する

止まらないAIブームに一部の企業は慌てている

AMD は、世界中の IT リーダーを対象にした新しい調査の結果を発表し、多くのリーダーが最近の人工...

データサイエンスが音楽業界に革命を起こす

デジタル時代において、データは音楽業界が音楽を制作し、配信し、聴衆とつながる方法において強力な指揮者...

...

分散システム設計のための負荷分散アルゴリズム

概要分散システムの設計では、通常、サービスはクラスターに展開されます。クラスター内の複数のノードが同...

コミック版:ディープラーニングって何?

Google はどのようにしてわずか数秒で Web ページ全体をさまざまな言語に翻訳するのか、ある...

人工知能の波で私たちは職を失うのでしょうか?

[[200388]]概要: 私たちの仕事が機械に置き換えられるのはいつでしょうか? 最も危険な仕事...

...

...

マスク氏とクック氏は秘密協定を結んだのか?アップルは「アップル税」でテスラに数百万ドルの節約をもたらす

ビッグデータダイジェスト制作著者: カレブ周知のとおり、Apple の App Store のポリシ...

クラウドコンピューティング機械学習プラットフォームの選び方

クラウド コンピューティング 機械学習プラットフォームは、機械学習のライフ サイクル全体をサポートす...

クラウド管理と運用にAIを適用する方法

AI は、クラウドの管理と運用に大変革をもたらすものとして台頭しています。しかし、AI とクラウド ...

人工知能を初めて適用するときに尋ねるべき5つの質問

企業が社内でソリューションを構築する必要は必ずしもありませんが、これが失敗の一般的な原因となります。...

AIはどのようにして責任を持つようになるのでしょうか?英国規格協会が答えを持っている

人工知能(AI)は、現在世界で最も革新的で影響力のある技術の1つであり、さまざまな分野や産業に浸透し...

教育は新世代の人工知能の発展を積極的に支援すべきである

[[250135]]習近平総書記は中国共産党中央委員会政治局第9回集団学習会で、人工知能は新たな科学...

パンデミック下でIoTが「最前線で働く人」の役割を果たす

[[397252]]画像ソース: https://pixabay.com/images/id-594...