本文共三个部分:
1,我用python玩炉石传说(1)-----炉石卡牌相关度分析的手动打分器
2,我用python玩炉石传说(2)-----炉石卡牌套牌爬取器及自动分析卡牌相关度
3,我用python玩炉石传说(3)-----炉石卡牌套牌自动构建算法
引言:
第一章中做了个手动打分器,但工作量太大所以想到用大量的套牌数据来分析卡牌相关度。核心思想是,如果两张卡牌的相关越高那么这两张卡牌共同出现在一个套牌deck里的概率就越高。类似与nlp中词相关度[参考1][参考2]。
一,套牌爬取
hearthpwn/hearth.py
爬取目标网站www.hearthpwn.com/decks ,这个网站有相当多的玩家组建套牌。
爬虫程序抄取得这位大佬的https://github.com/waymanglover/hearthstats,自己做了些改动(代码下方)。
爬取下来大概500多份的卡组信息。
二,数据清洗
relatanalysis.py
爬取下来的卡组不能直接使用,因为观察发现有许多套牌重复性很高,另外有些套牌只有几张不够30。
所以,需要做一步套牌相关性分析。
这里借鉴NLP中语句相关性判断方法,最简单的方法。如果两个句子里,共同出现的词越多,那两个句子相关度越高。[参考1]

def decksrelat(self, threshold=0.8):
print('all orign decks:', len(self.iddecks))
filter_decks = []
for n, i in enumerate(self.iddecks[:-1]):
for j in self.iddecks[n+1:]:
relaty = word_sim(i, j)
if relaty > threshold:
if len(i) <= len(j):
i = False
break
if i:
filter_decks.append(i)
print('now all decks:', len(filter_decks))
self.iddecks = filter_decks
遍历所有卡组,去除相关度超过0.8的,对两个相似的卡组,保留所用卡牌种类多的。
三,分析卡牌相关度
relatanalysis.py
本节为重点,重点是怎么分析卡片之间的相关程度及算法。这里还是参考了,NLP方案中的,点互信息算法[参考2][参考3]。
点间互信息(PMI)主要用于计算词语间的语义相似度,基本思想是统计两个词语在文本中同时出现的概率,如果概率越大,其相关性就越紧密,关联度越高。两个词语word1与word2的PMI值计算公式如下式所示为:
P(word1&word2)表示两个词语word1与word2共同出现的概率,即word1与word2共同出现的文档数, P(word1)与P(word2)分别表示两个词语单独出现的概率,即word出现的文档数。若两个词语在数据集的某个小范围内共现概率越大,表明其关联度越大;反之,关联度越小。P(word1&word2)与P(word1)P(word2)的比值是word1与word2两个词语的统计独立性度量。其值可以转化为3 种状态:
P(word1&word2) > 0;两个词语是相关的;值越大,相关性越强。
P(word1&word2) = 0;两个词语是统计独立的,不相关也不互斥。
P(word1&word2) < 0;两个词语是不相关的,互斥的。(以上点间互信息介绍复制粘贴自[参考3])
总的说来就是,分别统计所有卡牌出现的次数,以及相互之间共同出现的次数。如果两个卡牌共同出现次数多并且分别与其自身出现次数接近,那么其相关度就高。
这里对公式做出了些修改,因为有些出现次数高,但共同出现次数低的两张卡牌,其计算出的互信息就是负的,这其实有点违背炉石构牌原则,即总是会选相关的、或能完善套牌构建的。
修改后的公式: ,Nab为AB卡牌共同出现在一个套牌里次数,Na表示A牌出现次数(这里注意,卡牌可以选两张,但计算时只考虑一张)
def easycorr(count_matrix, cards_num):
for i in range(cards_num):
for j in range(cards_num):
if i == j:
continue
if count_matrix[i, i] < 1.0 or count_matrix[j, j] < 1.0:
continue
count_matrix[i, j] = count_matrix[i, j] / (count_matrix[i, i] + count_matrix[j, j] - count_matrix[i, j])
以下是分析效果,通过第一章的QT界面显示出来效果

算法还是工作的比较好的
代码链接:https://github.com/GladosAI/hearthstone-card-correlation-analys
下一章,我用python玩炉石传说(3)-----炉石卡牌套牌自动构建算法