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の実行を行います。
次回の記事はこちらです。