HutoolUtilツールキットのDFAを使用して、キーワードを含むコンテンツをフィルタリングするための有限オートマトンを決定します。これは非常に優れており、強力です。

1.既存の要件は次のとおりです。

バックグラウンドスタッフがN個のキーワードを追加し、メインサイトのすべてのコンテンツをクリーンアップすると、これらのキーワードを含むすべてのコンテンツが無効になります。

アイデア

この要件を取得するために、私の最初の解決策はかなり失礼です。キーワードのHashSetを作成してから、データベース全体をトラバースし、記事ごとにこのセットをトラバースして、キーワードが含まれているかどうかを確認します...まあ、これはキーワードの増加とデータの増加に伴い、このプロセスで消費される時間は指数関数的に増加します。

そこで、Du Niangを見つけ、アルゴリズムDFAを見つけました。

DFAの概要

DFAのフルネームは次のとおりです。決定性有限オートマトン、つまり、決定性有限オートマトン。私のアルゴリズムは十分ではないので、興味があればこのブログを読むことができます:  DFAセンシティブワードクエリに基づくアルゴリズムの簡単な分析

原理を説明するのは難しいことではありません。すべてのキーワードでツリーを構築してから、テキストでツリーをトラバースし、リーフノードにトラバースしてキーワードが記事に存在することを示します。

とりあえずキーワードツリーを構築する時間を無視しましょう。テキストを検索するたびに必要なのはO(n)の複雑さだけです。

DFAアルゴリズムとインターネット上のいくつかの実装について、Hutoolは組織化および改善され、最終的に現在のHutool-dfaモジュールを形成しました。

 

使用する

1.キーワードツリーを構築します

WordTree tree = new WordTree();
tree.addWord("大");
tree.addWord("大土豆");
tree.addWord("土豆");
tree.addWord("刚出锅");
tree.addWord("出锅");

2.キーワードを探す

//正文
String text = "我有一颗大土豆,刚出锅的";
  1. ケース1:標準の一致、最短のキーワードの一致、一致したキーワードのスキップ
// 匹配到【大】,就不再继续匹配了,因此【大土豆】不匹配
// 匹配到【刚出锅】,就跳过这三个字了,因此【出锅】不匹配(由于刚首先被匹配,因此长的被匹配,最短匹配只针对第一个字相同选最短)
List<String> matchAll = tree.matchAll(text, -1, false, false);
Assert.assertEquals(matchAll.toString(), "[大, 土豆, 刚出锅]");
  1. ケース2:最短のキーワードが一致し、一致したキーワードがスキップされない
// 【大】被匹配,最短匹配原则【大土豆】被跳过,【土豆继续被匹配】
// 【刚出锅】被匹配,由于不跳过已经匹配的词,【出锅】被匹配
matchAll = tree.matchAll(text, -1, true, false);
Assert.assertEquals(matchAll.toString(), "[大, 土豆, 刚出锅, 出锅]");
  1. ケース3:最長のキーワードが一致し、一致したキーワードがスキップされる
// 匹配到【大】,由于到最长匹配,因此【大土豆】接着被匹配
// 由于【大土豆】被匹配,【土豆】被跳过,由于【刚出锅】被匹配,【出锅】被跳过
matchAll = tree.matchAll(text, -1, false, true);
Assert.assertEquals(matchAll.toString(), "[大, 大土豆, 刚出锅]");
  1. 状況4:最長のキーワードが一致し、一致したキーワードがスキップされない(最も完全なキーワード)
// 匹配到【大】,由于到最长匹配,因此【大土豆】接着被匹配,由于不跳过已经匹配的关键词,土豆继续被匹配
// 【刚出锅】被匹配,由于不跳过已经匹配的词,【出锅】被匹配
matchAll = tree.matchAll(text, -1, true, true);
Assert.assertEquals(matchAll.toString(), "[大, 大土豆, 土豆, 刚出锅, 出锅]");

matchAllメソッドに加えてWordTreeそれも提供されmatchisMatch2つのメソッド、2つのメソッドは結果の最初の一致のみを見つけるので、最初のキーワードが見つかった場合、一致を停止して続行し、マッチングの効率を大幅に向上させます。

特殊文字の場合

テキスト内のキーワードに「〓Key☆Word」などの特殊文字が含まれている場合があります。この場合、HutoolはStopChar特殊文字の処理をスキップするクラスを提供します。このプロセスは1matchつまたは複数のmatchAllメソッドで実行されます。特殊文字はその時に自動的に削除されます。

 

 

 

おすすめ

転載: blog.csdn.net/qq_31905135/article/details/111031995