バックグラウンド
プレーン テキスト ファイル内の単語の頻度をカウントするスクリプトを作成しました。スクリプトは次の手順を実行します。
- コーパスから単語の頻度を数えます。
- 辞書で見つかったコーパス内の各単語を保持します。
- 周波数のコンマ区切りファイルを作成します。
スクリプトは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
パラメーターは、一致が見つかったときにスキャンを停止します。)
質問
単語ごとに辞書が最初から最後までスキャンされないようにするには、スクリプトをどのように最適化しますか? ほとんどの単語は辞書に載っていません。
ありがとうございました!