本文共三個部分:
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])
總的說來就是,分别統計所有卡牌出現的次數,以及互相之間共同出現的次數。如果兩個卡牌共同出現次數多并且分别與其自身出現次數接近,那麼其相關度就高。
這裡對公式做出了些修改,因為有些出現次數高,但共同出現次數低的兩張卡牌,其計算出的互資訊就是負的,這其實有點違背爐石構牌原則,即總是會選相關的、或能完善套牌建構的。
修改後的公式:
,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
- 參考1:一種基于成分的句子相似度計算
- 參考2:NLP︱句子級、詞語級以及句子-詞語之間相似性(相關名稱:文檔特征、詞特征、詞權重)
- 參考3:資料挖掘筆記-情感傾向點互資訊算法
- 參考4:詞語間相關度計算算法
下一章,我用python玩爐石傳說(3)-----爐石卡牌套牌自動建構算法