本文共三个部分:

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 = Falsebreakif 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:continueif count_matrix[i, i] < 1.0 or count_matrix[j, j] < 1.0:continuecount_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

  • 参考1:一种基于成分的句子相似度计算
  • 参考2:NLP︱句子级、词语级以及句子-词语之间相似性(相关名称:文档特征、词特征、词权重)
  • 参考3:数据挖掘笔记-情感倾向点互信息算法
  • 参考4:词语间相关度计算算法

下一章,我用python玩炉石传说(3)-----炉石卡牌套牌自动构建算法

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

  1. 炉石传说 java_炉石传说 java实现

    试题编号: 201609-3 试题名称:炉石传说 时间限制:1.0s 内存限制:256.0MB 问题描述: 问题描述 <炉石传说:魔兽英雄传>(Hearthstone: Heroes of ...

  2. 炉石传说服务器维护有补偿吗,炉石传说维护(炉石传说维护公告全文及具体补偿方案 炉石数据回档怎么补偿?)...

    炉石传说维护(炉石传说维护公告全文及具体补偿方案 炉石数据回档怎么补偿?),哪吒游戏网给大家带来详细的炉石传说维护(炉石传说维护公告全文及具体补偿方案 炉石数据回档怎么补偿?)介绍,大家可以阅读一下, ...

  3. Python爬虫: 单网页 所有静态网页 动态网页爬取

    Python爬虫: 单网页 所有静态网页 动态网页爬取 前言:所有页代码主干均来自网上!!!感谢大佬们. 其实我对爬虫还挺感兴趣的,因为我玩instagram(需要科学上网),上过IG的人都知道IG虽 ...

  4. Python爬虫入门教程 26-100 知乎文章图片爬取器之二

    1. 知乎文章图片爬取器之二博客背景 昨天写了知乎文章图片爬取器的一部分代码,针对知乎问题的答案json进行了数据抓取,博客中出现了部分写死的内容,今天把那部分信息调整完毕,并且将图片下载完善到代码中 ...

  5. python实现微信hook_GitHub - gemgin/wechathook: 借助微信hook,拦截修改某些call,填充进我们的Python代码,进行微信公众号文章的爬取...

    wechathook 借助微信hook,拦截修改某些call,填充进我们的Python代码,进行微信公众号文章的爬取 注入器 注入dll进程序中 DLL 实现hook功能,申请内存,修改call,在里 ...

  6. python实现微信hook_GitHub - redtips/wechathook: 借助微信hook,拦截修改某些call,填充进我们的Python代码,进行微信公众号文章的爬取...

    wechathook 借助微信hook,拦截修改某些call,填充进我们的Python代码,进行微信公众号文章的爬取 注入器 注入dll进程序中 DLL 实现hook功能,申请内存,修改call,在里 ...

  7. python实现微信hook_GitHub - zhouxionger/wechathook: 借助微信hook,拦截修改某些call,填充进我们的Python代码,进行微信公众号文章的爬取...

    wechathook 借助微信hook,拦截修改某些call,填充进我们的Python代码,进行微信公众号文章的爬取 注入器 注入dll进程序中 DLL 实现hook功能,申请内存,修改call,在里 ...

  8. python hook微信_GitHub - 15993248973/wechathook: 借助微信hook,拦截修改某些call,填充进我们的Python代码,进行微信公众号文章的爬取...

    wechathook 借助微信hook,拦截修改某些call,填充进我们的Python代码,进行微信公众号文章的爬取 注入器 注入dll进程序中 DLL 实现hook功能,申请内存,修改call,在里 ...

  9. hook微信 python_GitHub - zkqiang/wechathook: 借助微信hook,拦截修改某些call,填充进我们的Python代码,进行微信公众号文章的爬取...

    wechathook 借助微信hook,拦截修改某些call,填充进我们的Python代码,进行微信公众号文章的爬取 注入器 注入dll进程序中 DLL 实现hook功能,申请内存,修改call,在里 ...

最新文章

  1. Maya游戏角色绑定入门学习教程 Game Character Rigging for Beginners in Maya
  2. ML基石_4_FeasibilityOfLearning
  3. 互联网项目管理要点(转)
  4. mysql myasam_MySQL锁(MyISAM和InnoDB)
  5. 用 C 语言开发一门编程语言 — 语法解析器
  6. 026_JavaScript数组排序
  7. jdk 1.8 字符串+_JDK 9/10/11:Java字符串上+ =的副作用
  8. SpringMVC之RequestHeader注解与CookieValue注解详解
  9. Sql Server系列:开发存储过程
  10. TCP/IP协议与Http协议的区别
  11. 洛谷oj---P1030 求先序排列
  12. Linux必会100个命令(八)ps、top、netstat
  13. BZOJ - 4516: [Sdoi2016]生成魔咒
  14. java18天map和线程
  15. vue上传图片文件到腾讯COS
  16. 高德地图——地图渲染及关键字搜索POI功能vue2/web端
  17. php记录上次观看记录,PHP 记录用户访问记录
  18. 北航计算机学院硕士培养方案,北航硕士研究生培养方案.doc
  19. MATLAB与FPGA数字信号处理(数字滤波器设计)、数字IC、无线通信、图像处理、信道编码系列
  20. Opencv+Zbar二维码识别(标准条形码/二维码识别)

热门文章

  1. Codeforces Round #262 (Div. 2) 460C. Present(二分)
  2. 自定义MessageBox消息图标
  3. html5 图片hover,关于html5:两种纯CSS方式实现hover图片popout弹出效果
  4. Windows查看电脑的IP地址
  5. 本地网站无服务器,0基础,无需域名服务器,手把手教你搭建本地电脑的影视播放网站...
  6. 计算机图形学(1)-向量-坐标系
  7. SRAM和DRAM的比较
  8. C++ QT 读写EXCEL表格基操
  9. 这3款音频转文字软件,让你轻松整理各种音频内容
  10. 【python 获取时间】