天天看點

我用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]

我用python玩爐石傳說(2)-----爐石卡牌套牌爬取器及自動分析卡牌相關度

圖檔摘選自 參考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值計算公式如下式所示為:

我用python玩爐石傳說(2)-----爐石卡牌套牌爬取器及自動分析卡牌相關度

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])   

總的說來就是,分别統計所有卡牌出現的次數,以及互相之間共同出現的次數。如果兩個卡牌共同出現次數多并且分别與其自身出現次數接近,那麼其相關度就高。

這裡對公式做出了些修改,因為有些出現次數高,但共同出現次數低的兩張卡牌,其計算出的互資訊就是負的,這其實有點違背爐石構牌原則,即總是會選相關的、或能完善套牌建構的。

修改後的公式:

我用python玩爐石傳說(2)-----爐石卡牌套牌爬取器及自動分析卡牌相關度

  ,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界面顯示出來效果

我用python玩爐石傳說(2)-----爐石卡牌套牌爬取器及自動分析卡牌相關度

上圖表示,左欄選中虛空分析師,右欄為其相關度從高到低的排序标題

算法還是工作的比較好的

代碼連結:https://github.com/GladosAI/hearthstone-card-correlation-analys

  • 參考1:一種基于成分的句子相似度計算
  • 參考2:NLP︱句子級、詞語級以及句子-詞語之間相似性(相關名稱:文檔特征、詞特征、詞權重)
  • 參考3:資料挖掘筆記-情感傾向點互資訊算法
  • 參考4:詞語間相關度計算算法

下一章,我用python玩爐石傳說(3)-----爐石卡牌套牌自動建構算法