[PYTHON] J'ai recherché une carte similaire de Hearthstone avec Deep Learning

Récemment, Doc2Vec est intéressant, donc je fais diverses choses. J'ai trouvé l'article suivant, alors je l'ai essayé moi-même. → J'ai cherché une carte similaire de MTG avec Doc2Vec

Qu'est-ce que Doc2Vec?

Word2Vec considère Word comme un vecteur, mais Doc2Vec (Paragraph2Vec) voit Document comme un ensemble de Word et attribue un vecteur pour réaliser la similitude entre les documents et le calcul vectoriel. ..

Par exemple, vous pouvez calculer la similitude entre les articles de presse, la similitude entre les CV, la similitude entre les livres, et bien sûr la similitude entre le profil d'une personne et un livre. Tous sont ciblés.

Source: http://qiita.com/okappy/items/32a7ba7eddf8203c9fa1

Langue / package utilisé

Données cibles

Carte Heartstone de Blizzard 922 textes

Échantillon de carte 00912eb0f9c8d30b0bc9804db54210a3-1.png

Création de corpus

Le corpus est extrait de la liste des cartes Hearthstone des 4 tortues (http://www.4gamer.net/games/209/G020915/FC20140702001/). Cette fois, j'ai utilisé Scrapy. Créez un projet avec la commande suivante.

terminal


$ scrapy startproject hearth_stone

Le fichier suivant sera créé.

terminal


$ tree hearth_stone/
hearth_stone
├── hearth_stone
│   ├── __init__.py
│   ├── __pycache__
│   ├── items.py
│   ├── pipelines.py
│   ├── settings.py
│   └── spiders
│       ├── __init__.py
│       └── __pycache__
└── scrapy.cfg

4 directories, 6 files

Tout d'abord, définissez la structure de données à afficher dans ʻitems.py`. Cette fois, je n'ai besoin que du nom et du texte, mais je peux l'utiliser à l'avenir afin de gratter toutes les données de la carte.

items.py


# -*- coding: utf-8 -*-
import scrapy


class HearthStoneItem(scrapy.Item):
    name = scrapy.Field()
    rarity = scrapy.Field()
    ruby = scrapy.Field()
    type = scrapy.Field()
    hero = scrapy.Field()
    race = scrapy.Field()
    text = scrapy.Field()
    mana = scrapy.Field()
    attack = scrapy.Field()
    health = scrapy.Field()

Ensuite, créez un Spider (robot d'exploration).

terminal


# For example, to create a new spider:
# scrapy genspider mydomain mydomain.com

$ scrapy genspider hearthstone 4gamer.net

Le fichier suivant sera créé.

spiders/hearthstone.py


# -*- coding: utf-8 -*-
import scrapy


class HearthstoneSpider(scrapy.Spider):
    name = "hearthstone"
    allowed_domains = ["4gamer.net"]
    start_urls = ['http://4gamer.net/']

    def parse(self, response):
        pass

Réécrivez ceci pour le site des 4 tortues.

spiders/hearthstone.py


# -*- coding: utf-8 -*-
import scrapy
from ..items import HearthStoneItem
from bs4 import BeautifulSoup


class HearthStoneSpider(scrapy.Spider):
    name = "hearth_stone"
    allowed_domains = ["4gamer.net"]
    start_urls = ['http://www.4gamer.net/games/209/G020915/FC20140702001/']

    def parse(self, response):
        soup = BeautifulSoup(response.body, "lxml")

        for card in soup.find("div", id="UNIT_LIST").findAll("div"):
            item = HearthStoneItem()
            item['name'] = card.find("span", class_="name").string
            item['rarity'] = card.find("span", class_="rarity").string
            item['ruby'] = card.find("span", class_="ruby").string
            item['type'] = card.find("span", class_="type").string
            item['hero'] = card.find("span", class_="class").string
            item['race'] = card.find("span", class_="race").string
            item['text'] = card.find("span", class_="card_comment").find("p").string
            item['mana'] = card.find("span", class_="mana").string
            item['attack'] = card.find("span", class_="attack").string
            item['health'] = card.find("span", class_="health").string
            yield item

Maintenant que vous êtes prêt à gratter, exécutez le robot d'exploration. Vous pouvez spécifier le nom du fichier de sortie avec -o. (Le type de fichier est automatiquement déterminé à partir de l'extension)

terminal


$ scrapy crawl hearthstone -o hearth_stone.json

Si l'exploration / scraping réussit, le fichier suivant sera créé. Cela ressemble à un chiffrement, mais c'est juste Unicode, donc ça va.

hearth_stone.json


[
{"attack": "4", "ruby": "Abomination", "rarity": "\u30ec\u30a2", "type": "\u30df\u30cb\u30aa\u30f3", "hero": "\u4e2d\u7acb", "mana": "5", "name": "\u6d9c\u308c\u3057\u3082\u306e", "race": "-", "health": "4", "text": "\u6311\u767a\uff06\u65ad\u672b\u9b54\uff1a\u5168\u3066\u306e\u30ad\u30e3\u30e9\u30af\u30bf\u30fc\u306b2\u30c0\u30e1\u30fc\u30b8\u3092\u4e0e\u3048\u308b\u3002"},
{"attack": "1", "ruby": "Abusive Sergeant", "rarity": "\u30b3\u30e2\u30f3", "type": "\u30df\u30cb\u30aa\u30f3", "hero": "\u4e2d\u7acb", "mana": "1", "name": "\u9b3c\u8ecd\u66f9", "race": "-", "health": "1", "text": "\u96c4\u53eb\u3073\uff1a\u3053\u306e\u30bf\u30fc\u30f3\u306e\u9593\u3001\u30df\u30cb\u30aa\u30f31\u4f53\u306b\u653b\u6483\u529b\uff0b2\u3092\u4ed8\u4e0e\u3059\u308b\u3002"},
{"attack": "3", "ruby": "Acidic Swamp Ooze", "rarity": "\u30d5\u30ea\u30fc", "type": "\u30df\u30cb\u30aa\u30f3", "hero": "\u4e2d\u7acb", "mana": "2", "name": "\u9178\u6027\u6cbc\u30a6\u30fc\u30ba", "race": "-", "health": "2", "text": "\u96c4\u53eb\u3073\uff1a\u6575\u306e\u6b66\u5668\u3092\u7834\u58ca\u3059\u308b\u3002"},
{"attack": "4", "ruby": "Acidmaw ", "rarity": "\u30ec\u30b8\u30a7\u30f3\u30c9", "type": "\u30df\u30cb\u30aa\u30f3", "hero": "\u30cf\u30f3\u30bf\u30fc", "mana": "7", "name": "\u30a2\u30b7\u30c3\u30c9\u30e2\u30fc", "race": "\u7363", "health": "2", "text": "\u81ea\u5206\u4ee5\u5916\u306e\u30df\u30cb\u30aa\u30f3\u304c\u30c0\u30e1\u30fc\u30b8\u3092\u53d7\u3051\u308b\u5ea6\u3001\u305d\u306e\u30df\u30cb\u30aa\u30f3\u3092\u7834\u58ca\u3059\u308b\u3002"},
{"attack": "1", "ruby": "Acolyte of Pain", "rarity": "\u30b3\u30e2\u30f3", "type": "\u30df\u30cb\u30aa\u30f3", "hero": "\u4e2d\u7acb", "mana": "3", "name": "\u82e6\u75db\u306e\u4f8d\u796d", "race": "-", "health": "3", "text": "\u3053\u306e\u30df\u30cb\u30aa\u30f3\u304c\u30c0\u30e1\u30fc\u30b8\u3092\u53d7\u3051\u308b\u5ea6\u3001\u30ab\u30fc\u30c9\u30921\u679a\u5f15\u304f\u3002"},
{"attack": "3", "ruby": "Al'Akir the Windlord", "rarity": "\u30ec\u30b8\u30a7\u30f3\u30c9", "type": "\u30df\u30cb\u30aa\u30f3", "hero": "\u30b7\u30e3\u30fc\u30de\u30f3", "mana": "8", "name": "\u98a8\u306e\u738b\u30a2\u30e9\u30ad\u30a2", "race": "-", "health": "5", "text": "\u75be\u98a8\u3001\u7a81\u6483\u3001\u8056\u306a\u308b\u76fe\u3001\u6311\u767a"},
{"attack": "0", "ruby": "Alarm-o-Bot", "rarity": "\u30ec\u30a2", "type": "\u30df\u30cb\u30aa\u30f3", "hero": "\u4e2d\u7acb", "mana": "3", "name": "\u30a2\u30e9\u30fc\u30e0\u30ed\u30dc", "race": "\u30e1\u30ab", "health": "3", "text": "\u81ea\u5206\u306e\u30bf\u30fc\u30f3\u306e\u958b\u59cb\u6642\u3001\u3053\u306e\u30df\u30cb\u30aa\u30f3\u3092\u3001\u81ea\u5206\u306e\u624b\u672d\u306e\u30e9\u30f3\u30c0\u30e0\u306a\u30df\u30cb\u30aa\u30f3\u3068\u5165\u308c\u66ff\u3048\u308b"},
{"attack": "3", "ruby": "Aldor Peacekeeper", "rarity": "\u30ec\u30a2", "type": "\u30df\u30cb\u30aa\u30f3", "hero": "\u30d1\u30e9\u30c7\u30a3\u30f3", "mana": "3", "name": "\u30a2\u30eb\u30c0\u30fc\u306e\u5e73\u548c\u306e\u756a\u4eba", "race": "-", "health": "3", "text": "\u96c4\u53eb\u3073\uff1a\u6575\u306e\u30df\u30cb\u30aa\u30f31\u4f53\u306e\u653b\u6483\u529b\u30921\u306b\u5909\u3048\u308b\u3002"},
{"attack": "8", "ruby": "Alexstrasza", "rarity": "\u30ec\u30b8\u30a7\u30f3\u30c9", "type": "\u30df\u30cb\u30aa\u30f3", "hero": "\u4e2d\u7acb", "mana": "9", "name": "\u30a2\u30ec\u30af\u30b9\u30c8\u30e9\u30fc\u30b6", "race": "\u30c9\u30e9\u30b4\u30f3", "health": "8", "text": "\u96c4\u53eb\u3073\uff1a\u30d2\u30fc\u30ed\u30fc1\u4eba\u306e\u6b8b\u308a\u4f53\u529b\u309215\u306b\u3059\u308b\u3002"},
{"attack": "2", "ruby": "Alexstrasza's Champion ", "rarity": "\u30ec\u30a2", "type": "\u30df\u30cb\u30aa\u30f3", "hero": "\u30a6\u30a9\u30ea\u30a2\u30fc", "mana": "2", "name": "\u30a2\u30ec\u30af\u30b9\u30c8\u30e9\u30fc\u30b6\u306e\u52c7\u8005", "race": "-", "health": "3", "text": "\u96c4\u53eb\u3073\uff1a\u81ea\u5206\u306e\u624b\u672d\u306b\u30c9\u30e9\u30b4\u30f3\u30ab\u30fc\u30c9\u304c\u3042\u308b\u5834\u5408\u3001\u653b\u6483\u529b\uff0b1\u3068\u7a81\u6483\u3092\u5f97\u308b\u3002"},
{"attack": "2", "ruby": "Amani Berserker", "rarity": "\u30b3\u30e2\u30f3", "type": "\u30df\u30cb\u30aa\u30f3", "hero": "\u4e2d\u7acb", "mana": "2", "name": "\u30a2\u30de\u30cb\u306e\u72c2\u6226\u58eb", "race": "-", "health": "3", "text": "\u6fc0\u6012\uff1a\u653b\u6483\u529b\uff0b3\u3002"},
{"attack": null, "ruby": "Ancestor's Call", "rarity": "\u30a8\u30d4\u30c3\u30af", "type": "\u546a\u6587", "hero": "\u30b7\u30e3\u30fc\u30de\u30f3", "mana": "4", "name": "\u7956\u970a\u306e\u58f0", "race": "-", "health": null, "text": "\u5404\u30d7\u30ec\u30a4\u30e4\u30fc\u306e\u624b\u672d\u304b\u3089\u3001\u30e9\u30f3\u30c0\u30e0\u306a\u30df\u30cb\u30aa\u30f31\u4f53\u3092\u305d\u308c\u305e\u308c\u306e\u9663\u5730\u306b\u8ffd\u52a0\u3059\u308b\u3002"},
{"attack": null, "ruby": "Ancestral Healing", "rarity": "\u30b3\u30e2\u30f3", "type": "\u546a\u6587", "hero": "\u30b7\u30e3\u30fc\u30de\u30f3", "mana": "0", "name": "\u7956\u970a\u306e\u7652\u3057", "race": "-", "health": null, "text": "\u30df\u30cb\u30aa\u30f31\u4f53\u306e\u4f53\u529b\u3092\u4e0a\u9650\u307e\u3067\u56de\u5fa9\u3057\u3001\u6311\u767a\u3092\u4ed8\u4e0e\u3059\u308b\u3002"},
{"attack": null, "ruby": "Ancestral Knowledge ", "rarity": "\u30b3\u30e2\u30f3", "type": "\u546a\u6587", "hero": "\u30b7\u30e3\u30fc\u30de\u30f3", "mana": "2", "name": "\u7956\u970a\u306e\u77e5\u8b58", "race": "-", "health": null, "text": "\u30ab\u30fc\u30c9\u30922\u679a\u5f15\u304f\u3002\u30aa\u30fc\u30d0\u30fc\u30ed\u30fc\u30c9\uff1a (2)"},
{"attack": null, "ruby": "Ancestral Spirit", "rarity": "\u30ec\u30a2", "type": "\u546a\u6587", "hero": "\u30b7\u30e3\u30fc\u30de\u30f3", "mana": "2", "name": "\u7956\u970a\u306e\u5c0e\u304d", "race": "-", "health": null, "text": "\u30df\u30cb\u30aa\u30f31\u4f53\u306b\u3001\u300c\u65ad\u672b\u9b54\uff1a\u3053\u306e\u30df\u30cb\u30aa\u30f3\u3092\u518d\u5ea6\u53ec\u559a\u3059\u308b\u300d\u3092\u4ed8\u4e0e\u3059\u308b\u3002"},
{"attack": "5", "ruby": "Ancient Brewmaster", "rarity": "\u30b3\u30e2\u30f3", "type": "\u30df\u30cb\u30aa\u30f3", "hero": "\u4e2d\u7acb", "mana": "4", "name": "\u8001\u7df4\u306e\u9152\u9020\u5927\u5e2b", "race": "-", "health": "4", "text": "\u96c4\u53eb\u3073\uff1a\u5473\u65b9\u306e\u30df\u30cb\u30aa\u30f31\u4f53\u3092\u6226\u5834\u304b\u3089\u81ea\u5206\u306e\u624b\u672d\u306b\u623b\u3059\u3002"},
{"attack": "2", "ruby": "Ancient Mage", "rarity": "\u30ec\u30a2", "type": "\u30df\u30cb\u30aa\u30f3", "hero": "\u4e2d\u7acb", "mana": "4", "name": "\u8001\u7df4\u306e\u30e1\u30a4\u30b8", "race": "-", "health": "5", "text": "\u96c4\u53eb\u3073\uff1a\u96a3\u63a5\u3059\u308b\u30df\u30cb\u30aa\u30f3\u306b\u3001\u546a\u6587\u30c0\u30e1\u30fc\u30b8\uff0b1\u3092\u4ed8\u4e0e\u3059\u308b\u3002"},
{"attack": "5", "ruby": "Ancient of Lore", "rarity": "\u30a8\u30d4\u30c3\u30af", "type": "\u30df\u30cb\u30aa\u30f3", "hero": "\u30c9\u30eb\u30a4\u30c9", "mana": "7", "name": "\u77e5\u8b58\u306e\u53e4\u4ee3\u6a39", "race": "-", "health": "5", "text": "\u9078\u629e\uff1a\u30ab\u30fc\u30c9\u30921\u679a\u5f15\u304f\u3002\u307e\u305f\u306f\u3001\u4f53\u529b\u30925\u56de\u5fa9\u3059\u308b\u3002"},
{"attack": "5", "ruby": "Ancient of War", "rarity": "\u30a8\u30d4\u30c3\u30af", "type": "\u30df\u30cb\u30aa\u30f3", "hero": "\u30c9\u30eb\u30a4\u30c9", "mana": "7", "name": "\u6226\u306e\u53e4\u4ee3\u6a39", "race": "-", "health": "5", "text": "\u9078\u629e\uff1a\u653b\u6483\u529b\uff0b5\u3002\u307e\u305f\u306f\u3001\u4f53\u529b\uff0b5\u3068\u6311\u767a\u3002"},
{"attack": "4", "ruby": "Ancient Watcher", "rarity": "\u30ec\u30a2", "type": "\u30df\u30cb\u30aa\u30f3", "hero": "\u4e2d\u7acb", "mana": "2", "name": "\u53e4\u4ee3\u306e\u756a\u4eba", "race": "-", "health": "5", "text": "\u653b\u6483\u3067\u304d\u306a\u3044\u3002"},
{"attack": "1", "ruby": "Angry Chicken", "rarity": "\u30ec\u30a2", "type": "\u30df\u30cb\u30aa\u30f3", "hero": "\u4e2d\u7acb", "mana": "1", "name": "\u30a2\u30f3\u30b0\u30ea\u30fc\u30c1\u30ad\u30f3", "race": "\u7363", "health": "1", "text": "\u6fc0\u6012\uff1a\u653b\u6483\u529b\uff0b5\u3002"},
{"attack": "9", "ruby": "Anima Golem", "rarity": "\u30a8\u30d4\u30c3\u30af", "type": "\u30df\u30cb\u30aa\u30f3", "hero": "\u30a6\u30a9\u30fc\u30ed\u30c3\u30af", "mana": "6", "name": "\u30a2\u30cb\u30de\u30fb\u30b4\u30fc\u30ec\u30e0", "race": "\u30e1\u30ab", "health": "9", "text": "\u6bce\u30bf\u30fc\u30f3\u306e\u7d42\u4e86\u6642\u306b\u3001\u3053\u306e\u30df\u30cb\u30aa\u30f3\u304c\u81ea\u5206\u306e\u552f\u4e00\u306e\u30df\u30cb\u30aa\u30f3\u3067\u3042\u308b\u5834\u5408\u3001\u3053\u306e\u30df\u30cb\u30aa\u30f3\u3092\u7834\u58ca\u3059\u308b\u3002"},
#réduction
]

Création de modèles d'apprentissage

Utilisez le corpus créé pour entraîner doc2vec et créer un modèle. Il est exécuté avec la structure de répertoires suivante.

terminal


doc2vec
├── card2vec.py
└── hearth_stone # (Scrapy Project)
    ├── hearth_stone
    │   ├── __init__.py
    │   ├── __pycache__
    │   │   ├── __init__.cpython-35.pyc
    │   │   ├── items.cpython-35.pyc
    │   │   └── settings.cpython-35.pyc
    │   ├── items.py
    │   ├── pipelines.py
    │   ├── settings.py
    │   └── spiders
    │       ├── __init__.py
    │       ├── __pycache__
    │       │   └── __init__.cpython-35.pyc
    │       └── hearthstone.py
    ├── hearth_stone.json
    └── scrapy.cfg

Apprentissage, partie modélisation

Créez un modèle de doc2vec avec le code suivant.

card2vec.py


# -*- coding: utf-8 -*-
import json
import MeCab
from gensim.models import doc2vec
import os


def load_json(target_game_name):
    #Création de données d'entrée pour le nom de la carte et le texte de la carte
    names = []
    text = ""
    texts = []

    #Spécifiez la sortie de Mecab en tant que division
    mecab = MeCab.Tagger("-Owakati")
    
    json_path = target_game_name + "/" + target_game_name + ".json"
    
    #Analyse morphologique du texte sur la carte et division du texte en une chaîne séparée par des sauts de ligne
    with open(json_path, "r") as file:
        card_dict = json.load(file)
        for card in card_dict:
            if card["name"] not in names:
                names.append(card["name"])
                mecab_result = mecab.parse(card["text"])
                if mecab_result is False:
                    text += "\n"
                    texts.append("")
                else:
                    text += mecab_result
                    texts.append(card["text"])


    with open(target_game_name + ".txt", "w") as file:
        file.write(text)

    return names, texts


def generate_doc2vec_model(target_game_name):
    print("Training Start")
    #Lire le texte de la carte
    card_text = doc2vec.TaggedLineDocument(target_game_name + ".txt")
    #Apprentissage
    model = doc2vec.Doc2Vec(card_text, size=300, window=8, min_count=1,
                            workers=4, iter=400, dbow_words=1, negative=5)

    #Enregistrer le modèle
    model.save(target_game_name + ".model")
    print("Training Finish")
    return model


if __name__ == '__main__':
    TARGET_GAME_NAME = "hearth_stone"
    names, texts = load_json(TARGET_GAME_NAME)

    if os.path.isfile(TARGET_GAME_NAME + ".model") is True:
        model = doc2vec.Doc2Vec.load(TARGET_GAME_NAME + ".model")
    else:
        model = generate_doc2vec_model(TARGET_GAME_NAME)

Estimation d'une partie de cartes similaires

card2vec.Poursuite de py


    #Nom de la carte pour laquelle vous souhaitez rechercher une carte similaire
    TARGET_CARD_NAME = "Hogger"
    card_index = names.index(TARGET_CARD_NAME)

    #Recevez une liste de cartes similaires et de taples de similitude (10 principales similitudes)
    similar_docs = model.docvecs.most_similar(card_index)
    print(names[card_index])
    print(texts[card_index])
    print("--------------------is similar to--------------------")
    for similar_doc in similar_docs:
        print(names[similar_doc[0]] + " " + str(similar_doc[1]))
        print(texts[similar_doc[0]], "\n")

Résultat d'exécution

Essayez de sortir une carte similaire avec le nom de la carte comme entrée. Cette fois, j'entre personnellement ma carte préférée.

Carte d'entrée: "Hoger"

terminal


$ python card2vec.py
Hogger
À la fin de votre tour, faites une provocation 2/Invoquez 1 Noor sur 2.
--------------------is similar to--------------------

Elwin's Disaster Hogger 0.9119920134544373
Chaque fois que ce serviteur est endommagé, il a une provocation 2/Invoquez 1 Noor sur 2.

Destructeur d'obsidienne 0.8980860114097595
À la fin de votre tour, faites une provocation 1/Invoquez 1 scarabée.

Pierre d'invocation 0.8811841011047363
Chaque fois que vous lancez un sort, invoquez un serviteur aléatoire du même coût.

Image miroir 0.8686900734901428
0 avec provocation/Invoquez 2 serviteurs de 2.

Isera 0.8627046346664429
À la fin de votre tour, ajoutez une carte de rêve à votre main.
#réduction
contribution production
ref_upload.png ref_upload(1).png

Celui avec la plus grande similitude avec l'entrée "Hogger" était "Elwin's Disaster Hogger". Comme vous pouvez le voir, il est intéressant que la même carte Hogger ait été sortie avec juste le texte. Les 2ème et 3ème cartes et le texte de la carte sont "Summon \ * \ * \ * \ * when ~ ~", donc il est pris avec une assez grande précision.

Carte d'entrée: "Iron Jaguar Note"

terminal


Note de fer Jaguar
Cri: Ajoutez 1 "mine terrestre enterrée" à un emplacement aléatoire sur le deck ennemi. "Mine enterrée" explose lorsqu'elle est tirée, infligeant 10 dégâts.
--------------------is similar to--------------------

Araignée de terre 0.8792235851287842
Ajoutez 3 cartes "Embuscade" à chaque position aléatoire du deck ennemi. Lorsque "Embuscade" est tiré, 4 à votre place/Invoquez 1 Nervian sur 4.

Elise Chercheuse d'étoiles 0.8761336803436279
Cri: Ajoutez une "Carte au singe d'or" à un emplacement aléatoire de votre deck.

Arme destructrice 0.8525710105895996
Au début de votre tour, infligez 2 dégâts à un ennemi aléatoire.

Ombre ancienne 0.8471906185150146
Cri: ajoutez une «malédiction ancienne» à un emplacement aléatoire de votre deck. Si vous piochez "Ancient Curse", vous subirez 7 dégâts.

Gorge Tyrant Mukura 0.8456800580024719
Cri: Ajoutez 2 "bananes" à votre main.
#réduction
contribution production
ref_upload (3).png ref_upload(4).png

Cela a également une fonctionnalité solide telle que "Ajouter ~ \ * \ * \ * \ * à des positions aléatoires sur le deck de l'ennemi. Si \ * \ * \ * \ * est tiré ~ ~." Je vais. "Elise Starseeker" et "Ancient Shade", qui insèrent des cartes à des positions aléatoires sur le jeu, sont également au sommet.

Carte d'entrée: "Road Jaluxus"

terminal


Route Jaluxus
Criez: Votre héros est détruit et Lord Jaluxus devient votre héros.
--------------------is similar to--------------------

Exécution du chef 0.8202652335166931
Désespéré: Lagunaros, le roi du feu, devient son héros.

Commande 0.8199278712272644
Pendant ce tour, les serviteurs des alliés ne peuvent pas obtenir moins de 1. Dessiner une carte.

Elise Chercheuse d'étoiles 0.8164669275283813
Cri: Ajoutez une "Carte au singe d'or" à un emplacement aléatoire de votre deck.

Matcher de lance de Tasker 0.8136664032936096
Cri: Montrez l'un des sbires de deck de chaque joueur Si votre serviteur coûte plus cher, soignez votre héros de 7.

Mortelle Ichiya 0.8121815323829651
Détruisez un serviteur ennemi aléatoire.
#réduction
contribution production
ref_upload (5).png ref_upload(6).png

"Road Jaluxus" est une carte avec un effet étrange qui change votre héros. Les seules cartes qui ont cet effet sont "Road Jaluxus" et "Executors, the Leading Elder". Dans ce résultat, la similitude entre les deux est élevée, on peut donc dire que les fonctionnalités sont assez bien prises.

Résumé

Il s'avère que même des textes courts comme des textes de cartes comme Hearthstone peuvent être vectorisés avec succès avec doc2vec. En tant que corpus, j'ai pu obtenir beaucoup de précision avec seulement 922 feuilles. Concernant les paramètres de Doc2Vec, je me suis référé au document présenté dans les références. En passant, je l'ai essayé avec la carte de Yugioh, mais je ne savais pas si c'était similaire parce que je ne connaissais pas Yugioh, alors j'ai arrêté. Je téléchargerai le jeu de sources et de modèles sur Github, donc si vous êtes intéressé, essayez-le. https://github.com/GuiltyMorishita/card2vec

Les références

Distributed Representations of Sentences and Documents An Empirical Evaluation of doc2vec with Practical Insights into Document Embedding Generation

Recommended Posts

J'ai recherché une carte similaire de Hearthstone avec Deep Learning
J'ai installé le framework Deep Learning Chainer
J'ai essayé d'écrire dans un modèle de langage profondément appris
J'ai créé beaucoup de fichiers pour la connexion RDP avec Python
J'ai essayé l'apprentissage par renforcement profond (Double DQN) avec ChainerRL
Essayez l'apprentissage profond de la génomique avec Kipoi
Analyse émotionnelle des tweets avec apprentissage en profondeur
Une collection de conseils pour accélérer l'apprentissage et le raisonnement avec PyTorch
J'ai fait GAN avec Keras, donc j'ai fait une vidéo du processus d'apprentissage.
Un mémorandum d'étude et de mise en œuvre du Deep Learning
Implémentation du modèle Deep Learning pour la reconnaissance d'images
J'ai essayé d'extraire le dessin au trait de l'image avec Deep Learning
Créer un ensemble de données d'images à utiliser pour la formation
Une histoire de prédiction du taux de change avec Deep Learning
Je veux escalader une montagne avec l'apprentissage par renforcement
J'ai créé une fenêtre pour la sortie du journal avec Tkinter
Deep learning 1 Pratique du deep learning
Mongodb Introduction la plus courte (2) J'ai recherché des dizaines de milliers
J'ai essayé le deep learning
Techniques pour comprendre la base des décisions d'apprentissage en profondeur
J'ai essayé de créer un environnement d'apprentissage amélioré pour Othello avec Open AI gym
[Python] J'ai créé un classificateur pour les iris [Machine learning]
Créez un "bot qui vous informe des actrices audiovisuelles aux visages similaires" grâce à l'apprentissage en profondeur
J'ai essayé un RPA simple pour me connecter avec du sélénium
Une scène où le GPU est utile pour le deep learning?
J'ai recherché le contenu de l'agent CloudWatch Logs
J'ai créé un environnement pour Masonite, un framework WEB Python similaire à Laravel, avec Docker!
TensorFlow change-t-il l'image de l'apprentissage profond? Ce que j'ai pensé après avoir touché un peu
Traduction japonaise du matériel pédagogique public du diplôme nano d'apprentissage profond
J'ai écrit un programme de démonstration pour la transformation linéaire d'une matrice
Créez un environnement pour "Deep Learning from scratch" avec Docker
(Maintenant) Construisez un environnement GPU Deep Learning avec GeForce GTX 960
J'ai essayé d'héberger un modèle d'apprentissage en profondeur de TensorFlow à l'aide de TensorFlow Serving
J'ai essayé d'utiliser Tensorboard, un outil de visualisation pour l'apprentissage automatique
J'ai créé un moniteur de ressources pour Raspberry Pi avec une feuille de calcul
J'ai fait un kit d'apprentissage pour word2vec / doc2vec / GloVe / fastText
J'ai essayé d'implémenter ListNet d'apprentissage de rang avec Chainer
L'histoire d'un ingénieur directeur de 40 ans qui réussit "Deep Learning for ENGINEER"
J'ai capturé le projet Toho avec Deep Learning ... je le voulais.
J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python
Tourner un tableau de chaînes avec une instruction for (Python3)
Je n'ai pas de GPU, mais je vais essayer le Deep Learning
Essayez l'apprentissage en profondeur avec TensorFlow
Deep running 2 Réglage de l'apprentissage profond
Apprentissage profond du noyau avec Pyro
Essayez le Deep Learning avec FPGA
Apprentissage profond pour la formation composée?
Apprentissage par renforcement profond 2 Mise en œuvre de l'apprentissage par renforcement
Générez des Pokémon avec Deep Learning
J'ai recherché des commandes de CD.
Une histoire coincée avec l'installation de la bibliothèque de machine learning JAX
J'ai essayé de rendre le deep learning évolutif avec Spark × Keras × Docker
Création d'un environnement Windows 7 pour une introduction à l'apprentissage automatique avec Python
[Introduction à StyleGAN] J'ai joué avec "The Life of a Man" ♬
J'ai essayé de créer une liste de nombres premiers avec python
L'histoire de la création d'un pilote standard pour db avec python.
Apprentissage automatique avec docker (42) Programmation PyTorch pour l'apprentissage en profondeur par Ian Pointer
Perceptron multi-couches pour le Deep Learning (Deep Learning avec Python; Série MPS Yokohama Deep Learning)
J'ai créé un environnement de développement pour Django 3.0 avec Docker, Docker-compose, Poetry
Résumé des pages utiles pour étudier le framework d'apprentissage profond Chainer