我用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]
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)-----炉石卡牌套牌爬取器及自动分析卡牌相关度相关推荐
- 炉石传说 java_炉石传说 java实现
试题编号: 201609-3 试题名称:炉石传说 时间限制:1.0s 内存限制:256.0MB 问题描述: 问题描述 <炉石传说:魔兽英雄传>(Hearthstone: Heroes of ...
- 炉石传说服务器维护有补偿吗,炉石传说维护(炉石传说维护公告全文及具体补偿方案 炉石数据回档怎么补偿?)...
炉石传说维护(炉石传说维护公告全文及具体补偿方案 炉石数据回档怎么补偿?),哪吒游戏网给大家带来详细的炉石传说维护(炉石传说维护公告全文及具体补偿方案 炉石数据回档怎么补偿?)介绍,大家可以阅读一下, ...
- Python爬虫: 单网页 所有静态网页 动态网页爬取
Python爬虫: 单网页 所有静态网页 动态网页爬取 前言:所有页代码主干均来自网上!!!感谢大佬们. 其实我对爬虫还挺感兴趣的,因为我玩instagram(需要科学上网),上过IG的人都知道IG虽 ...
- Python爬虫入门教程 26-100 知乎文章图片爬取器之二
1. 知乎文章图片爬取器之二博客背景 昨天写了知乎文章图片爬取器的一部分代码,针对知乎问题的答案json进行了数据抓取,博客中出现了部分写死的内容,今天把那部分信息调整完毕,并且将图片下载完善到代码中 ...
- python实现微信hook_GitHub - gemgin/wechathook: 借助微信hook,拦截修改某些call,填充进我们的Python代码,进行微信公众号文章的爬取...
wechathook 借助微信hook,拦截修改某些call,填充进我们的Python代码,进行微信公众号文章的爬取 注入器 注入dll进程序中 DLL 实现hook功能,申请内存,修改call,在里 ...
- python实现微信hook_GitHub - redtips/wechathook: 借助微信hook,拦截修改某些call,填充进我们的Python代码,进行微信公众号文章的爬取...
wechathook 借助微信hook,拦截修改某些call,填充进我们的Python代码,进行微信公众号文章的爬取 注入器 注入dll进程序中 DLL 实现hook功能,申请内存,修改call,在里 ...
- python实现微信hook_GitHub - zhouxionger/wechathook: 借助微信hook,拦截修改某些call,填充进我们的Python代码,进行微信公众号文章的爬取...
wechathook 借助微信hook,拦截修改某些call,填充进我们的Python代码,进行微信公众号文章的爬取 注入器 注入dll进程序中 DLL 实现hook功能,申请内存,修改call,在里 ...
- python hook微信_GitHub - 15993248973/wechathook: 借助微信hook,拦截修改某些call,填充进我们的Python代码,进行微信公众号文章的爬取...
wechathook 借助微信hook,拦截修改某些call,填充进我们的Python代码,进行微信公众号文章的爬取 注入器 注入dll进程序中 DLL 实现hook功能,申请内存,修改call,在里 ...
- hook微信 python_GitHub - zkqiang/wechathook: 借助微信hook,拦截修改某些call,填充进我们的Python代码,进行微信公众号文章的爬取...
wechathook 借助微信hook,拦截修改某些call,填充进我们的Python代码,进行微信公众号文章的爬取 注入器 注入dll进程序中 DLL 实现hook功能,申请内存,修改call,在里 ...
最新文章
- Maya游戏角色绑定入门学习教程 Game Character Rigging for Beginners in Maya
- ML基石_4_FeasibilityOfLearning
- 互联网项目管理要点(转)
- mysql myasam_MySQL锁(MyISAM和InnoDB)
- 用 C 语言开发一门编程语言 — 语法解析器
- 026_JavaScript数组排序
- jdk 1.8 字符串+_JDK 9/10/11:Java字符串上+ =的副作用
- SpringMVC之RequestHeader注解与CookieValue注解详解
- Sql Server系列:开发存储过程
- TCP/IP协议与Http协议的区别
- 洛谷oj---P1030 求先序排列
- Linux必会100个命令(八)ps、top、netstat
- BZOJ - 4516: [Sdoi2016]生成魔咒
- java18天map和线程
- vue上传图片文件到腾讯COS
- 高德地图——地图渲染及关键字搜索POI功能vue2/web端
- php记录上次观看记录,PHP 记录用户访问记录
- 北航计算机学院硕士培养方案,北航硕士研究生培养方案.doc
- MATLAB与FPGA数字信号处理(数字滤波器设计)、数字IC、无线通信、图像处理、信道编码系列
- Opencv+Zbar二维码识别(标准条形码/二维码识别)
热门文章
- Codeforces Round #262 (Div. 2) 460C. Present(二分)
- 自定义MessageBox消息图标
- html5 图片hover,关于html5:两种纯CSS方式实现hover图片popout弹出效果
- Windows查看电脑的IP地址
- 本地网站无服务器,0基础,无需域名服务器,手把手教你搭建本地电脑的影视播放网站...
- 计算机图形学(1)-向量-坐标系
- SRAM和DRAM的比较
- C++ QT 读写EXCEL表格基操
- 这3款音频转文字软件,让你轻松整理各种音频内容
- 【python 获取时间】