1

ドキュメントファイルのリストを繰り返し処理し、それらを処理して結果を1つのファイルに出力したいのですが、ファイルIDが示されています。処理には、マークアップの削除、トークン化、文の分割が含まれます。

入力は次のようになります。

/path/to/file1 docid1 
/path/to/file2 docid2

出力は、1行に1つずつ、docidと文nrを含むマークアップを含むトークンになります。

<D=docid1.1>
tok1
tok2
</D>
<D=docid1.2>
...
</D>
<D=docid2.1>
...
</D>

私が今それをしている方法は次のとおりです:

>$outfile
for filename_id in `cat $filelist`
do
 filename=`echo $path_id | cut -f1 -d' '`
 docid=`echo $path_id | cut -f2 -d' '`

 strip_markup.sh $filename \
 | tokenize.sh \
 | sentence_split.sh \
 | add_ids.sh $docid
 | >> $outfile
done

ここで問題となるのは、かなり多くの小さなファイルがあり、各ステップには起動時間(JVMの起動、モデルのロードなど)があり、かなりの時間があることです。非常に大きな(人工の)ファイルで見られるように、実際の実行時間は非常に高速です。分析の結果、このステップ(トークン化と文の分割)は私のプロジェクトで最も時間のかかるステップであることがわかりました(他の概念的に「複雑な」ものはより高速に実行されます)。

基本的に私がやりたいのは、strip_markup.shスクリプトに単一のファイル名ではなくファイルリスト全体を与えることですが、IDは後で何らかの方法で挿入する必要があります。どうしても必要でない場合は、入力と出力の形式を変更しないでください。また、多くのデータがすでにそのように処理されているため、トークン化と分割に使用するモジュールを使用したいと思います。

それについてどうやって行くのかアイデアはありますか?

4

1 に答える 1

1

add_ids.sh単純に<D=$docid>行を追加し、その入力に行を追加すると想定でき</D>ますか?おそらく、以下が機能します。whileループとコマンドを使用してread、外部プロセスを必要とせずにファイル名とdocidを抽出していることに注意してください。

< $filelist
while read filename docid; do
    echo "<D=$docid>"
    strip_markup.sh $filename |
    tokenize.sh |
    sentence_split.sh
    echo "</D>" 
done > $outfile

<Dループ本体のすべての標準出力は一度に出力ファイルにシリアル化されるため、トークン化され分割されたデータを要素にラップするために入力として受け取る別のプロセスは必要ありません。全体として、このアプローチでは、反復ごとにいくつかのプロセスが削除されます(2つのサブシェルと、cut入力を処理するための関連するs、およびのプロセスadd_ids.sh)。

于 2013-02-15T20:30:31.853 に答える