今回の Alice.txt ファイルは、権利的にパブリック・ドメインの文書データを集積している Project Gutenberg から取得したものです。他にも適当にそうしたワードで検索すると、Open Resources: How to find a public domain text (University of Washington) などのサイトにまとめらているのを見つけられます。
一般に提供されているデータや、実験装置が吐き出すデータには、以下に取り上げる例のように、目的の処理では使わないライセンス情報や補助情報が含まれていることが良くあります。今回作ったプログラムを、Alice’s Adventures in Wonderland の全文で試す事を目標に、全文データの作成を試みます。
「書かれたとおりに操作して動作した」事を確認しない |
---|
ここでは パイプ・リダイレクション で試したリダイレクションなどの機能を使っています。書かれたとおりに操作したら動作するのは当たり前ですから、その通りに動作して安心しないように。それではあなたの理解は一歩も進みません。内容をはっきり意識して操作していることが重要で、そこがクリアに把握出来ない場合は必ず復習しながら進めるように。 |
Project Gutenberg の Alice’s Adventures in Wonderland by Lewis Carroll のページを見ると、さまざまなフォーマットでデータが提供されていることが分かります。そのなかの Plain Text UTF-8 を選び、ダウンロードしましょう。今回は下図のように Control キーを押しながらクリックして、コンテクストメニューを表示させ、そこから「リンク先のファイルをダウンロード」を実行してください。
するとダウンロード・フォルダに「 pg11.txt 」といった名前で保存されるでしょう。これを「書類」フォルダなど、あなたが課題作業をやっているフォルダ(ディレクトリ)に移動させてください。
ls -l でファイルのバイト数を確認します。174KB ほどのようですね。
% ls -l pg11.txt
-rw-r--r--@ 1 yasuda staff 174385 3 8 13:57 pg11.txt
%
このくらいなら前処理は全部エディタでやっても良いのですが、いつか巨大なログファイルを扱う時のために、今回はこれでフィルタコマンドによる作業を演習します。
まず less コマンドを使ってファイルの中身をざっと眺めます。-N オプションを指定して行番号を付けて表示させています。
% less -N pg11.txt
1 The Project Gutenberg eBook of Alice's Adventures in Wonderland
2
3 This ebook is for the use of anyone anywhere in the United States and
4 most other parts of the world at no cost and with almost no restrictions
5 whatsoever. You may copy it, give it away or re-use it under the terms
6 of the Project Gutenberg License included with this ebook or online
7 at www.gutenberg.org. If you are not located in the United States,
8 you will have to check the laws of the country where you are located
9 before using this eBook.
10
11 Title: Alice's Adventures in Wonderland
12
13
14 Author: Lewis Carroll
(つづく)
どうやら本文ではないProject Gutenberg の前書きやメタデータ(書誌情報)が付いているようです。Spaceキーで少し下まで進めると目次があり、そのあとようやく本文が始まります。
49 CHAPTER XII. Alice’s Evidence
50
51
52
53
54 CHAPTER I.
55 Down the Rabbit-Hole
56
57
58 Alice was beginning to get very tired of sitting by her sister on the
この行位置「54」を覚えておきましょう。(less は コマンド詳細 の man コマンドのところで紹介した Pager の一つです。キー操作についてはそこで確認すると良いです。)
Space キーでどんどん進んで、おかしなものが入っていないことを確認しておきます。しかし本文末尾では明らかに小説本文の一部とは異なる性質の文章がある事が分かります。そこから b キーなどでさかのぼると、本文最後の「THE END」より後に、やはりProject Gutenberg の利用条件などが書かれている事が分かります。これも取り除くことになりますね。
3403
3404 THE END
3405
3406
3407 *** END OF THE PROJECT GUTENBERG EBOOK ALICE'S ADVENTURES IN WONDERLAND ***
3408
3409
THE END が「3404」行め、つまり本文は 54 行目から 3404 行目まで、ということになります。
sed コマンドには何行目から何行目までを抜き出す、という機能があります。
「 sed -n 7,11p 」とすると、7行目から11行目までの行を抜き出して出力します。( -n オプションで全体の出力を抑制し、7,11p で 7〜11行目を出力(print)する、という意味です。-n で出力をしない(no?)という設定はありがちですが、分かりにくいですね。)
つまり「 sed -n 54,3404p pg11.txt 」とすると良いように思われます。実際にうまくできているかどうか、head, tail コマンドを使って確認します。以下、sed コマンドの出力をパイプ「 | 」を使って head, tail コマンドに渡し、先頭と末尾の何行かを出して意図通りになっていることを見ています。
% sed -n 54,3404p pg11.txt | head -3 << 切り出した結果の先頭 3 行だけを出力する
CHAPTER I. << 確かにこれが先頭行だ(それ以前はカットされた)
Down the Rabbit-Hole
% sed -n 54,3404p pg11.txt | tail -3 << 切り出した結果の末尾 3 行だけを出力する
days.
THE END << 確かにこれが末尾行だ(それ以後はカットされた)
%
確かに正しい範囲を切り出せていることが確認できました。ではこの結果をリダイレクション「 > 」を使って、ファイルに書き出して残しましょう。
% sed -n 54,3404p pg11.txt > Alice_full.txt
%
作成した Alice_full.txt を先ほど作成したプログラムで処理してみましょう。
% echo Alice_full.txt | python3 wordcount.py
len count |
1 925 | *************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
2 3720 | **************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
(以下略)
棒グラフが伸びすぎて、もはやヒストグラムの用を為しません。棒グラフ部分の表示の方法は何か工夫が必要ですね。挑戦したい人は調整法を考えて実装すると良い訓練になると思います。(課題としての提出は求めません)