2017-01-26 1 views
1

内の単語を見つけるために高速正規表現...(5000個の単語の周り)Javaの - 私は、殺人、犯罪、役員、強盗、犯人、事故、事故、クラッシュ、殺害され、のような言葉の定義済みのセットを持っているテキスト

私はこの記事をニュース記事(およそ1kb〜5kbのテキスト)にマッチさせたいと思っていれば、それらの言葉をそれに応じて分類します。言葉が

if(article.contains(" "+word+" ")) { \*do something*\ } 

しかし、これは言葉がフルストップ、コンマまたはその他の記号が続いているときは動作しませんすなわち後、同じ単語の先頭のために行く前に、当初、私はちょうど

だから私は、スイッチのスペースを使用しますワード境界で正規表現することができますが、コードの実行速度が20倍遅くなり、CPU使用量が5スレッドで100%になります。

誰もがJavaでより良いソリューションを持っていますか?すべてのヘルプが喜ばれています:)

+0

それはまた、 'con'と 'constable'が異なる単語 'con'がテキストの 'constable'と一致してはならないという意味でcontainin wordと一致します。 –

+0

まず、アルゴリズムを決定し、次に** Javaで実装を探す。 [ここ](http://stackoverflow.com/questions/3260962/algorithm-to-find-multiple-string-matches)を参照してください –

+0

この質問の回答http://stackoverflow.com/questions/225337/how-do -i-split-a-string-with-any-whitespace-chars-as-delimitersは便利かもしれません。 –

答えて

0

あなたはいつも単語に特別な記号が含まれているかどうかをチェックする必要がありますので、単語の中の余分な毛羽/記号を取り除くために\ Wを使用してreplaceAll関数を呼び出すことをお勧めしますある。

String wordToLookup = " " + word.replaceAll("\\W", "") + " "; 
if(article.contains(wordToLookup)) 
{ 
    //do something 
} 
0

私は正規表現がその検索を処理するための最良のツールであるとは思わないが、あなたはより良いツールが見つからない場合は、すでに最適化された正規表現を作り上げることにより、多くの時間を勝つことができます。ほんの一握りのトークンと小さな検索文字列を使ってthat testをチェックすると、1つのパターンの検索は、すでに複数のパターンの検索よりも4倍高速です。

:私はあなたが手でその正規表現を生成し、維持することを期待していないが、その後、正規表現を作るために使用される接頭辞ツリーにトークンのリストを変換することが可能であろう5000個のトークンを持つ今、明らかに

tokens : con, conman, constitution, correct, exact 

tree : ^
     c  e 
     o  x 
    n r a 
    s $ m r c 
    t a e t 
    i n c $ 
    t $ t 
[...]  $ 

regex : \\b(co(n(stitution|man)?|rrect)|exact)\\b 

とにかく私は、既存の全文検索ライブラリを調べて、おそらく多くの労力をかけずに問題をはるかに効率的に解決できるはずです。

+0

ありがとうございます。プレフィックスツリーを作成するのは良い考えですが、今はあまり時間がありません。しかし、私はいくつかのフルテキストマッチエンジンがそのトリックをするかどうか最初に確認します。 –

+0

プレフィックスツリーを作成するのは難しいことではありません。私はそこにライブラリがあると確信しています。私はトークンがテキストだけであり、あなたが完璧な最適化を直接達成することを気にしないならば、あなたは基本的な正規表現をかなり簡単に得ることができるが、それから正規表現を作ることは難しい部分だと思う。私はそれで亀裂を取るかもしれない:) – Aaron

関連する問題