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

ブログ    
ブログ    
ブログ    

推薦する

Baidu Brainの生体検知+合成画像識別、顔の「写真活性化」ブラックマーケット攻撃を1秒で捉える

現在、顔認識技術の成熟度が増すにつれ、特にDeepFakeやFaceSwapなどの顔編集・生成技術の...

...

必読 | AI 変革のための開発者ガイド

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

...

第1回自動車開発者会議(2021)が成功裏に終了しました

10月20日、国家インテリジェントコネクテッドビークルイノベーションセンター(以下、「イノベーション...

Weibo の背後にあるビッグデータの原理を探る: 推奨アルゴリズム

推薦システムは早くから誕生していたが、本格的に注目されるようになったのは、「Facebook」に代表...

OpenAI の共同創設者 Karpathy が記事「自動運転による AGI の解釈」を公開しました。元の投稿は削除されました。保存済み

「汎用人工知能」に関しては、OpenAIの科学者カルパシー氏が説明を行った。数日前、Karpathy...

オープンソース | AREX: Ctrip の次世代自動回帰テスト ツールの設計と実装

著者についてCtrip の R&D エネルギー効率マネージャー兼 SRE である Haibi...

自動運転車におけるサイバーセキュリティの役割

自動車業界は、安全性、持続可能性、接続性、全体的なユーザーエクスペリエンスを向上させるソフトウェアの...

DevOps で AI を使用して非線形スケーリングを実現する方法

テクノロジーが飛躍的に進歩するにつれ、AI はスピード、スケーラビリティ、品質、柔軟性を求めるあらゆ...

sklearnのトレーニング速度が100倍以上向上、米「Fanli.com」がsk-distフレームワークをオープンソース化

この記事では、Ibotta (「Rebate Network」の米国版) の機械学習およびデータ サ...

...

...