あまりランダムフォレストをやっていてもしょうがないので、次に進みます。 今日は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件でした。 今日から何かの公演が始まるそうですね。
{'すごい': 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,