Google Colaboratoryでは無料GPUが使えます。(最近ではTPUも追加されました)
これを利用し、Doc2Vecのモデルを作って遊んでみたいと思います!
Doc2Vecのモデルを作成します!
今回はTPUではなく、GPUでやってみることにします。
まず、「ランタイム⇒ランタイムのタイプの変更」からGPUを選択します。
次に、必要なライブラリ(gensim)をインストール。
1 |
!pip install gensim |
そして、WikiCorpusを作成。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#ログを吐き出させるために書きました。 import logging logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO) #ダウンロードするための関数です。 import urllib.request def download(url, title): urllib.request.urlretrieve(url,"{0}".format(title)) #コーパス作ります。 import gensim from gensim.corpora.wikicorpus import WikiCorpus from gensim.models.doc2vec import Doc2Vec, Doc2VecVocab, TaggedDocument download('https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2','jawiki-latest-pages-articles.xml.bz2') wiki = WikiCorpus('jawiki-latest-pages-articles.xml.bz2') |
タグ付け。
1 2 3 4 5 6 7 8 9 |
class TaggedWikiDocument(object): def __init__(self, wiki): self.wiki = wiki self.wiki.metadata = True def __iter__(self): for content, (page_id, title) in self.wiki.get_texts(): yield TaggedDocument([c for c in content], [title]) document = TaggedWikiDocument(wiki) |
学習開始。
1 2 3 4 5 6 7 |
from gensim.models.doc2vec import Doc2Vec model = Doc2Vec(documents=document, dm=1, vector_size=100, window=8, min_count=10, epochs=5, workers=6) model.save('wiki.model') #モデルをローカルにダウンロードして保存します。せっかくなので。 from google.colab import files files.download('wiki.model') |
Google Driveに空きがあれば、ローカルに保存するより、以下のようにDriveに保存した方が手っ取り早いです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#google driveへ保存 import google.colab import googleapiclient.discovery import googleapiclient.http google.colab.auth.authenticate_user() drive_service = googleapiclient.discovery.build('drive', 'v3') saving_filename = "wikipedia.model" file_metadata = { 'name': saving_filename, 'mimeType': 'application/octet-stream' } media = googleapiclient.http.MediaFileUpload(saving_filename, mimetype='application/octet-stream', resumable=True) created = drive_service.files().create(body=file_metadata, media_body=media, fields='id').execute() |
以上でモデル作成完了です。
ColaboratoryでDoc2Vecのモデルを作る場合、 vector_sizeを大きくしすぎると割り当てられているメモリをオーバーして途中で進まなくなるので、注意が必要です。
あと、12時間制限という厄介なものがあるので、epoch数増やしすぎると12時間で完了しないかも。
モデルで遊んでみる
1 2 |
v = [model.docvecs['糖尿病'] - model.wv['高血糖'] + model.wv['肝障害']] model.docvecs.most_similar(v) |
↓
1 2 3 4 5 6 7 8 9 10 |
[('抗てんかん薬', 0.9533146023750305), ('肥満', 0.94891756772995), ('糖尿病', 0.9475265741348267), ('潰瘍性大腸炎', 0.9466210007667542), ('ラニチジン', 0.9458034038543701), ('尋常性ざ瘡', 0.944688081741333), ('オピオイド', 0.9445149302482605), ('脊髄小脳変性症', 0.9418701529502869), ('デキサメタゾン', 0.9383057355880737), ('パーキンソン症候群', 0.9366422295570374)] |
糖尿病から高血糖を除いて肝障害を加えると肥満になるそうです。ほんと?
1 |
model.most_similar(['公認会計士']) |
↓
1 2 3 4 5 6 7 8 9 10 |
[('税理士', 0.9495190382003784), ('中小企業診断士', 0.919023334980011), ('弁理士', 0.9085670709609985), ('行政書士', 0.9076312780380249), ('社会保険労務士', 0.8929017782211304), ('司法書士', 0.8825465440750122), ('士業', 0.8772679567337036), ('歯科医師', 0.8758252263069153), ('主任研究員', 0.8736863732337952), ('証券アナリスト', 0.8732196688652039)] |
公認会計士というワードに一番近いのは税理士らしい。うなずける結果です。
中小企業診断士や弁理士が上位に入っているのも中々です。
1 |
model.docvecs.most_similar(['ドナルド・トランプ']) |
↓
1 2 3 4 5 6 7 8 9 10 |
[('リチャード・ニクソン', 0.8444536924362183), ('ジョージ・W・ブッシュ', 0.8259438276290894), ('ヒラリー・クリントン', 0.7984753847122192), ('ジョン・F・ケネディ', 0.7967219352722168), ('ビル・オライリー', 0.7836146354675293), ('バーニー・サンダース', 0.7810389399528503), ('キャスリーン・セベリウス', 0.7760348320007324), ('デーヴィッド・キャメロン', 0.7731908559799194), ('アメリカ外交公電ウィキリークス流出事件', 0.770453929901123), ('バラク・オバマ', 0.7698501348495483)] |
Doc2Vecによれば、トランプ大統領の文章に一番近いのはブッシュ大統領らしい。
なかなか楽しい。
今度はジャンルに特化したモデルを作ってみたい。
Colaboratoryの12時間制限について
Colaboratoryは無料で使えるかわりに、使用に制限があります。
あるJupyterノートブックを起動して12時間経過すると、そのノートブックに関するすべてのインスタンスを強制的にリセットされます。
そのため、12時間制限にひっかかると、コードと実行結果の情報のみが残り、他は全て消えます。つまり、一旦ファイルとして保存したものも全て消え、コード実行前の状態に戻ります。
制限に引っかかるか気になる時は、残存時間を確認した方がいいです。
コメント