【发布时间】:2011-01-07 15:49:22
【问题描述】:
背景
创建了一个脚本来计算纯文本文件中单词的频率。该脚本执行以下步骤:
- 计算语料库中单词的频率。
- 保留在字典中找到的语料库中的每个单词。
- 创建一个以逗号分隔的频率文件。
脚本位于: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 参数在找到匹配时停止扫描。)
问题
您将如何优化脚本,以便字典不会从头到尾扫描每个单词?大多数单词不会出现在字典中。
谢谢!
【问题讨论】:
-
顺便说一句,如果您将重定向移动到循环的末尾,您不必
rm文件(因为您不会使用附加):foo; done > outputfile代替foo >> outputfile; done. -
@Dennis:很好的提示。谢谢!
标签: bash optimization dictionary corpus lexicon