2013-02-15 3 views
1

Я хочу перебирать список файлов документов, обрабатывать их и выводить результат в одном файле, но с указанными идентификаторами файлов. Обработка включает в себя: удаление разметки, токенизацию, разделение предложения.add intermitting ids in output output

вход что-то вроде этого:

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

Выходной сигнал будет лексемы, по одному в строке, с разметкой, содержащей DocId и приговор факса:

<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 весь список файлов вместо одиночных имен файлов, но идентификаторы необходимо каким-то образом вставить. Формат ввода и вывода не должен изменяться, если это не совсем необходимо. Также мы хотели бы использовать модули, которые мы имеем для токенизации и разделения, потому что много данных уже обработано таким образом.

Любые идеи, как это сделать?

ответ

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 элементе , В целом, это относится к удалению нескольких процессов на итерацию (две подоболочки и связанные с ними cut с для обработки ввода, а также процесс для add_ids.sh).

+0

Add_ids.sh также печатает номер предложения. В любом случае, по-моему, принципиальная проблема по-прежнему существует с вашим решением. – benroth

+0

В этом случае, как 'add_ids.sh' получает номер предложения из' sentence_split.sh'? Кажется, что глобальное состояние разделяется между вашими сценариями, которые не отображаются в коде, который вы опубликовали. Я бы предложил опубликовать содержимое всех ваших скриптов, но я думаю, что этот вопрос выходит за рамки stackoverflow и, возможно, должен быть перемещен на codereview.stackexchange.com. – chepner