ディレクトリDには、.eml形式の数千通の電子メールが含まれています。一部の電子メールはプレーンテキストであり、他の電子メールはOutlookから送信され、他の電子メールにはASCIIヘッダーとHTML/MIMEコンテンツなどがあります。Dディレクトリの下のファイルで検索する興味深い単語のリスト(つまり、red \ nblue \ ngreen \ n ...)を含む辞書ファイルFが存在します。Dディレクトリには多数のサブフォルダがありますが、上記の.emlファイル以外のファイルはありません。繰り返し発生する上位の単語のリストは、次の仕様で作成する必要があります。
- 興味深い単語ごとに、それが何回発生し、どこで発生するかに関する情報を提供する必要があります。ファイル内で複数回発生する場合は、そのファイルについて複数回報告する必要があります。発生の報告とは、整数のタプル(L、P)を報告することを意味します。ここで、Lは電子メールソースの先頭からの行番号であり、Pはその行内での発生の開始位置です。
これにより、さまざまな出現箇所を参照するためのインデックスと、最も頻繁に出現する興味深い単語の要約の両方が作成されます。
上記の情報が含まれている場合、出力は単一の出力ファイルにある必要があり、形式は厳密には定義されていません。興味深い単語、各興味深い単語の出現回数、および出現場所-> file / line/start-position。
これは宿題ではありませんが、かなり大きなデータセットを作成したい実際のテキスト分析です。私が抱えている課題は、効率的にフィルタリングするための適切なツールを選択することです。反復アプローチであるwords/emails / etcのデカルト積は遅すぎるため、各ファイルの各行に複数の単語フィルタリングを組み合わせることが望ましいでしょう。
興味深い単語のリストw1|w2 | w3 | ...から代替の正規表現を作成し、それをコンパイルして各電子メールの各行で実行することを試みましたが、特に複数の単語をチェックする必要がある場合は、まだ時間がかかります。 1行以内のオカレンス。
例:
EメールEには、次のテキストを含む行があります。
^...何とか...赤いリンゴ...青いブルーベリー...赤、白、青の旗。$ \ n
正規表現はred(2)とblue(2)を正しく報告しますが、興味深い単語の実際の非常に大きな辞書を使用すると遅くなります。
私が試した別のアプローチは次のとおりです。
Sqliteデータベースを使用して、解析時にトークンをダンプします。これには、各エントリの(列、位置)情報が含まれ、最後に出力をクエリするだけです。バッチ挿入は、適切なメモリ内バッファを使用すると非常に役立ちますが、複雑さが増します。
そもそもトークン/解析が正しいことかどうかわからないため、データの並列化についてはまだ実験していません。たぶん、手紙の木がより適しているでしょうか?
優先順に、のソリューションに興味があります。
- Bash / GNU CLIツール(特に、CLIのみの実行のためにGNU'parallel'を介して並列化可能なもの)
- Python(NLP?)
- C / C ++
残念ながら、私はそれを理解していないので、Perlはありません。