テキストデータの前処理

今回の 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 キーを押しながらクリックして、コンテクストメニューを表示させ、そこから「リンク先のファイルをダウンロード」を実行してください。

image-20240308135614680

するとダウンロード・フォルダに「 pg11.txt 」といった名前で保存されるでしょう。これを「書類」フォルダなど、あなたが課題作業をやっているフォルダ(ディレクトリ)に移動させてください。

ファイル内容の確認

ls でサイズを調べる

ls -l でファイルのバイト数を確認します。174KB ほどのようですね。

% ls -l pg11.txt 
-rw-r--r--@ 1 yasuda  staff  174385  3  8 13:57 pg11.txt
% 

このくらいなら前処理は全部エディタでやっても良いのですが、いつか巨大なログファイルを扱う時のために、今回はこれでフィルタコマンドによる作業を演習します。

less でざっと中身を確認

まず 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 コマンドには何行目から何行目までを抜き出す、という機能があります。

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   | **************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
(以下略)

棒グラフが伸びすぎて、もはやヒストグラムの用を為しません。棒グラフ部分の表示の方法は何か工夫が必要ですね。挑戦したい人は調整法を考えて実装すると良い訓練になると思います。(課題としての提出は求めません)