かえるのプログラミングブログ

プログラミングでつまずいたところとその解決策などを書いていきます。

Google Colaboratory で fastText の pretrained model のSetup をする。

こんばんは、かえるるる(@kaeru_nantoka)です。今回は、fastText の公式ページだと説明が不親切だなーと感じたので 「pretrained の fasttext を GoogleColaboratory で利用する」というタイトルで手順を備忘録として残しておきます。

ソースは例のごとく GitHub (https://github.com/osuossu8/Utils/blob/master/fastText_pretrained_Setup.ipynb) においていますので必要に応じてご参照ください。


目次

1. 動機

2. ソースコードと説明

3. 感想


1 : 動機

公式ページ (https://fasttext.cc/docs/en/english-vectors.html)のわかりやすいところに連携されている pretrained model は .vec の形式で与えられていました。

gensim のラッパーとして提供されている FastText.load_fasttext_format や KeyedVectors.load_word2vec_format やら試したものの未知語に出会うとエラーに。。未知語でもよしなにしてくれるのが fasttextの利点じゃなかったっけ・・??

どうやら、 .bin 形式で与えられているものがいいらしいということで FastText.load_fasttext_format を試してみるもエラー。。

もう自力でビルドするしかないとソース引っ張ってきてやってみた次第です。


2 : ソースコードと説明

# Colab だと tmp ディレクトリに落としてきて、ドライブで解凍すれば容量食わないからいい感じです
!wget  https://dl.fbaipublicfiles.com/fasttext/vectors-english/wiki-news-300d-1M-subword.bin.zip

!unzip wiki-news-300d-1M-subword.bin.zip -d drive/My\ Drive

!git clone https://github.com/facebookresearch/fastText.git

!cd fastText;sudo pip install .

import fastText

# なかなか時間かかる
model = fastText.FastText.load_model('drive/My Drive/wiki-news-300d-1M-subword.bin')
print(model)

# インスタンスの説明(どんなメソッドがあるかなど)が見られます。
# とても便利
print(help(fastText.FastText._FastText))


import numpy as np
import pandas as pd

# class でラップして使っています
class fastTextVectorizer:
    def __init__(self):
        self.model = model
 
    def get(self,corpus):
        vec = []
        # 空のリストが渡ってきたときにゼロベクトルで埋めるようにしてます
        if len(corpus) != 0:
            for p in corpus:
                vec.append(model.get_word_vector(p))
        else:
            vec.append(np.zeros(300))

        return np.array(vec)

Vectorizer = fastTextVectorizer()

sentance = "Kaerururu likes kaggle very much"

corpus = sentance.split(' ')

print(corpus)
# [out]
# ['Kaerururu', 'likes', 'kaggle', 'very', 'much']

vec = Vectorizer.get(corpus)

print(vec)

"""
[out]
array([[ 0.00479189,  0.00076622, -0.00025739, ..., -0.00490327,
        -0.00920221, -0.014365  ],
       [ 0.01596881,  0.04688494,  0.00066695, ...,  0.01253003,
         0.0161329 , -0.00909959],
       [ 0.01079815,  0.0054005 , -0.01178535, ...,  0.00313774,
         0.00204078, -0.00597636],
       [ 0.00384124, -0.06426769,  0.02252812, ..., -0.00964052,
        -0.01634751, -0.00016563],
       [ 0.00118656, -0.03619536,  0.0089293 , ..., -0.01233855,
         0.02183427, -0.01065825]], dtype=float32)
"""

'kaerururu' といった単語もきちんとベクトル化してくれました。


3 : 感想

bin が 7GB くらいあるのでなかなか容量持っていかれますが、Colab だとデフォルトで 15GB 割り当てあるし、色んな単語を vector 化できて楽しいので割にはあるんじゃないかなーと思います。また BERT や ELMo が盛り上がってきて fastText 使いたいのに古い情報しかないぞ・・・!!!と困った私みたいな方に届いたら嬉しいなーと思います。

あと GitHub が充実していくのって楽しいです。

以上です、ありがとうございました。