deepblueインターンの中山です。今回は自然言語処理について簡単なご説明を致します。
対象の読者
- python初学者
- 自然言語処理初学者
- Google Colaboratoryで実行したい方
今回はGoogle Colaboratoryを使って単語と単語の類似度の測定をしてみたいと思います。Colaboratoryを選択した理由は、環境構築が必要なく、同じコードを打てば誰でも簡単に実行できるからです!
通常のローカルで実行するpythonだと、OSやpythonのバージョンによってエラーが出たりとみなが同じ様には実行できません。また、PCのスペックによってスピードに差が出てしまいます。
しかし、Google Colaboratoryではそういった課題がなく、初学者の方にはちょうど良いと思います。
「全くpythonがわからないけど、まるまるコピペして実行したい!」という方にも作業ができるようになっています。
本ブログの続きはこちら:Google Colaboratoryでword2vec②
利用するデータ
今回は「吾輩は猫である」を用いて学習します。テキストはどういった文章でも問題ありませんが、データが小さいと学習が上手くいかないです。そのため、学習に用いる文章は、ある程度サイズの大きい文章が適しています。
正直、「吾輩は猫である」もデータサイズが大きい文章ではないです。今回は、使い方の説明をすることが目的のため、このテキストを使用します。
吾輩は猫であるのデータは、青空文庫にデータがあります。そちらのHPに移動していただき、“wagahaiwa_nekodearu.txt”という名前のテキストをダウンロードしてください。
データのアップロード
今回はColaboratory上で実行するために、データをローカル環境からアップロードして実行します(ローカルを経由しなくても実行可能です)。ローカルからデータのアップロードをするには、下記のコードで実行できます。
from google.colab import files
uploaded = files.upload()
データのアップロードの成否はこのコードで確認できます。
with open('wagahaiwa_nekodearu.txt', mode='rt', encoding='cp932') as rf:
for i, line in enumerate(rf):
if i < 5: # この数字を変えることで表示する行数が変化
print(line.strip())
実行してみて、うまく表示されたでしょうか?上手くできていれば、下記のように表示されていると思います。
このテキストでは、冒頭に「吾輩は猫である」についての説明等がされており、本文にたどり着けなくなっています。実際最初の23行目まで学習には不要な文章が入っています。また、巻末にも不要な文章が挿入されていることが確認できます。そこで、冒頭と巻末の何行かを削る必要があります。今回のテキストでは下記のようにすることで。必要なテキストのみを抽出します。
with open('wagahaiwa_nekodearu.txt', mode='rt', encoding='cp932') as rf:
with open('吾輩は猫である.txt', mode='wt', encoding='cp932') as wf:
for i, line in enumerate(rf):
if i > 23 and 2358 >= i:
wf.write(line)
上記のコードを適用すると、'吾輩は猫である.txt'の中にテキストが入ります。先ほどのコードを応用して、中身を確認してみると、下記のようになります。
上記のようにして、本文がうまく表示されていると思います。しかし、テキストにルビが含まれており、学習の邪魔になることが想定されます。そのため、次はルビを削除して、学習しやすいテキストにしたいと思います。
ルビを消すためには「正規表現」という技術を活用し単語を削除する作業が必要です。正規表現についての説明は文章量が多くなってしまうため、本ブログでは割愛します。テキストを確認したところ3つほど、削除したい文字のパターンを見つけました。
- 《わがはい》 などのルビ
- [#○○] などの語句
- 一番|獰悪 などの縦線
これらをまとめて消すために正規表現が役に立ちます。正規表現を用いたコードは、下記のように記されます。
import re
pattern1 = re.compile(r'《.*?》', re.MULTILINE)
pattern2 = re.compile(r'|', re.MULTILINE)
pattern3 = re.compile(r'[#.*?]', re.MULTILINE)
with open('吾輩は猫である.txt', mode='rt', encoding='cp932') as rf:
with open('吾輩は猫である_ルビなし.txt', mode='wt', encoding='cp932') as wf:
for i, line in enumerate(rf):
line = pattern1.sub('',line)
line = pattern2.sub('',line)
line = pattern3.sub('',line)
wf.write(line)
上記のようにして、ルビや不要な文字を消したテキストが作成されます。テキストを確認すると下記のようになります。
整形済みテキストを作成できていることが確認できます。これをColaboratory上からローカルにダウンロードしてみます。ダウンロードは下記のコードで実行できます。
files.download('吾輩は猫である_ルビなし.txt')
以上のようにして、整形済みテキストを取得できます。
まとめ
中途半端で大変申し訳ないですが、記事が長くなってしまうため、今回の記事はここまでにしたいと思います。次回は、ColaboratoryでのNEologdを使った形態素解析とword2vecの実行を行います。
次回の記事はこちらです。