基於TF-IDF,word2vec,LDA等方法對股票概念及概念對應關鍵詞挖掘(一)
A股市場中,股票概念一直是一個奪人眼球的熱點。近一個多月以來雄安新區、信息安全、可燃冰等概念你方唱罷我登場,一時間大資金趨之如鶩,炒作效應十分明顯。對於股票數據提供商來說,如何提供一份精確的概念股名單,以及如何去定義熱點概念以更好地關聯對應概念股票一直沒有一套可靠的程序化流程用以應對。我嘗試利用自然語言處理中一些經典的模型來進行相應需求挖掘。
TF-IDF
求一篇文章中的關鍵詞,一個容易想到的思路,就是找到出現次數最多的詞。如果某個詞很重要,它應該在這篇文章中多次出現。於是,我們進行"詞頻"(Term Frequency,縮寫為TF)統計。
顯而易見的,出現次數最多的詞是----"的"、"是"、"在"----這一類最常用的詞。它們叫做"停用詞"(stop words),表示對找到結果毫無幫助、必須過濾掉的詞。
假設我們把它們都過濾掉了,只考慮剩下的有實際意義的詞。這樣又會遇到了另一個問題,在一篇介紹我國地方債發展史的文章中,我們可能發現"中國"、"發行"、"地方債"這三個詞的出現次數一樣多。這是不是意味著,作為關鍵詞,它們的重要性是一樣的?
顯然不是這樣。因為"中國"是很常見的詞, "發行"次之,而"地方債"不那麼常見。如果這三個詞在一篇文章的出現次數一樣多,有理由認為,"地方債"和"發行"的重要程度要大於"中國",也就是說,在關鍵詞排序上面,"地方債"和"發行"應該排在"中國"的前面。
所以,我們需要一個重要性調整係數,衡量一個詞是不是常見詞。如果某個詞比較少見,但是它在這篇文章中多次出現,那麼它很可能就反映了這篇文章的特性,正是我們所需要的關鍵詞。
用統計學語言表達,就是在詞頻的基礎上,要對每個詞分配一個"重要性"權重。最常見的詞("的"、"是"、"在")給予最小的權重,較常見的詞("中國")給予較小的權重,較少見的詞("地方債"、"發行")給予較大的權重。這個權重叫做"逆文檔頻率"(Inverse Document Frequency,縮寫為IDF),它的大小與一個詞的常見程度成反比。
知道了"詞頻"(TF)和"逆文檔頻率"(IDF)以後,將這兩個值相乘,就得到了一個詞的TF-IDF值。某個詞對文章的重要性越高,它的TF-IDF值就越大。所以,排在最前面的幾個詞,就是這篇文章的關鍵詞。
可以看到,TF-IDF與一個詞在文檔中的出現次數成正比,與該詞在整個語言中的出現次數成反比。
(引自TF-IDF與餘弦相似性的應用(一):自動提取關鍵詞 - 阮一峰的網路日誌)
利用此演算法,我猜想是否可以對抓取到的相應概念文章的每個詞語進行TF-IDF分值計算,對結果進行統計,觀察對應概念的高分值詞語是否可以形成概念關鍵詞。
語料來源於同花順財經搜索引擎問財,從問財的研報搜索入口中,分別輸入人工智慧、雄安新區、鋰電池、共享單車、PPP、二胎、足球、信息安全、互聯網金融(盡量選取了不相關的概念,以防不同概念之間擁有大量交集關鍵詞,影響IDF分數)進行搜索,對應每個概念爬取了大約100篇研報摘要.(使用此方法的關鍵在於,後面統計概念關鍵詞的時候需要用到一個概念標籤,我在這裡默認使用問財引擎搜索到的文章即為該概念相關文章)
語料庫建立完成後,剔除掉所有符號,對整篇文章進行分詞處理,這裡主要用到jieba分詞模塊。另外對於財經類文章的分詞一個難題是文章出現了較多詞庫中不存在的字典,當文章中出現較多字典中不存在的詞語時,分詞效果慘不忍睹。例如,共享單車這一詞語無法分出,而是分成了共享和單車兩個詞。為應對這一不足,引入了ICTCLAS漢語分詞模塊的發現新詞功能(不用ICTCLAS進行分詞的原因是對ICTCLAS字典登錄相關詞後有時仍然不能很好地分出已登錄詞),此外為應對發現ICTCLAS新詞功能力所不逮的情況,加入了一個簡單的方法識別新詞。
對所有分詞結果進行左右兩兩拼接,對左右拼接後的集合降序排列,拿取出現頻率最高的拼接結果去百度百科進行查找,如果這個詞被百度百科所記錄,登錄該詞,Vice Versa。(實際上還可以每三,四,五……個詞拼接一次,基於效率以及實用性考慮沒有寫入代碼里,憑感覺可以靠這個方法識別一些基金的名稱。另外,有時會出現一些詞語沒有被百度百科收錄,導致不能被這種方法識別為新詞。)另外,還可以將搜狗輸入法中的財經、科技、流行語詞庫進行下載後轉換格式導入字典中。Jieba分詞字典可以存在重複項,只要保持字典中的文本為(word frequency)的形式即可。
百度百科發現新詞代碼如下:
b = zip(keykey[0:-1:1], keykey[1::1])
for bc in b:bc = list(bc)bc = bc[0] + bc[1]keykey1.append(bc)dict01 = {}for item in keykey1:dict01.update({item: keykey1.count(item)})l = sorted(dict01.items(), key=lambda d: d[1])
for jj in range(-5, 0):newkey = str(list(l[jj])[0])response1 = urllib2.urlopen(http://baike.baidu.com/item/ + str(list(l[jj])[0]))response1 = response1.read()pattern = <div class="sorryBox">aaa = re.findall(pattern, response1)if aaa:passelse:keywordlist.append(newkey)
(keykey為分詞後的結果list)
在使用ICTCLAS的發現新詞功能中時有時會出現發現的新詞並不是一個詞語,此時要進行一個手動將該詞進行從字典中剔除的工作,否則會影響後續分詞結果。
使用代碼實現後進行統計,對結果只取TF-IDF得分0.1分以上的進入到最後的統計。
標籤為人工智慧的文章出現頻率前5%的詞為人工智慧,公司,智能,行業,同比增長,億元,語音,技術,晶元,實現,應用,安防,產品,上周,機器,教育,科大訊飛,增長,智慧醫療,駕駛,演算法,業務,醫療,板塊,傳導,基礎層,科技巨頭,應用層,雲計算,自動,百度,場景,估值,焊接設備,凈利潤,居前,領域,人工智慧技術,深度學習,數據,營收,漲幅,本周,布局,產業,計算機,技術層,科技,商業化,上年同期。
標籤為雄安新區的文章出現頻率前5%的詞為雄安新區,建設,平方公里,新區,面積,京津冀,治理,河北,環保,區域,設立,白洋淀,雄安,城市,公司,經濟,生態,指數,發展,規劃,建築,綠色,板塊,保定,北京,大氣,河北省,起步區,深圳,漲幅,大氣污染,地區,流域,上周,相關,產能,打造,當地,個股,關注,基礎設施,建材,上漲,污染,園林,證券,城際,發電,鋼鐵。
標籤為鋰電池的文章出現頻率前5%的詞為鋰電池,公司,電池,新能源,產能,動力電池,汽車,材料,補貼,三元,億元,隔膜,銷量,動力,化工,萬噸,行業,正極,同比增長,目錄,基礎,濕法,鋰離子,乘用車,投產,雄安新區,業務,上周,板塊,政策,萬輛,項目,設備,價格,車型,滄州明珠,儲能,增長,實現,客車,上漲,鋰電,價格上漲,密度,能量,凈利潤,磷酸,產品,國軒高科。
其他文章高頻率詞語不再在本文中贅述。
從結果表現看來,詞語集合大體上能夠反映該在一定語境下概念所對應的要點。例如,人工智慧中的詞語集合包含了智慧醫療、深度學習、雲計算、演算法、科大訊飛(人工智慧龍頭股之一)等詞,這些詞代表了人工智慧的一些應用方向以及實現方法。
但是仍有像營收、漲幅、布局這樣的詞出現在了高頻率詞集合中,猜測是語料庫還沒有足夠豐富的原因,導致這些詞擬文檔頻率還沒達到應該所理應達到的數值。
而例如在鋰電池中出現雄安新區作為高頻率詞語的原因猜測為通過問財引擎搜索出的研報摘要並不一定恰好是介紹某個概念或某個概念對應股票。研報的分類包括個股研報、行業研報、策略報告(如周報、晨報等),如果鋰電池現在某篇周報的標題中,可能就錯誤地將本篇文章歸類為鋰電池概念研報,而實際情況可能是研報的主題為《主題策略周報:從三條主線挖掘白馬成長,重點關注蘋果產業鏈、鋰電池和OLED材料》,這樣的情況下,TF-IDF高分詞可能會出現與OLED材料、蘋果產業鏈相關的詞語。
另外,在出現頻率未達到前5%但TF-IDF分數達到0.1以上的詞語中,包含了計算機視覺、無人駕駛、人臉識別、智能駕駛、機器視覺、神經網路這樣一眼可見與人工智慧高度相關的詞語。
總結下來,TF-IDF的優點在於:演算法簡單,利於實現以及理解,對於結果大體上可以接受,對於發現概念的關鍵詞有一定的作用。
缺點在於:需要對所辨析的文章打上一個標籤才能對結果進行分析、標籤的正確與否非常影響結果。統計出的結果仍然需要進行判斷是否為概念關鍵詞,高分高頻率詞仍然有可能與概念並不相關,而高分低頻率詞可能與概念高度相關,但是在語料庫中被提及的次數不多而被忽略。後期需要與其他方法結合來找出真正的關鍵詞
後續我將會利用word2vec、LDA等方法繼續相關方面探索。
推薦閱讀: