ナード戦隊データマン

データサイエンスを用いて悪と戦うぞ

絵文字を使ってword2vecする

ツイートからword2vecを学習させると、絵文字のベクトル表現も獲得できるので、ここでは絵文字ベクトルのいくつかの演算を試します。

事前準備

# apt install p7zip-full
# wget https://github.com/sugiyamath/word2vec_japanese_twitter/blob/master/model.7z?raw=true
# 7z x model.7z*

絵文字の感情の組み合わせ

まず、感情の組み合わせを試します。

from gensim.models import Word2Vec
model = Word2Vec.load("model/w2v_gensim/word2vec_tweet.model")
emos = ["😄","😢", "🤮", "😠", "😮","😨"] #注意: 絵文字が見れないブラウザは見れません。
import itertools as it

for i in range(2,len(emos)+1):
    for x in it.combinations(emos, i):
        print("sum(",list(x),")=",model.wv.most_similar(list(x))[0])

出力

キャプチャ.GIF キャプチャ2.GIF

このように、感情と感情が演算できています。

感情と語の組み合わせ

次に、感情と語を組み合わせてみます。

emo_word.GIF

概ね、感情と語の演算は納得がいくものではないでしょうか。

ちなみに: sentencepieceに対する誤解

このword2vecのモデルは以前sentencepieceを用いて作成しましたが、MeCabのような単語によるトークナイズはsentencepieceの本来の使い方ではありません

sentencepieceの主な使い方は、例えば語彙数に依存したディープラーニングのモデルを訓練させる際に、語彙数を圧縮することによって現実的なネットワークサイズの範囲で訓練したりすることを目的で使われます。語彙を頻度で切り捨てるともったいないので、サブワード分割によってコーパス内のすべての表現を少数のボキャブラリーで表すことができます。

この点を以前は誤解してしまっていたので、注意したいです。

ちなみに、word2vecを少数のボキャブラリーとして表すことによって、このモデルをKerasのEmbedding層に凍結するのであれば、正しい使い方だと思います。