今回は、自然言語処理(NLP)のためのPythonについての連載の第1回目です。
この記事では、NLPのためのPythonの基礎から始めます。
Pythonを使って、簡単なテキストファイルやPDFファイルをどのように扱うかを見ていきます。
テキストファイルの操作
テキストファイルは、おそらくあなたがNLPに取り組む中で遭遇する最も基本的なファイルの種類です。
このセクションでは、Pythonでテキストファイルから読み取る方法、テキストファイルを作成する方法、テキストファイルにデータを書き込む方法を見ていきます。
テキストファイルの読み方
次のようなテキストファイルを作成し、拡張子を”.txt “としてローカルディレクトリに保存してください。
Welcome to Natural Language Processing
It is one of the most exciting research areas as of today
We will see how Python can be used to work with text files.
私の場合、ルートの「D:」ディレクトリに「myfile.txt」という名前で保存しました。
全てのファイルの内容を読み込む
では、ファイルの全内容を読み出す方法を説明します。
まず、以下のようにファイルのパスを指定します。
myfile = open("D:myfile.txt")
ファイルを開くには、Pythonの組み込み関数である open
を使用します。
上記のコードを実行し、エラーが表示されなければ、ファイルが正常に開かれたことを意味します。
ファイルパスは、テキストファイルを保存した場所に変更してください。
それでは、変数 myfile
に何が格納されているか見てみましょう。
print(myfile)
出力はこのようになります。
<_io.TextIOWrapper name='D:myfile.txt' mode='r' encoding='cp1252'>
この出力は、変数 myfile
が myfile.txt
ファイルのラッパーであり、そのファイルを読み取り専用で開いていることを読み取っています。
もし、間違ったファイルパスを指定すると、次のようなエラーが発生する可能性があります。
myfile222 = open("D:myfile222.txt")
print(myfile222)
FileNotFoundError: [Errno 2] No such file or directory: 'D:myfile222.txt'
Errno 2が発生する場合、2つの理由が考えられます。
ファイルが存在しないか、open
関数に間違ったファイルパスを指定したかのどちらかです。
さて、ファイルの中身を読んでみましょう。
そのためには、以下のように、変数 myfile
に対して read()
関数を呼び出す必要があります。
myfile = open("D:myfile.txt")
print(myfile.read())
出力には、以下のようにファイルのテキストが表示されるはずです。
Welcome to Natural Language Processing
It is one of the most exciting research areas as of today
We will see how Python can be used to work with text files.
ここで、もう一度 read
メソッドを呼び出してみると、コンソールには何も表示されないことがわかります。
print(myfile.read())
これは、一度 read
メソッドを呼び出すと、カーソルがテキストの末尾に移動してしまうからです。
したがって、もう一度 read を呼び出すと、表示するテキストがなくなってしまうので、何も表示されません。
この問題を解決するには、read()
メソッドを呼び出した後に seek()
メソッドを呼び出し、引数として 0 を渡します。
これにより、カーソルはテキストファイルの先頭に戻ります。
次のスクリプトを見て、これがどのように機能するかを確認してください。
myfile = open("D:myfile.txt")
print(myfile.read())
myfile.seek(0)
print(myfile.read())
出力では、テキストファイルの内容が2回表示されているのがわかるでしょう。
ファイルでの作業を終えたら、他のアプリケーションがそのファイルにアクセスできるように、ファイルを閉じることが重要です。
そのためには、close()
メソッドを呼び出す必要があります。
myfile.close()
ファイルを一行ずつ読み込む ##### ファイルを一行ずつ読み込む
ファイルの内容を一度にすべて読み込むのではなく、一行ずつ読み込むこともできます。
そのためには、テキストファイルの各行をリスト項目として返す readlines()
メソッドを実行する必要があります。
myfile = open("D:myfile.txt")
print(myfile.readlines())
出力では、テキストファイルの各行がリスト項目として表示されています。
['Welcome to Natural Language Processing
', 'It is one of the most exciting research areas as of today
', 'We will see how Python can be used to work with text files.']
多くの場合、これによってテキストを扱うのが簡単になります。
例えば、各行を反復処理し、その行の最初の単語を表示することが簡単にできるようになりました。
myfile = open("D:myfile.txt")
for lines in myfile:
print(lines.split()[0])
出力はこのようになります。
Welcome
It
We
テキストファイルへの書き込み
テキストファイルに書き込むには,モードを w
または w+
に設定してファイルを 開くだけでよい.前者はファイルを書き込みモードで開き,後者は読み込みと書き込みの両モードでファイルを開きます.ファイルが存在しない場合は、ファイルが作成されます。
ただし、すでに何らかのテキストを含んでいるファイルを w
または w+
モードで開くと、以下のように既存のファイルの内容がすべて削除されます。
myfile = open("D:myfile.txt", 'w+')
print(myfile.read())
出力では、w+
モードでファイルを開いたため、スクリーンには何も表示されず、ファイルの内容がすべて削除されています。
もしこれを避けたいなら、代わりにテキストを追加する必要があります。
では、write()
メソッドを使ってファイルに内容を書き込んでみましょう。
myfile = open("D:myfile.txt", 'w+')
print(myfile.read())
myfile.write("The file has been rewritten")
myfile.seek(0)
print(myfile.read())
上のスクリプトでは、ファイルにテキストを書き込んだ後、seek()
メソッドを呼び出してカーソルを先頭に戻し、read
メソッドを呼び出してファイルの中身を読み込んでいます。
出力では、以下のように新しく追加されたコンテンツが表示されます。
The file has been rewritten
多くの場合、ファイルの既存の内容を単純に消去する必要はありません。
むしろ、ファイルの末尾に内容を追加する必要があるかもしれません。
そのためには、ファイルをa+
モード(append plus readを意味する)で開く必要があります。
もう一度,次のような内容のファイルを作成し,Dディレクトリに “myfile.txt “という名前で保存してください.
Welcome to Natural Language Processing
It is one of the most exciting research areas as of today
We will see how Python can be used to work with text files.
以下のスクリプトを実行して、ファイルをアペンドモードで開いてください。
myfile = open("D:myfile.txt", 'a+')
myfile.seek(0)
print(myfile.read())
出力には、ファイルの内容が表示されます。
次に、ファイルにテキストを追加してみましょう。
myfile.write("
This is a new line")
もう一度、ファイルの中身を読んでみましょう。
myfile.seek(0)
print(myfile.read())
出力では、次のようにテキストの最後に新しく追加された行が表示されます。
Welcome to Natural Language Processing
It is one of the most exciting research areas as of today
We will see how Python can be used to work with text files.
This is a new line
最後に、次のセクションに移る前に、コンテキストマネージャーを使用して、必要な操作を行った後に自動的にファイルを閉じる方法を見てみましょう。
with open("D:myfile.txt") as myfile:
print(myfile.read())
上記のように with
キーワードを使用すると、明示的にファイルを閉じる必要はありません。
むしろ、上記のスクリプトはファイルを開き、その内容を読み、そして自動的にファイルを閉じます。
PDF ファイルを操作する
テキストファイルに加えて、我々はしばしば、異なる自然言語処理タスクを実行するためにPDFファイルを扱う必要があります。
デフォルトでは、PythonにはPDFファイルの読み書きに使用できるビルトインライブラリが付属していません。
代わりに、PyPDF2ライブラリを使用することができます。
PyPDF2ライブラリを使用する前に、それをインストールする必要があります。
pip installerを使用している場合、以下のコマンドでPyPDF2ライブラリをインストールすることができます。
$ pip install PyPDF2
また、Anaconda環境でPythonを使用している場合は、condaのコマンドプロンプトで以下のコマンドを実行します。
$ conda install -c conda-forge pypdf2
注:ここで重要なのは、PDF文書はワープロ文書や画像など、さまざまなソースから作成できることです。
この記事では、ワープロで作成されたPDF文書のみを扱います。
画像を使って作成されたPDF文書については、別の専門的なライブラリがありますので、後日、説明します。
今回は、ワープロで作成されたPDF文書だけを扱います。
ダミー文書として、以下のリンクからPDFをダウンロードし、遊んでみてください。
http://www.bavtailor.com/wp-content/uploads/2018/10/Lorem-Ipsum.pdf
D “ドライブのルートにドキュメントをローカルにダウンロードします。
PDF文書の読み方
PDF文書を読むには、まず、普通のファイルと同じように開く必要があります。
次のスクリプトを見てください。
import PyPDF2
mypdf = open('D:Lorem-Ipsum.pdf', mode='rb')
PDFファイルを開く際には、モードをrb
に設定することが重要です。
これは、PDFファイルのほとんどがバイナリ形式であるため、”read binary “の略です。
ファイルを開いたら、以下のようにPyPDF2ライブラリのPdfFileReader()
関数を呼び出す必要があります。
pdf_document = PyPDF2.PdfFileReader(mypdf)
これで、変数 pdf_document
を使用して、さまざまな読み取り関数を実行できるようになりました。
例えば、PDF文書内の総ページ数を取得するには、 numPages
属性を使用します。
pdf_document.numPages
このPDF文書には1ページしかないので、出力には1が表示されます。
最後に、PDF文書からテキストを抽出するために、まず getPage()
関数を用いてPDF文書のページを取得する必要があります。
次に、extractText()
関数を呼び出すと、その特定のページからテキストを抽出することができます。
以下のスクリプトは、PDFの最初のページからテキストを抽出し、それをコンソールに表示します。
first_page = pdf_document.getPage(0)
print(first_page.extractText())
出力には、PDFの最初のページのテキストが表示されているはずです。
PDF文書への書き込み
フォントなどの制約により、PyPDF2ライブラリを使用してPDF文書にPythonの文字列を直接書き込むことはできません。
しかし、デモンストレーションのために、PDF文書から内容を読み取り、その内容をこれから作成する別のPDFファイルに書き込むことにします。
まず、PDFドキュメントの最初のページの内容を読んでみましょう。
import PyPDF2
mypdf = open('D:Lorem-Ipsum.pdf', mode='rb')
pdf_document = PyPDF2.PdfFileReader(mypdf)
pdf_document.numPages
page_one = pdf_document.getPage(0)
上記のスクリプトは、PDF文書の最初のページを読み取ります。
次に、次のスクリプトを使用して、最初のページの内容を新しいPDF文書に書き込むことができます。
pdf_document_writer = PyPDF2.PdfFileWriter()
上記のスクリプトは、PDF ファイルに内容を書き込むために使用できるオブジェクトを作成します。
まず、このオブジェクトにページを追加し、もう一方のPDFから取得したページを渡します。
pdf_document_writer.addPage(page_one)
次に、wb
(書き込みバイナリ) パーミッションで新しいファイルを開く必要があります。
このようなパーミッションでファイルを開くと、ファイルが存在しない場合は新しいファイルが作成されます。
pdf_output_file = open('new_pdf_file.pdf', 'wb')
最後に、PDFライターオブジェクトの write()
メソッドを呼び出し、新しく作成されたファイルを渡す必要があります。
pdf_document_writer.write(pdf_output_file)
mypdfと
pdf_output_fileの両方のファイルを閉じて、プログラムの作業ディレクトリに移動してください。
すると、エディタに新しいファイルnew_pdf_file.pdf` が表示されるはずです。
このファイルを開くと、元のPDFの1ページ目の内容が含まれていることがわかります。
それでは、新しく作成されたPDFの内容を読んでみましょう。
import PyPDF2
mypdf = open(r'C:UsersAdmin
ew_pdf_file.pdf', mode='rb')
pdf_document = PyPDF2.PdfFileReader(mypdf)
pdf_document.numPages
page_one = pdf_document.getPage(0)
print(page_one.extractText())
それでは、もっと大きなPDFファイルを使ってみましょう。
次のリンクからPDFファイルをダウンロードしてください。
http://ctan.math.utah.edu/ctan/tex-archive/macros/latex/contrib/lipsum/lipsum.pdf
それをあなたのローカルディレクトリに保存してください。
ダウンロードしたファイルの名前は、「lipsum.pdf」とします。
以下のスクリプトを実行すると、ファイルのページ数が表示されます。
import PyPDF2
mypdf = open(r'D:lipsum.pdf', mode='rb')
pdf_document = PyPDF2.PdfFileReader(mypdf)
pdf_document.numPages
出力では、PDFのページ数が87ページなので、87がプリントアウトされていることがわかります。
コンソールに文書内の全ページを表示してみましょう。
import PyPDF2
mypdf = open(r'D:lipsum.pdf', mode='rb')
pdf_document = PyPDF2.PdfFileReader(mypdf)
for i in range(pdf_document.numPages):
page_to_print = pdf_document.getPage(i)
print(page_to_print.extractText())
出力では、PDF ドキュメントのすべてのページが画面に印刷されます。
結論
自然言語処理アプリケーションを開発する上で、テキスト文書の読み書きは基本中の基本です。
今回は、Pythonを使ってテキストファイルとPDFファイルを扱う方法を説明しました。
テキストファイルとPDFファイルの読み書きの方法について説明しました。
次回は、spaCyライブラリを使ったステミング、レンマタイゼーション、トークン化など、他の自然言語処理タスクについて説明します。