次の要件については、Javaで何らかのソリューションが必要です。
- テキストで特定の用語を検索します(各用語は1〜3語にすることができます)。例:{"hello world"、"hello"}。一致は正確である必要があります。
- 約500種類の用語グループがあり、それぞれに約30の用語が含まれています。
- 各テキストには最大4000語を含めることができます。
パフォーマンスは重要な問題です。
ありがとう、ロッド
次の要件については、Javaで何らかのソリューションが必要です。
パフォーマンスは重要な問題です。
ありがとう、ロッド
特注のスパムフィルターについても同様のことをしました。
シンプルで高速であることがわかったテクニックは次のとおりです。
intern()ステップ3の比較を単純化するために、各単語を呼び出します。Term最大3つの文字列の配列をカプセル化してクラスを作成します。そのequals()メソッドは、を呼び出すのではなく、文字列に対してポインタ比較を行うことができますString.equals()。Term入力内の2つまたは3つの連続する単語のグループごとにインスタンスを作成します。Multimap(Googleコレクションから)を使用して、各用語をそれが表示されるファイルのセットにマップします。正規表現を使用します。参照: http: //java.sun.com/docs/books/tutorial/essential/regex/
これには2つの部分があるようです。まともなアルゴリズムを考え出し、それをJavaで実装します。(今のところ、確かに「そこに」誰かがすでにこれを実装しているという考えは脇に置いておきましょう。おそらくいくつかのアイデアを見つけることができます。)
高価な作業を繰り返さないようにしたいようです。しかし、コストがどこにあるかは明確ではありません。したがって、いくつかの候補アプローチのベンチマークを行う準備をする必要があると思います。また、「十分に良い」ものを念頭に置いてください。
あなたがそれがうまくいくと考えることができる最も単純なことから始めてください。それを測定します。あなたはそれが十分に良いという驚くべき結果を得るかもしれません。やめて!たとえば、これは本当にばかげています:
read text into String (4k, that's not too big)
for each term
use regexp to find matches in text
ただし、応答時間は1秒未満になる可能性があります。200ミリ秒の応答を100ミリ秒まで下げた場合、ユーザーは本当に気になりますか?彼らはいくら払うでしょうか?
別のアプローチ。これの方が速いのかな?
prepare a collection of terms keyed by first word
tokenize the text
for each token
find terms that match
check for match (using look ahead for multi-word terms)
Javaでの実装について。別の問題は、必要に応じて特定の質問をします。