課題103についてのmemo
情報科学基礎実験課題103の面倒臭さは2点から構成されている。 一つは入力の不在、そしてもう一つはそれ以外だ。
本稿では私の採った前者の解決方法を述べる事にする。
カンニング?
本ページは課題を解く上で助けとなる情報が含まれている可能性があります。
見るかどうか、使用するかどうか、カンニングに当たるかどうか、そういった判断はあなた(あるいは教官)に任せます。
入手
さて、先の課題101や102の入力の通り、必要なのは改行区切りでまとまった量の99文字以内の英字の集まりです。
幸いな事に英字の集まりならばインターネット上にいくらでも流れています。特にProject Gutenberg http://www.gutenberg.org/wiki/Main_Page ならば著作権等のわずらわしい問題も無く使える上にtxt形式も準備されています。他にもCanterbury Corpushttp://corpus.canterbury.ac.nz/なんてコーパスを使った人もいるそうです。
加工
さて、上で得た英文を改行区切りの英字の集まりに加工しなければなりません。
これにはsedというプログラムが便利です。
=== sedとは === Stream EDitorの略で、文字通り入力ストリームを編集するプログラム。パイプとの相性の良さがいかにもunixらしい。 (コマンド一文字/対象文字列/結果文字列/サブコマンド)という形式の命令を用いて各行を順に加工し、出力する。
sedの解説だけで一冊の本が書けるほど奥深いのですがここでは説明略。以下のような内容のsedスクリプトmakedata.sedをネットで入手した文章alice.txtに使います。
# とりあえず小文字化 y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ # 非アルファベットを改行に変換 (本当に英単語が欲しいなら'とか-とかも適当に処理しないと駄目かも) s/[^a-z][^a-z]*/\ /g # 要らない改行を除去 s/\n$// s/^\n// # 空行を除去 /^$/d
un001 $ sed -f makedata.sed alice.txt
なかなか良さそうです。これを適当なファイルにリダイレクトして完成です。
un002 $ sed -f makedata.sed alice.txt > alicedata.txt
性能比較のためにソート済みなものとか
un003 $ sed -f makedata.sed alice.txt | sort
逆順とか
un003 $ sed -f makedata.sed alice.txt | sort -r
元の文章よりきちんとランダムなものが欲しければ
un001 $ sed -f makedata.sed alice.txt | sort -R
も良さそうですし、レポート作成に飽きたら
un002 $ sed -f makedata.sed alice.txt | sort | uniq | wc -l
で単語種類数を数えてみたり
un003 $ sed -f makedata.sed alice.txt | sort | uniq -c | sort
で頻出単語を見てみたりいろいろと遊べます。ね、簡単でしょう?
おっとっと、99文字以内って事を忘れていた。普通の英文から生成したら大丈夫だろうけど、一応最長文字列長もチェックしなきゃ。
un001 $ sed -f makedata.sed alice29.txt | wc -L
supercalifragilisticexpialidociousでもたったの34字だし、まずもって問題無いだろうけどね。