はじめに
『「近いマンガ」がわかるマンガ新検索』がバズっていました。
https://alu.jp/MangaNearestMap/
「行列分解などの機械学習」が使われているということですが、私はword2vec(スキップグラム)で実装してみます。いわゆるitem2vecとかprod2vecですね。
とりあえず速報です。もしかしたら大幅に改稿するかもしれません。
また、問題があれば公開を停止します。
実装
#私を構成する5つのマンガ
のツイートを数十万件取得してcsvに保存しておきます。詳細は省略します。
実装はjupyter notebookを使って行いました。
qiitaに貼り付けるためpythonとして出力しているので実装は一部正確でないかもしれません。また、word2vecのパラメータは適当です。
import pandas as pd
from gensim.models.word2vec import Word2Vec
df = pd.read_csv("tweets.csv")
manga = pd.DataFrame(df["tweet"].apply(lambda x: x.split("\n")[1:6]).to_list(), columns=["book1", "book2", "book3", "book4", "book5"])
docs = manga[['book1', 'book2', 'book3', 'book4', 'book5']].dropna().values.tolist()
model = Word2Vec(docs,
size=64,
window=5,
min_count=10,
sg=1,
hs=0,
negative=20,
ns_exponent=-0.75,
alpha=0.01,
min_alpha=0.0001,
seed=999,
max_vocab_size=None,
max_final_vocab=None,
sample=0.0001,
iter=50,
trim_rule=None,
sorted_vocab=1,
batch_words=10000,
workers=4)
target = next(iter(model.wv.vocab))
print(target)
vector = model.wv[target]
print(vector)
def search(target, topn=30):
print(target)
for res in model.wv.most_similar_cosmul(target, topn= topn):
print(res[0], res[1])
search(target)
前処理後、約244000件のツイートを対象にでき、ベクトル構築対象となった本は5500件くらいになりました。
近傍検索の結果
鋼の錬金術師
鋼の錬金術師
NARUTO-ナルト- 0.9372220635414124
バッカーノ! 0.9294713139533997
ONE PIECE 0.9285544753074646
BLEACH 0.9271026849746704
SHAMAN KING ~シャーマンキング~ 0.9249312877655029
銀魂 0.9245919585227966
精霊の守り人 0.9226152896881104
ツバサ 0.9216974377632141
犬夜叉 0.9214634299278259
結界師 0.9198842644691467
カードキャプターさくら
カードキャプターさくら
神風怪盗ジャンヌ 0.9418006539344788
かんしゃく玉のゆううつ 0.9364524483680725
魔法騎士レイアース 0.9364469647407532
フルーツバスケット 0.9352824687957764
すき。だからすき 0.9325258135795593
美少女戦士セーラームーン 0.9321167469024658
ツバサ -WoRLD CHRoNiCLE- ニライカナイ編 0.9308517575263977
ルナ・ルナティック 0.9290527701377869
満月をさがして 0.9282151460647583
新白雪姫伝説プリーティア 0.9280235767364502
名探偵コナン
名探偵コナン
金田一少年の事件簿 短編集 0.9112197160720825
犬夜叉 0.910838782787323
金田一少年の事件簿File 0.9089392423629761
黒子のバスケ 0.9080468416213989
金田一少年の事件簿 0.9049121737480164
金田一少年の事件簿 File 0.903840959072113
金田一少年の事件簿 20周年記念シリーズ 0.9032795429229736
光とともに... 0.9022457003593445
放課後の王子様 0.901003897190094
探偵学園Q 0.8998096585273743
らんま1/2
らんま1/2
GS美神 極楽大作戦!! 0.91542649269104
ナースエンジェルりりかSOS 0.9054598808288574
カンナさん大成功です! 0.9018240571022034
ガウガウわー太 0.897535502910614
魔女娘ViVian 0.8969653248786926
魔法の天使クリィミーマミ 不機嫌なお姫様 0.8968551158905029
るろうに剣心-明治剣客浪漫譚- 0.8968304395675659
幽遊白書 0.8964610695838928
赤ちゃんと僕 0.8963634967803955
スレイヤーズすぺしゃる 0.8961302042007446
最後に
若干外してますね。
前処理とパラメータチューニングをもっと行うべきですが、スキップグラムではなく行列分解で行うべきかもしれません。