Фон
Создан скрипт для подсчета частоты слов в текстовом файле.Сценарий выполняет следующие шаги:
- Подсчет частоты слов из корпуса.
- Сохранение каждого слова в корпусе, найденного в словаре.
- СозданиеРазделенный запятыми файл частот.
Сценарий: http://pastebin.com/VAZdeKXs
#!/bin/bash
# Create a tally of all the words in the corpus.
#
echo Creating tally of word frequencies...
sed -e 's/ /\n/g' -e 's/[^a-zA-Z\n]//g' corpus.txt | \
tr [:upper:] [:lower:] | \
sort | \
uniq -c | \
sort -rn > frequency.txt
echo Creating corpus lexicon...
rm -f corpus-lexicon.txt
for i in $(awk '{if( $2 ) print $2}' frequency.txt); do
grep -m 1 ^$i\$ dictionary.txt >> corpus-lexicon.txt;
done
echo Creating lexicon...
rm -f lexicon.txt
for i in $(cat corpus-lexicon.txt); do
egrep -m 1 "^[0-9 ]* $i\$" frequency.txt | \
awk '{print $2, $1}' | \
tr ' ' ',' >> lexicon.txt;
done
Задача
Следующие строки непрерывно циклически перебираются в словареслова соответствия:
for i in $(awk '{if( $2 ) print $2}' frequency.txt); do
grep -m 1 ^$i\$ dictionary.txt >> corpus-lexicon.txt;
done
Работает, но медленно, потому что сканирует найденные слова, чтобы удалить слова, отсутствующие в словаре.Код выполняет эту задачу путем сканирования словаря для каждого слова.(Параметр -m 1
останавливает сканирование при обнаружении совпадения.)
Вопрос
Как бы вы оптимизировали скрипт, чтобы словарь не сканировался от начала до конца для каждого отдельного слова?Большинство слов не будет в словаре.
Спасибо!