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

ブログ    
ブログ    
ブログ    

推薦する

業界初のNLPシナリオ向けディープラーニングフレームワークがオープンソースに

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

NLPモデル「包括的分析+評価ランキング」、CMUの最新ツールが優れたアイデアを見つけるのに役立ちます

[[396522]] CMU は、復旦大学とオハイオ州立大学の研究者と共同で、モデルの理解度分析と...

今後 5 年間で最も収益性の高い業界は何ですか?人工知能を勝ち取る者はインターネットを勝ち取るのでしょうか?

[[221537]]今後 5 年間で最も価値のある起業の方向性は何でしょうか?どの起業分野を選択す...

画像の混合を利用してより細かい特徴表現を学習するCMU Xing Boのチームの新しい論文がAAAIに選出されました

これは、カーネギーメロン大学とカリフォルニア大学バークレー校の Eric Xing 氏と Trevo...

OpenAIの共同創設者Karpathyがアルパカに恋をする: 赤ちゃんLlama2を実装する純粋なCコード、MacBookが動作可能、1.6kの星を獲得

今週、Meta のオープンソース Llama2 が AI コミュニティ全体で人気を博しました。その結...

顔認証決済はまだ普及していないが、中央銀行はすでに新しい決済方法を発表しており、ジャック・マーは今回不意を突かれた

顔認識の隠れた危険性これらの便利な支払い方法が普及したのは、ジャック・マーのおかげです。アリペイの登...

...

いくつかの一般的な暗号化アルゴリズムのPython実装

私たちは日常生活の中で、暗号化アルゴリズムによく遭遇します。今日は、これらの暗号化アルゴリズムの P...

IoT が成功するために AI が必要な理由

モノのインターネットは膨大な量のデータを生成します。そのデータは、都市が事故や犯罪を予測するのに役立...

...

AIチップブラックテクノロジーインベントリ

ビッグデータとディープラーニングの利用が増えるにつれて、基盤となるハードウェアとチップに新たな要件が...

運転教習業界にも「AI」の波が吹き荒れる、普及規模に注目

[[422314]]近年、都市化と道路交通建設の加速により、自動車旅行の需要が継続的に増加しており、...

アマゾン ウェブ サービスが中国で新たな機械学習サービスを開始

[51CTO.com からのオリジナル記事]現在、ますます多くの企業が機械学習や人工知能に多額の資金...

アクチュエータ研究の進歩により、0.1mm未満のロボットが誕生しました。

英国の雑誌「ネイチャー」は26日、ロボット工学の最新成果を発表した。ロボットを動かすための重要な部品...

アルゴリズム: Javascript をエレガントに使用して構造ツリーを再帰的に描画する方法

[[376839]]再帰と末尾再帰簡単に言えば、再帰とは関数が自分自身を呼び出すことです。プログラミ...