search
LoginSignup
6

posted at

updated at

デュエル・マスターズのカードをdoc2vecでベクトル化して類似カードを探してみた

背景

春休みに途中まで書いて放置してた記事があったので書ききって公開。使用しているデータは少し古いです。

デュエル・マスターズは、タカラトミーが提供するトレーディングカード(TCG)の一種で、去年20周年を迎えました。

まぁそんな続いていると、カードの種類も膨大になり、似たような効果を持つカードが出てきます。

また、機械的にそんなカードを見つけることができるのか気になって調べてみると、doc2vecという技術があることがわかり、ハーフストーン(デジタルTCG)や遊戯王などのTCGでやっている例(1,2)が見つかりました。
(デュエル・マスターズもやっている人がいた気がするが、探しても見つからなかった  
ありました。(http://ruinsforgotten.gger.jp/archives/4721896.html))

doc2vecについて詳しい解説は他の方の方がわかりやすいので、そちらを参照してください。
簡単に説明しとくと、語順もきちんと理解できるアルゴリズムを持ってるすごいやつ。
ただし、bertみたいにAttentionはないので、どの単語がどの単語を指してるかみたいなのは理解できてないと思う。

今回、自分もdoc2vecを趣味でやってるデュエル・マスターズでやってみた。

目的の設定

何事にも目的は大事なので、今回この記事では以下のものを確認する。
1.似た効果のカードを見つけることができるか。
2.Doc2Vecの醍醐味である、足し算や引き算でそれっぽいものが出現するか。
例えば、「"ブラッディ・ツヴァイクロス"」-「"ボーンおどり・チャージャー"」+「"ガード・グリップ"」は3ドローできるカードになるのか(例)"王立アカデミー・ホウエイル")となるのか
(つまり、3枚という要素のベクトルのみを抜き出して、そこにカードを引くというベクトルをいれることで、カードを3枚引くというカードが導けるか)

ブラッディ・ツヴァイクロス:
G・ストライク(このクリーチャーを自分のシールドゾーンから手札に加える時、相手に見せ、相手のクリーチャーを1体選んでもよい。このターン、そのクリーチャーは攻撃できない)
自分の山札の上から3枚を墓地に置く。

ボーンおどり・チャージャー:
自分の山札の上から2枚を墓地に置く。
チャージャー

ガード・グリップ:
カードを1枚引く

王立アカデミー・ホウエイル
カードを3枚引く

#使用ライブラリ

import pandas as pd
from gensim.models.doc2vec import Doc2Vec, TaggedDocument
import MeCab
import re

データ収集

・公式HPのカード検索をスクレイピングして集めました。
(通常もアクセスできるデータはスクレイピングで入手したデータは情報分析を目的にした場合のみ使用可能です。相手に迷惑をかけないよう、法律遵守で行いましょう。)<\b>


追記

ちなみにタカラトミーのサイトポリシー的には非営利or個人で楽しむためならOKっぽい。確認大事(載っけるのを忘れてた)。この記事は非営利なので大丈夫(多分)

著作権について
当社ウェブサイトにある文章・画像・動画・ゲーム・商標・肖像等、(以下、「ウェブデータ」)に関する著作権とその他の権利は、当社または原著作者、その他の権利者のものです。企業等が非営利目的で使用する場合、個人的な使用を目的とする場合、その他著作権法により認められている場合を除き、ウェブデータは当社、原著作者、その他の権利者の許諾なく使用することは出来ません。

なお余談だが、ポケカはアウト(ポケカHPのサイトのご利用 )
リンクはテキストリンクのみとか徹底しとるね。
タカラトミーの懐の深さがよくわかるね(多分違う)


この時、使用した主なライブラリはseleniumとbs4です。

seleniumはいわゆるwebサイトをテストするためのライブラリですが、今回のスクレイピング対象のような動的なwebサイトの場合に有効です。

bs4(BeautifulSoup4)はHTMLのツリー構造を解析して、HTMLの要素などを指定して取得することのできるライブラリです。

どのくらいの頻度というのは相手のサーバーの負荷を考えなくてはいけないですが、おおよそ1秒間隔に1ページくらいであれば...というのが意見としてあると思います(なお相手が個人であればペースはもっと遅くするなど、より配慮は必要だと思います)

以下の意見交換などで言われていることくらいは確かに守った方が良いと思います。
https://qiita.com/Shinnme0528/questions/db5cb393f695153542f2

こんな感じで自分は14250枚のカード情報について取得しました。
(ちなみに自分はツインパクトカードの呪文面などは取得できませんでしたが概ね取得できたのでもうこのまま押し進みます)

今回の取得データ形式とサンプル

先ほどスクレイピングしたデータはPandasのデータフレームに全て入れてデータ整形等していきます。

df#データ収集でスクレイピングしたカード情報を全て持つPandasデータフレーム
index name card_kinds_of colors rarelity power cost mana race ability flavor imgurl
0 Black Lotus(DMEX18 S1/S15) Mono Artifact ゼロ SR nan 0 1 nan このArtifactが出た時、封印を3つ付ける。... nan /wp-content/card/cardimage/dmex18-s01.jpg
1 引き裂かれし永劫、エムラクール(DMEX18 S2/S15) クリーチャー ゼロ SR 15000 15 1 エルドラージ/ゼニス 飛行(このクリーチャーは、「... nan /wp-content/card/cardimage/dmex18-s02.jpg
... ... ... ... ... ... ... ... ... ... ... ...
カラム説明 カード名と収録情報 種類 文明 レア度 パワー コスト 発生コスト 種族 能力 フレーバー イメージURL

カード名はMTGで有名なカードなので知っている人もいるかもしれませんが、ちょうどカード検索のトップ2枚なので、このまま採用します。

データの前処理

データを扱う時、前処理というのは最重要項目です。
今回も試行錯誤しました。

まず初めにカード名と収録情報が混ざっていると再録などで複数の同じデータを持ってしまうため、そうならないようにカード名のみのカラムlabelを作成します。

df["label"]=df["name"].apply(lambda x:x[:x.rfind("(")])

次に、今作ったlabelを用いて、最新のカード情報のみを抜き出しつつ、無能力のカードを削除(多色のマナタップインのみも削除)し、()の説明書きを削除します。
最新のカード情報のみを抜き出すことで、再録により修正されたカードの効果のみを対象にする狙いがあります。
また、()の説明書きを削除することで、Doc2Vecで余計な学習をすることを避ける狙いがあります。
また、能力の大幅な改変や書き方の変更など考慮するためにいろいろ処理していきます。

df=df[~df.duplicated(subset="label")].reset_index(drop=True)
df=df.dropna(subset=['ability']).reset_index(drop=True)
df["ability"]=df['ability'].apply(lambda x:x.replace("マナゾーンに置く時、このカードはタップして置く。\n",""))
df["ability"]=df['ability'].apply(lambda x:x.replace("\n"," "))
df=df.dropna(subset=['ability']).reset_index(drop=True)
df['ability']=df['ability'].apply(lambda x:re.sub(r'(.*?)',' ',x,2) if type(x)==str else "")

これで8728枚まで削れました。

分かち書き

Doc2Vecを行うためにまずは能力をわかち書きといって、区別したい単語ごとに分類する必要がある。
今回は主にMeCab+NEologdを使用した。

MeCabはいわゆる形態素解析のライブラリで、分かち書きを行うことができる。
NEologdはMeCabの辞書のようなもので、ツイッターなどの分析に向いている。

それぞれのインストール等は別の方が詳しく解説しているので、そちらを参照してください。

tokenizer = MeCab.Tagger("-Owakati")
df["wakati_abi"]=df["ability"].apply(lambda x:tokenizer.parse(x))

Doc2Vec

https://qiita.com/g-k/items/5ea94c13281f675302ca

https://qiita.com/Morinikiz/items/66941b9e3e57b9224fd7
を参考に作成しました。

sentences = []
labels=[]
for text,label in zip(df["wakati_abi"],df["label"]):
    text_list = text.replace("、"," ").replace("。"," ").replace("▁","").split(' ')[:-1]#[:-1]は\nを消すため
    text_list=[s for s in text_list if s!=""]
    sentences.append(text_list)
    labels.append(label)
from gensim.models.doc2vec import Doc2Vec, TaggedDocument
documents = [TaggedDocument(p[1], [p[0]]) for i, p in enumerate(zip(labels,sentences))]
#model = Doc2Vec(documents, vector_size=800, window=2, min_count=1,workers=4, epochs=100, dbow_words=1, negative=5)
model = Doc2Vec(documents, vector_size=800, window=2, min_count=1,workers=4, epochs=100, dm=1, negative=5)

Doc2Vecのパラメーターは適当です。
epochsはここを参考に100にしてます。(なるべく同じ文章について高いスコアにしたいため。)

結果

定性的に評価していきます。

1.似た効果のカードを見つけることができるか。

model.docvecs.most_similar(positive=[{label}])

の結果をいくつかのlabelについて確認する

凶戦士ブレイズ・クロー

----このカードに似たカードを探す-----
name: 凶戦士ブレイズ・クロー
ability: このクリーチャーは、可能なら毎ターン攻撃する。
abi_wakati: ['この', 'クリーチャー', 'は', '可能', 'なら', '毎', 'ターン', '攻撃', 'する']


ハイスコアで似ている効果のカード

----ハイスコアカード-----
name: 闇戦士ザビ・クロー score: 0.9692777991294861
ability: このクリーチャーは、可能なら毎ターン攻撃する。
abi_wakati: ['この', 'クリーチャー', 'は', '可能', 'なら', '毎', 'ターン', '攻撃', 'する']
----ハイスコアカード-----
name: 強戦士フレイム・クロー score: 0.9651838541030884
ability: このクリーチャーは、可能なら毎ターン攻撃する。
abi_wakati: ['この', 'クリーチャー', 'は', '可能', 'なら', '毎', 'ターン', '攻撃', 'する']
----ハイスコアカード-----
name: ゼンマイ・チュリス score: 0.9384633898735046
ability: このクリーチャーは、可能なら毎ターン、クリーチャーを攻撃する。
abi_wakati: ['この', 'クリーチャー', 'は', '可能', 'なら', '毎', 'ターン', 'クリーチャー', 'を', '攻撃', 'する']

ハイスコアだが似ていないカード

----ハイスコアカード-----
name: ガチャベス1/ガチャガチャ・スクランブル score: 0.8948121070861816
ability: このクリーチャーが攻撃する時、GR召喚する。
abi_wakati: ['この', 'クリーチャー', 'が', '攻撃', 'する', '時', 'GR', '召喚', 'する']
----ハイスコアカード-----
name: 桜丸パグのすけ score: 0.8905631303787231
ability: マナ爆誕3
abi_wakati: ['マナ', '爆誕', '3']
----ハイスコアカード-----
name: 焔役者シュラバミエ score: 0.8802741169929504
ability: ビビッドロー [ff01]
abi_wakati: ['ビビッドロー', '[', 'ff', '01', ']']
----ハイスコアカード-----
name: 風来の雲ベンケイ score: 0.879012942314148
ability: 侍流ジェネレート
abi_wakati: ['侍', '流', 'ジェネレート']
----ハイスコアカード-----
name: 岩岩-ロック score: 0.8786053657531738
ability: マジボンバー 4
abi_wakati: ['マジボンバー', '4']
----ハイスコアカード-----
name: Theブレー漢ズ score: 0.8785185813903809
ability: キリフダッシュ [nn01]
abi_wakati: ['キリフダッシュ', '[', 'nn', '01', ']']
----ハイスコアカード-----
name: おむすびガトリン score: 0.8771911263465881
ability: キリフダッシュ [ff02]
abi_wakati: ['キリフダッシュ', '[', 'ff', '02', ']']

トップ10中7枚が似ていないカードだった。
元の文が短すぎるのか?他にもいるはずだが取れず....

青銅の鎧

----このカードに似たカードを探す-----
name: 青銅の鎧
ability: このクリーチャーがバトルゾーンに出た時、自分の山札の上から1枚目をマナゾーンに置く。
abi_wakati: ['この', 'クリーチャー', 'が', 'バトル', 'ゾーン', 'に', '出', 'た', '時', '自分', 'の', '山', '札', 'の', '上', 'から', '1', '枚', '目', 'を', 'マナ', 'ゾーン', 'に', '置く']


ハイスコアで似ている効果のカード

----ハイスコアカード-----
name: 正々堂々ホルモン score: 0.9183767437934875
ability: このクリーチャーがバトルゾーンに出た時、自分の山札の上から1枚目をマナゾーンに置く。
abi_wakati: ['この', 'クリーチャー', 'が', 'バトル', 'ゾーン', 'に', '出', 'た', '時', '自分', 'の', '山', '札', 'の', '上', 'から', '1', '枚', '目', 'を', 'マナ', 'ゾーン', 'に', '置く']
----ハイスコアカード-----
name: メイプル超もみ人 score: 0.9062039852142334
ability: このクリーチャーがバトルゾーンに出た時、自分の山札の上から1枚目をマナゾーンに置く。
abi_wakati: ['この', 'クリーチャー', 'が', 'バトル', 'ゾーン', 'に', '出', 'た', '時', '自分', 'の', '山', '札', 'の', '上', 'から', '1', '枚', '目', 'を', 'マナ', 'ゾーン', 'に', '置く']
----ハイスコアカード-----
name: 雪精ホルデガンス score: 0.8917033076286316
ability: このクリーチャーがバトルゾーンに出た時、自分の山札の上から1枚目をマナゾーンに置く。
abi_wakati: ['この', 'クリーチャー', 'が', 'バトル', 'ゾーン', 'に', '出', 'た', '時', '自分', 'の', '山', '札', 'の', '上', 'から', '1', '枚', '目', 'を', 'マナ', 'ゾーン', 'に', '置く']
----ハイスコアカード-----
name: モモダチモンキッド score: 0.8549275994300842
ability: キリフダッシュ [nn02] このクリーチャーが出た時、自分の山札の上から1枚目をマナゾーンに置く。
abi_wakati: ['キリフダッシュ', '[', 'nn', '02', ']', 'この', 'クリーチャー', 'が', '出', 'た', '時', '自分', 'の', '山', '札', 'の', '上', 'から', '1', '枚', '目', 'を', 'マナ', 'ゾーン', 'に', '置く']
----ハイスコアカード-----
name: さくらいおん score: 0.8489749431610107
ability: S・トリガー このクリーチャーがバトルゾーンに出た時、自分の山札の上から1枚目をマナゾーンに置く。
abi_wakati: ['S', '・', 'トリガー', 'この', 'クリーチャー', 'が', 'バトル', 'ゾーン', 'に', '出', 'た', '時', '自分', 'の', '山', '札', 'の', '上', 'から', '1', '枚', '目', 'を', 'マナ', 'ゾーン', 'に', '置く']
----ハイスコアカード-----
name: 青銅の鎧(ブロンズ・アーム・トライブ) score: 0.8425323963165283
ability: このクリーチャーをバトルゾーンに出した時、自分の山札の上から1枚目をマナゾーンに置く。
abi_wakati: ['この', 'クリーチャー', 'を', 'バトル', 'ゾーン', 'に', '出し', 'た', '時', '自分', 'の', '山', '札', 'の', '上', 'から', '1枚', '目', 'を', 'マナ', 'ゾーン', 'に', '置く']
----ハイスコアカード-----
name: シェル・エイトレス score: 0.8294661045074463
ability: S・トリガー このクリーチャーがバトルゾーンに出た時、自分の山札の上から1枚目をマナゾーンに置く。
abi_wakati: ['S', '・', 'トリガー', 'この', 'クリーチャー', 'が', 'バトル', 'ゾーン', 'に', '出', 'た', '時', '自分', 'の', '山', '札', 'の', '上', 'から', '1', '枚', '目', 'を', 'マナ', 'ゾーン', 'に', '置く']
----ハイスコアカード-----
name: 御狐目コンチ score: 0.8280083537101746
ability: ブロッカー このクリーチャーは、相手プレイヤーを攻撃できない。このクリーチャーがバトルゾーンに出た時、自分の山札の上から1枚目をマナゾーンに置く。
abi_wakati: ['ブロッカー', 'この', 'クリーチャー', 'は', '相手', 'プレイヤー', 'を', '攻撃', 'でき', 'ない', 'この', 'クリーチャー', 'が', 'バトル', 'ゾーン', 'に', '出', 'た', '時', '自分', 'の', '山', '札', 'の', '上', 'から', '1', '枚', '目', 'を', 'マナ', 'ゾーン', 'に', '置く']
----ハイスコアカード-----
name: もみじゃがー score: 0.8226519227027893
ability: S・トリガー このクリーチャーが出た時、自分の山札の上から1枚目をマナゾーンに置く。
abi_wakati: ['S', '・', 'トリガー', 'この', 'クリーチャー', 'が', '出', 'た', '時', '自分', 'の', '山', '札', 'の', '上', 'から', '1', '枚', '目', 'を', 'マナ', 'ゾーン', 'に', '置く']
----ハイスコアカード-----
name: 青銅のバンビシカット/「我が力、しかと見よ!」 score: 0.8221652507781982
ability: このクリーチャーが出た時、相手とガチンコ・ジャッジする。自分が勝ったら、自分の山札の上から1枚目をマナゾーンに置く。
abi_wakati: ['この', 'クリーチャー', 'が', '出', 'た', '時', '相手', 'と', 'ガチンコ', '・', 'ジャッジ', 'する', '自分', 'が', '勝っ', 'たら', '自分', 'の', '山', '札', 'の', '上', 'から', '1', '枚', '目', 'を', 'マナ', 'ゾーン', 'に', '置く']

トップ10中0枚が似ていないカードだった。さすが似た能力が多そうなランキング1位(独自調査)。(途中同じカード入ってるのはもう気にしない。ちなみに(を使って、パック名と名前を分割したが、今あるデータで名前に()が正式に入っているのは「マキシマムザ亮君(暴天覚醒MAXIMUM神羅曼象)」と「勇者(仮)じーさんだけ」だった。他に11枚くらいあった。これを解決するには多分最初のスクレイピングの時に名前だけ取るようにする必要ありそう。)

ホーリー・スパーク

----このカードに似たカードを探す-----
name: ホーリー・スパーク
ability: S・トリガー 相手のクリーチャーをすべてタップする。
abi_wakati: ['S', '・', 'トリガー', '相手', 'の', 'クリーチャー', 'を', 'すべて', 'タップ', 'する']


ハイスコアで似ている効果のカード

----ハイスコアカード-----
name: ディスペネ・ユグラシル score: 0.9258768558502197
ability: S・トリガー 相手のパワー7000以下のクリーチャーをすべてタップする。
abi_wakati: ['S', '・', 'トリガー', '相手', 'の', 'パワー', '7000', '以下', 'の', 'クリーチャー', 'を', 'すべて', 'タップ', 'する']
----ハイスコアカード-----
name: ♪仰ぎ見よ閃光の奇跡 score: 0.9151645302772522
ability: S・トリガー GR召喚する。 相手のクリーチャーをすべてタップする。
abi_wakati: ['S', '・', 'トリガー', 'GR', '召喚', 'する', '相手', 'の', 'クリーチャー', 'を', 'すべて', 'タップ', 'する']
----ハイスコアカード-----
name: スーパー・スパーク score: 0.9076112508773804
ability: S・トリガー バトルゾーンにある相手のクリーチャーをすべてタップする。
abi_wakati: ['S', '・', 'トリガー', 'バトル', 'ゾーン', 'に', 'ある', '相手', 'の', 'クリーチャー', 'を', 'すべて', 'タップ', 'する']
----ハイスコアカード-----
name: マスター・スパーク score: 0.9011115431785583
ability: S・トリガー 相手のクリーチャーをすべてタップする。カードを1枚引く。
abi_wakati: ['S', '・', 'トリガー', '相手', 'の', 'クリーチャー', 'を', 'すべて', 'タップ', 'する', 'カード', 'を', '1', '枚', '引く']
----ハイスコアカード-----
name: クイック・スパーク score: 0.8876033425331116
ability: S・トリガー 相手のコスト6以下のクリーチャーをすべてタップする。
abi_wakati: ['S', '・', 'トリガー', '相手', 'の', 'コスト', '6', '以下', 'の', 'クリーチャー', 'を', 'すべて', 'タップ', 'する']
----ハイスコアカード-----
name: 1、2、3、チームボンバーイェー! score: 0.861730694770813
ability: S・トリガー 相手のパワー6000以下のクリーチャーを1体破壊する。相手のクリーチャーをすべてタップする。
abi_wakati: ['S', '・', 'トリガー', '相手', 'の', 'パワー', '6000', '以下', 'の', 'クリーチャー', 'を', '1', '体', '破壊', 'する', '相手', 'の', 'クリーチャー', 'を', 'すべて', 'タップ', 'する']
----ハイスコアカード-----
name: 双聖混成クラウツインゼ score: 0.8515300750732422
ability: {GS} G・ストライク EXライフ スピードアタッカー T・ブレイカー このクリーチャーが出た時、相手のクリーチャーをすべてタップする。
abi_wakati: ['{', 'GS', '}', 'G', '・', 'ストライク', 'EX', 'ライフ', 'スピードアタッカー', 'T', '・', 'ブレイカー', 'この', 'クリーチャー', 'が', '出', 'た', '時', '相手', 'の', 'クリーチャー', 'を', 'すべて', 'タップ', 'する']
----ハイスコアカード-----
name: 蒼光の守護者ラウ・ラ・テラ score: 0.8335469365119934
ability: S・トリガー このクリーチャーがバトルゾーンに出た時、相手のパワー3000以下のクリーチャーをすべてタップする。
abi_wakati: ['S', '・', 'トリガー', 'この', 'クリーチャー', 'が', 'バトル', 'ゾーン', 'に', '出', 'た', '時', '相手', 'の', 'パワー', '3000', '以下', 'の', 'クリーチャー', 'を', 'すべて', 'タップ', 'する']
----ハイスコアカード-----
name: AND・スパーク score: 0.8335294723510742
ability: S・トリガー 自分のシールドが2つ以下なら、相手のクリーチャーをすべてタップする。自分の山札の上から1枚目を裏向きのまま、新しいシールドとしてシールドゾーンに置く。
abi_wakati: ['S', '・', 'トリガー', '自分', 'の', 'シールド', 'が', '2つ', '以下', 'なら', '相手', 'の', 'クリーチャー', 'を', 'すべて', 'タップ', 'する', '自分', 'の', '山', '札', 'の', '上', 'から', '1', '枚', '目', 'を', '裏', '向き', 'の', 'まま', '新しい', 'シールド', 'として', 'シールド', 'ゾーン', 'に', '置く']
----ハイスコアカード-----
name: スパーク・3シャイン score: 0.8292974829673767
ability: S・トリガー バトルゾーンにある、コスト3以下のクリーチャーをすべてタップする。
abi_wakati: ['S', '・', 'トリガー', 'バトル', 'ゾーン', 'に', 'ある', 'コ', 'スト3', '以下', 'の', 'クリーチャー', 'を', 'すべて', 'タップ', 'する']

これも10枚中10枚が似ていそう。

2.足し算や引き算でそれっぽいものが出現するか。

s=model.docvecs.most_similar(positive=["ブラッディ・ツヴァイクロス","ガード・グリップ"]
                          ,negative=["ボーンおどり・チャージャー"])

"ブラッディ・ツヴァイクロス" + "ガード・グリップ" - "ボーンおどり・チャージャー"

結果

----計算結果と高い類似度を持つカード-----
name: 王立アカデミー・ホウエイル score: 0.7916662096977234
abi_wakati: ['カード', 'を', '3', '枚', '引く']
ability: カードを3枚引く。
----計算結果と高い類似度を持つカード-----
name: アルファゴリラー score: 0.7747893333435059
abi_wakati: ['バズレンダ', '[', 'cc', '02', ']', '\r', '{', 'OL', '}', 'カード', 'を', '1', '枚', '引く']
{OL} カードを1枚引く。[cc02]
----計算結果と高い類似度を持つカード-----
name: トリプル・ブレイン score: 0.7641295194625854
abi_wakati: ['カード', 'を', '3枚', 'まで', '引く']
ability: カードを3枚まで引く。
----計算結果と高い類似度を持つカード-----
name: 【奇跡】まさかの神引き!!【豪運】 score: 0.7351284027099609
abi_wakati: ['バズレンダ', '[', 'cc', '03', ']', '\r', '[', 'OL', ']', 'カード', 'を', '1', '枚', '引く']
[OL]カードを1枚引く。 [cc03]
----計算結果と高い類似度を持つカード-----
name: クアトロ・ブレイン score: 0.7231599688529968
abi_wakati: ['カード', 'を', '4', '枚', '引く']
ability: カードを4枚引く。
----計算結果と高い類似度を持つカード-----
name: ガールズ・ジャーニー score: 0.7207408547401428
abi_wakati: ['S', '・', 'トリガー', 'カード', 'を', '3', '枚', '引く']
ability: S・トリガー カードを3枚引く。
----計算結果と高い類似度を持つカード-----
name: パラリラ・セーリング score: 0.7181738018989563
abi_wakati: ['GR', '召喚', 'する', 'カード', 'を', '1', '枚', '引く']
ability: GR召喚する。 カードを1枚引く。
----計算結果と高い類似度を持つカード-----
name: ツタンカーネン score: 0.713878870010376
abi_wakati: ['この', 'クリーチャー', 'が', 'バトル', 'ゾーン', 'に', '出', 'た', '時', 'カード', 'を', '1', '枚', '引く']
ability: このクリーチャーがバトルゾーンに出た時、カードを1枚引く。
----計算結果と高い類似度を持つカード-----
name: 響役者ナリモノヤゴウ score: 0.7104462385177612
abi_wakati: ['ビビッドロー', '[', 'ff', '03', ']', 'スピードアタッカー']
ability: ビビッドロー [ff03] スピードアタッカー
----計算結果と高い類似度を持つカード-----
name: アクア・ツバメガエシ score: 0.7074939012527466
abi_wakati: ['侍', '流', 'ジェネレート']
ability: 侍流ジェネレート

予想通り、"王立アカデミー・ホウエイル"や"トリプル・ブレイン"が高い類似度を持つことがわかる。
カードを1枚引く系のカードはガード・グリップに似ているためというのが考えられる。

まとめ

gensimのdoc2vecとMeCab+NEologdを使って、デュエルマスターズの文書ベクトル作って、類似度やってみました。
"凶戦士ブレイズ・クロー"以外納得のいく類似度が得られ、計算も予想通りイイ感じっぽいです。

逆になぜ関係のない文章が高い類似度を持ってしまうか、不明です。専攻が違うので、ここ詳しい方がいればコメント等で教えていただけると幸いです。

また、コードや日本語が変等あれば、教えていただけると助かります。

今後似たような感じで、自然言語処理周りを今回取得したデータセットを用いて触っていけたら面白いかなと思っています(やりたいことはいっぱいあるけど、技術も時間もないので鈍足ですが...)
次回の内容は、SentencePieceで分かち書きしてあげて、ブレイズ・クローと似たカードを探すみたいなことをやろうと思います。ちなみにネタバレすると結構いい感じでした。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
6