我用python玩炉石传说(2)-----炉石卡牌套牌爬取器及自动分析卡牌相关度

本文共三个部分:

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]

摘选自【参考一】
图片摘选自 参考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])   

总的说来就是,分别统计所有卡牌出现的次数,以及相互之间共同出现的次数。如果两个卡牌共同出现次数多并且分别与其自身出现次数接近,那么其相关度就高。

这里对公式做出了些修改,因为有些出现次数高,但共同出现次数低的两张卡牌,其计算出的互信息就是负的,这其实有点违背炉石构牌原则,即总是会选相关的、或能完善套牌构建的。

修改后的公式:CorrAB=\frac{Nab}{Na+Nb-Nab}  ,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)-----炉石卡牌套牌自动构建算法

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值