毎日テキストマイニング

180日間、毎日テキストマイニングをするブログです

2018/8/15【53日目】AKBの呟きをword2vecで学習させてみた

あまりランダムフォレストをやっていてもしょうがないので、次に進みます。 今日はAKBの呟きをword2vecで学習させたいと思います。

import pandas as pd
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt

train = pd.read_csv('all_20180812.csv',
                    header = 0,
                    delimiter = ",")
train["name"].loc[train["name"] != "seina_fuku48"] = int(0)
train["name"].loc[train["name"] == "seina_fuku48"] = int(1)
train['name_int'] = train['name'].astype(np.int64)
import MeCab
import re
from bs4 import BeautifulSoup

tagger = MeCab.Tagger ("-Owakati")

def tweet_to_words(raw_tweet):
    letters_only = re.sub("(https?)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)", " ", raw_tweet) 
    tweet_text = BeautifulSoup(letters_only, "lxml").get_text() 
    mecab = tagger.parse(tweet_text)
    words = mecab.lower().split()
    return(words)

num_tweets = train["tweet"].size
clean_train_tweets = []

for i in range(0, num_tweets):
    clean_train_tweets.append(tweet_to_words(train["tweet"][i]))

この辺り処理は今までと同じです。def tweet_to_words(raw_tweet)のところに文章をさらに単語に分割する必要がありますので、words = mecab.lower().split()を加えています。

次からがword2vecの処置です。

from gensim.models import word2vec
from sklearn.feature_extraction.text import CountVectorizer

def tweet_to_sentences( tweet ):
    raw_sentences = tokenizer.tokenize(tweet.strip())
    sentences = []
    for raw_sentence in raw_sentences:
        if len(raw_sentence) > 0:
            sentences.append( tweet_to_words( raw_sentence))

    return sentences

sentences = [] 

for tweet in train["tweet"]:
    sentences += tweet_to_sentences(tweet)

for tweet in train["tweet"]:
    sentences += tweet_to_sentences(tweet)

これを実行すると、こんな感じのリストができあがります。

sentences
[['#',
  'アイドル修業中',
  '♡',
  '公演',
  '来',
  'て',
  'くれ',
  'て',
  '、',
  '見',
  'て',
  'くれ',
  'て',
(以下、省略)

それで、この配列を学習させればモデルが完成です。

num_features = 300    # ワードベクトルの次元数                      
min_word_count = 10   # 単語の数                        
num_workers = 4       # 並列処置の数
context = 10          # 文脈の数(?)                                                                                    
downsampling = 0.01   # 頻出語のダウンサンプリング。0.001を設定。

model = word2vec.Word2Vec(sentences, workers=num_workers,  \
              size=num_features, min_count = min_word_count, \
              window = context, sample = downsampling)

model.init_sims(replace=True)
model_name = "AKBモデル"
model.save(model_name)

試しに、握手の類義語を見てみます。

model.most_similar("握手")
[('大阪', 0.9269459247589111),
 ('ドーム', 0.9234610199928284),
 ('メ', 0.9233565330505371),
 ('京セラ', 0.9218961000442505),
 ('日間', 0.9211033582687378),
 ('会', 0.9101666212081909),
 ('テックス', 0.9035392999649048),
 ('展示', 0.8908924460411072),
 ('握手会', 0.8876304626464844),
 ('個別', 0.8820723295211792)]

おぉ、ほぼ合っていますね。

続いて、AKBと入力したらAKBという単語を学習していません、と返ってきました。おかしいな、と思ってよくよくコードを見直してみましたら、英字はすべて小文字にしていたんですね。akbと入力したら返ってきました。

model.most_similar("akb")
[('燈', 0.9318694472312927),
 ('約束', 0.926926851272583),
 ('express', 0.904812216758728),
 ('犬', 0.9046683311462402),
 ('について', 0.9031918048858643),
 ('夢', 0.9005000591278076),
 ('ずん', 0.8986366987228394),
 ('新曲', 0.8850587606430054),
 ('bnk', 0.8795950412750244),
 ('アメブロ', 0.8739258646965027)]

こっちは微妙ですね。やはりまだ学習している単語が少ないということですね。

今日の結果

今日のAKBメンバーによる呟きは68件でした。 今日から何かの公演が始まるそうですね。 f:id:rimt:20180816023836p:plain

{'すごい': 13, '嬉しい': 13, '楽しい': 8, '面白い': 2, 'ない': 2, 'かわいい': 2, '頼もしい': 2, '凄い': 1, '長い': 1, 'いい': 1, '暑い': 1, 'おかしい': 1, '可愛い': 1, 'すっごい': 1, '悪い': 1, '良い': 1, 'うれしい': 1, '愛らしい': 1, 'ほしい': 1, '新しい': 1, '熱い': 1, 'かっこよい': 1, 'くさい': 1, 'よい': 1, '多い': 1, 'おしい': 1})
'公演': 31, 'すごい': 13, '嬉しい': 13, '今日': 13, '方': 13, '回': 11, 'ちゃん': 9, '楽しい': 8, 'さん': 8, 'お願い': 7, '出演': 7, 'チームエー': 7, '皆さん': 7, 'タヌキ': 7, 'キツネ': 7, 'ん': 6, '最後': 6, '是非': 6, '学園': 6,
'する': 35, '公演': 31, 'くださる': 15, 'すごい': 13, '嬉しい': 13, '今日': 13, '方': 13, '回': 11, '見る': 10, 'ちゃん': 9, '楽しい': 8, 'さん': 8, 'なる': 8, 'お願い': 7, '出演': 7, 'チームエー': 7, '皆さん': 7, 'タヌキ': 7, 'キツネ': 7, 'ゆう': 7,