1

我想遍历文档文件列表,对其进行处理并将结果输出到单个文件中,但要指定文件 ID。处理包括:标记去除、标记化、句子分割。

输入是这样的:

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

输出将是标记,每行一个,标记包含 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元素中。总而言之,这种方法在每次迭代中删除了几个进程(两个子shell 和cut用于处理输入的相关 s,以及用于 的进程add_ids.sh)。

于 2013-02-15T20:30:31.853 回答