私はAho-Corasickテキストマッチングを使用していますが、文字ではなく用語に一致するように変更できるかどうか疑問に思っています。言い換えれば、私は用語が文字ではなくマッチングの基礎になることを望んでいます。例として:
検索クエリ:「彼」、
文:「Helloworld」、
Aho-Corasickは、「he」をインデックス2で終わる「helloworld」という文に一致させますが、一致させたくありません。つまり、文字ではなく「用語」という言葉を意味します。
私はAho-Corasickテキストマッチングを使用していますが、文字ではなく用語に一致するように変更できるかどうか疑問に思っています。言い換えれば、私は用語が文字ではなくマッチングの基礎になることを望んでいます。例として:
検索クエリ:「彼」、
文:「Helloworld」、
Aho-Corasickは、「he」をインデックス2で終わる「helloworld」という文に一致させますが、一致させたくありません。つまり、文字ではなく「用語」という言葉を意味します。
これを行う1つの方法は、通常どおりAho-Corasickを使用してから、すべての誤検知を排除するフィルタリング手順を実行することです。たとえば、一致するものを見つけるたびに、入力の次の文字と前の文字がスペースや句読点などの文字以外の文字であることを確認できます。そうすれば、Aho-Corasickルックアップの速度が得られますが、テキスト内で単語全体として表示される一致のみが考慮されます。
お役に立てれば!
1つの可能性は、検索語にスペース文字を含めることです。おそらく、入力を前処理して、あらゆる種類の空白(スペース、改行、キャリッジリターン、タブなど)を同じスペース文字に変換した後です。
もう1つの可能性は、Aho-Corasickに関する限り、アルファベットの文字を単語であると考えることです。Aho-Corasickは、サイズ2 ^ 8のアルファベットの場合と同様に、入力テキストに表示される各単語が単一の文字としてエンコードされるサイズ2 ^ 32のアルファベットでも同じように高速に動作します(高速ではないにしても)。いつものように、文字は1バイトです。
いずれの場合も、前処理で句読点をどのように処理するかを決定する必要があります。
メソッドonlyWholewords()を使用する場合、上記の例では結果が得られないはずです。例えば:
Trie trie = Trie.builder()
.onlyWholeWords()
.addKeyword("He")
.build();
Collection<Emit> emits = trie.parseText("Hello World");
この場合、放出は空になります。
それは「彼」であるという言葉だけで結果を出すでしょう。
[azAZ]以外の文字には注意してください。たとえば、次の場合:
"He//Is"
「彼」をピックアップし、「//」を無視します
追加する2つのこと:
単語の境界を表明する場合は、次を使用できます。
onlyWholeWordsWhiteSpaceSeparated()の代わりに
onlyWholeWords()
一部の文字を「ホワイトリストに登録」したい場合は、次の記事が役立つ場合があります。
使用される単語文字は、提供されたものによって変更されたデフォルトの文字であり、ブールフラグは文字のオンとオフを切り替える場所を示します。これは、デフォルト文字のセットで特定の文字をオフにしたい場合に便利です。例えば:
使用される単語文字は、提供されたものによって変更されたデフォルトの文字であり、ブールフラグは文字のオンとオフを切り替える場所を示します。これは、デフォルト文字のセットで特定の文字をオフにしたい場合に便利です。例えば:
new WholeWordMatchSet(keywords、true、['_'、'=']、[false、true])
文字と数字、および-と=が単語文字と見なされるが、_とは見なされないセットを生成します。
パーティーに非常に遅れていますが、別のオプションは、単語の開始と終了を表すいくつかの記号をトライに挿入することです。次に、マッチング段階で、それに応じてマッチングする必要があります。私はそのアプローチを自分で試してみようとしています。