2011-01-31 6 views
1

のは、私はそうのようなテキストの段落があるとしましょう:テキスト解析デザインは

カタツムリ 水路、砂漠、そして深海 深さを含めた環境の非常に広い 範囲でを見つけることができます海のカタツムリの多くの種類が も新鮮な海で見つかったすることができます。 (source)

テキストを一致させるための1万の正規表現ルールが重複しています。たとえば、正規表現/Snails? can/iには、2つの一致が見付かります(テキストのイタリック体)。正規表現/can(also)? be/iには2つの一致(太字)があります。

私の正規表現を反復処理し、マッチを見つけた後、テキスト内のいくつかの場所を考えると、それはそれをmachedすべての正規表現を返すこと、使用するのに最適なデータ構造は何ですか?たとえば、行1、文字8(0から始まる、acan)の一致が必要な場合は、前述の両方の正規表現に一致します。

私はハッシュマップを作成することができます(キー:文字の場所、値:すべての一致する正規表現のセット)。これは最適ですか?何千もの正規表現を使ってテキストを解析するより良い方法がありますか?

ありがとうございます!

+0

あなたはこれのより一般的な使用についてコメントできますか?保存したいデータをどのように活用しますか? – Mikhail

+0

ユーザーは、一致する正規表現で強​​調表示された解析済みのテキストを表示します。ユーザーが文字の上を移動すると、一致する正規表現が表示されます。 – ash

答えて

1

は動作しますが、それはあなたが同時にメモリ内の試合のすべてを保存する必要がありますを意味します。データがメモリに簡単に収まるほど小さい場合は、心配しないでください。ちょうどうまくやることをやってください。

あなたはそれが本当にあなたがデータを使用しているかに依存して増加速度のメモリ使用量を削減する必要がある場合。たとえば、開始位置から終了位置までを処理する場合、re.finditerを使用してすべての正規表現を繰り返し処理し、余分なマッチを必要以上に長くメモリに保持することはできません。

1

私はあなたの正規表現が複数の文の間で交差しないと仮定しています。その場合は、

1) break your text into array of sentences 
2) for each sentence simply record which (id) regex have matched. 
3) when you would like to see the match - run the regex again. 

「店舗が少ない/もっと計算する」というソリューションが可能です。辞書に試合のすべてを保存する

+0

申し訳ありませんが、私は正規表現は文章をクロスできないと伝えました。できる。興味深い解決策。 – ash

+0

その後、IMOのハッシュマップアプローチはむしろ最適です。あなたの "値"が検索可能であることを確認してください。 "正規表現###が一致しますか?"キー(正規表現ID)、値(文字位置/文字カウント):私は同意する – Mikhail

+0

は、ハッシュは、おそらくあなたの最善の策 – ealdent