2

分類したい文字列が1,000,000個あります。私がこれを行う方法は、単語やフレーズのセットが含まれている場合にバケット化することです。単語のセットは約10,000です。正規表現をサポートできるのが理想的ですが、現在は正規表現を高速に実行することに重点を置いています。フレーズ例:

フォード、ポルシェ、マツダ..

各単語を文字列と1つずつ一致させたくないので、正規表現を使用することにしました。残念ながら、正規表現の問題が発生しています。

Regexp.new( "(a)" * 253)=> /(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a )(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)( a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a) (a)(a)(a)(a)(a)(a)(a)(a)(a)..。

Regexp.new( "(a)" * 254)RegexpError:正規表現が大きすぎます:/(a)(a)(a)(a)(a)(a)(a)(a)(a)(a) (a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a )(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)(a)..

ここで、aは私の単語またはフレーズの1つです。今、私は10,000/253試合を実行することを計画しています。正規表現の長さがパフォーマンスに大きく影響することを読みましたが、正規表現の一致は非常に単純で、正規表現は非常に迅速に作成されます。どうにかして制限を回避したいのですが、誰かアイデアがあればもっと良い解決策を使いたいと思います。ありがとう。

4

1 に答える 1

1

10k語を認識するための他のメカニズムを検討するかもしれません。

  • Trie:プレフィックスツリーと呼ばれることもあり、単語検索を行うためにスペルチェッカーによってよく使用されます。ウィキペディアでトライを参照してください
  • DFA(決定性有限オートマトン):DFAは、言語のトークンを認識するために、コンパイラーのレクサーによって作成されることがよくあります。DFAは非常に高速に実行されます。単純な正規表現は、多くの場合、DFAにコンパイルされます。ウィキペディアでDFAを参照してください
于 2012-09-25T03:02:29.133 に答える