deepblueでインターン生で統計を勉強している中山です. 今回はテイストを変えて自然言語処理をやってみることにしました.

対象の読者

  • python初学者
  • 自然言語処理初学者
  • Google Colaboratoryで実行したい方

今回はGoogle Colaboratoryを使って単語と単語の類似度の測定をしてみたいと思います.何故Colaboratoryにしたかというと,環境構築が必要なく,同じコードを打てば誰でも簡単に実行できるからです!
通常のローカルで実行するpythonだと,OSやpythonのバージョンによってエラーが出たりとみなが同じ様には実行できません.また,PCのスペックによってスピードに差が出てしまいます.
でも,Google Colaboratoryではそのようなことがないので,初学者の方にはちょうど良いと思います.
全くpythonがわからないけど,まるまるコピペして実行したい!って方でもできるようになっています.

Google Colaboratory 始め方

Google Colaboratoryの始め方ですが,まったくやったことないって方は,始め方のサイトがたくさんあるので,始め方は別のサイトをご覧ください.

利用するデータ

データは何でも良いのですが,今回は「吾輩は猫である」にしようと思います.何でも良いと書きましたが,データが小さいと学習がうまくいかないのである程度大きいものが良いと思います.正直,「吾輩は猫である」もあまり大きくないのですが,使い方の説明をするだけなのでこれにさせていただきました.

吾輩は猫であるのデータは青空文庫にあがっているのでそこからダウンロードしてください.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の実行です.

次回の記事はこちら

(著:中山 翔太)

Deepblueでは統計やAIの平和的活用を一緒に取り組んでいただける方を募集してます。詳しくはRecruitをご覧ください。

関連記事