這是4個月前做的。受當時的知識水平的限制,還沒有接觸到機器學習和相關理論,記錄一下作為以後備查。當然,如果你想看源碼和資料,點擊我。從結項到現在,博主一直在使用機器學習並結合相關論文進行情感極性分析(源碼點我),效果遠遠好於本篇代碼的效果。
但是,本篇的數據處理和特徵選擇還是很有意義的,特此記錄。
摘要
當今社會媒體的發展導致了金融輿論數據的爆炸式增長。因此,針對金融輿論數據的情感分析受到廣大股民和金融公司的熱切關注。目前,情感分析應用主要分為兩種:基於詞彙的方法和機器學習方法。當然,它們都面臨著獲取大量人類標記訓練數據和語料的挑戰。我提出一種基於詞彙的針對金融數據情感分析的方法:將一篇短文本劃分為不同的部分並給予不同的權重,再以詞彙為基本顆粒進行分數計算;同時,在已有的權威字典的基礎上,針對性的添加或修改金融方面的詞彙,並且使用N-Gram方法來進行新詞的挖掘,最終獲得更好的性能。
1. 介紹
近年來,隨著Web的發展,金融輿論的數據呈現爆炸式的增長,如何從海量數據中發現有用的信息並且得到對應的模型成為許多公司和企業關注的焦點。
誠然,目前沒有一種模型可以含括所有的領域,也沒有一種字典囊括不同領域的術語。
emotionOfWord.png
根據需求,我們將精力放在了金融領域,並且採集了不同來源的高質量的數據集。同時,我們對一個包含大多數領域的字典進行了修改,添加和修改了金融方面的專業詞彙。由於金融數據的直觀性、簡潔性特點,我們忽略了詞彙之前的同義、反義等複雜關係,講更多的精力投入在對於極性的確定和極性程度的判定方面。在此基礎上,設計了一個實用的衡量金融文本感情的算法模型。
2. 數據準備
2.1 數據來源
數據的獲取來自不同的平臺,平臺主要為以下幾個:
香港上市公司的年報和半年報
香港線上金融媒體的新聞報告
海外金融數據
各大金融論壇的帖子
社交平臺的金融大V的動態
需要聲明的是,算法模型是以最具有代表性的香港線上金融媒體的新聞報告為基礎進行測試和訓練的,在此基礎上推廣到其他平臺的文本。
2.2 數據清洗
為了保留新聞媒體對於關鍵詞的標註,在數據採集的時候保留了相應的網頁標籤和繁體風格。之後的檢查工作中發現網頁的標籤的用處可以忽略不計,因此將原來的網頁文本清洗成了簡體無標籤的文本形式。
cleanNews.png
正如上圖所示,考慮到之後使用的是簡體中文字典,因此需要將原始文本進行相應的轉換。轉換後的文本存儲在MySQL和電腦的文本格式文件中。
3. 詞典
3.1 詞典來源
因為算法模型是基於詞彙的情感分析,所以字典的準確性和靈活度對於結果的影響至關重要。字典來自知網的情感詞庫,原始字典按照習慣將詞彙分為三大類:
情感詞
程度詞:從最重的most程度依次降低到least程度,共5個等級。
否定詞
基於以上特點,否定詞的存在可以用來判別是否進行詞彙的極性反轉,程度詞的存在可以給予不同的情感詞不同的分數,而情感詞可以整合成積極詞和消極詞兩部分。基於知網詞庫的以上特點,將此詞庫選做基本的情感詞典。
3.2 詞典的數據類型
emotionDict.png
為了讓後期的程序更好的調用詞典,並且讓其他人員更容易的修改詞典,將文本txt格式的詞典按照分類不同放在不同命名的列表中,使得對應的邏輯更直觀,方便其他程序調用。
3.3 詞典的修改
由於知網的詞典是針對所有的領域,因此在金融領域詞彙的劃分上不免有失偏頗,前期我採用人工的方法對詞典的三大分類進行了略微調整。調整如下:
在積極詞(pos_emotion)中刪除了
要,用,開通,需,向,應,欲,通,深,對,會,長,常,上,經濟,主要,紅,幽,靈,穎,硬,不變,是,明顯,約,剛,剛剛,到,事實上,基,基部,基礎,基礎性,固,固定,可樂,謹,主導,自行
,增加了'堅挺','新高','利好','放寬','提升','看好','優於','高於','扭轉','買超','強勁','反彈','增','緩解','微升','划算','升高','進展','上升','落實','漲','回升','高開','上漲'
。在消極詞(neg_emotion)中刪除了
大,怊,慳,悱,憒,勝,偏
,增加了'倒退','下試','不利因素','緊縮','勸退','乏力','齊挫','貿易矛盾','矛盾','拖累','回落','負債','跌','跳水','雞肋','沙塵暴','陰霾','錢荒','壓力','貶值','利淡','下降','造淡','極端','欠佳','走低','急跌','重挫','周跌','月跌','連跌','背馳','縮減','妨礙','強拆','批評','故障','致歉','減速','減弱','惡化','下滑','嚴重','急轉直下','灰飛煙滅','偏軟','醜聞','貪汙','倒退','急挫','挫','低見','跌','衝擊','大跌','涉嫌','虧損','下跌','紀律處分','處分','赤字','縮水','打擊','開門黑','降低','追討','違法','警告','陰影','變數','不佳','落幕','違法行為','違約金','欺詐','隱患','暴跌','跌穿','受壓','連累'
在否定詞中刪除了
偏
,增加了'無','不','不是'
在程度詞中增加了
'百分之百','非常','重大',"大幅",'半點','小幅'
3.4 命名實體的添加
由於分詞采用的是第三方Jieba詞庫[1],為了改善分詞情況,對於金融領域常見的命名實體,例如:美聯儲(金融機構)、吉利汽車(公司/企業)、港股(股票)等進行了添加,以此來減少分詞的錯誤率,提高算法準確度。
4. 情感分詞算法
4.1 文本分塊
一篇文本,通常由不同的部分的組成,而每個部分的重要程度不同。對於一篇金融新聞,在文本長度足夠的情況下,給定'FORWARD_NUM'
,'BACKWARD_NUM'
這兩個參數,分別代表[0:FORWARD_NUM]句和[BACKWARD_NUM-1:]句。這兩部分分數的權重(Weight)相比於中間部分[FORWARD_NUM:BACKWARD_NUM]的權重更高。
當然,當一篇文本過短時,我們認為它不夠足夠長來進行分塊,即[0:FORWARD_NUM]∩[BACKWARD_NUM-1:]≠∅,此時將忽視'FORWARD_NUM'
,'BACKWARD_NUM'
這兩個參數,全文采用統一權重來計算分數。
為了減少首尾權重(Weight)對於文本整體的影響過大,以至於算法忽略文本[FORWARD_NUM:BACKWARD_NUM]部分的分數,我們將首尾的部分得出的分數乘以對應的頻率,即:
mathScore.png
公式:用於[0:FORWARD_NUM]和[BACKWARD_NUM-1:]兩部分。其中s對應每部分積極或消極情感分數,p對應每部分積極詞或消極詞的頻率,w是每部分的權重。
4.2 積極詞/消極詞
對於中文(無邊界語言)劃分詞語,考慮到速度和第三方庫的發現新詞能力,我們使用了jieba分詞庫。將文本中的積極詞和消極詞結合詞典挑選出來,並且每個給予一個分數,在此基礎上,我們進行極性反轉和程度詞的發現。
4.2.1 極性反轉
詞語的極性不一定只由本身決定,一些否定詞的使用會讓詞語的極性反轉。考慮以下兩種最常見的情況(''號代表jieba詞庫的分詞結果):
不是不好
不是很不好
因此可以發現需要在詞語的位置向前搜索1或2個位置,來查找否定詞,然後進行極性反轉。
4.2.2 程度詞搜索
對於不同的情感詞,每個情感詞的分數絕對值的大小取決於程度詞。因此類似於極性反轉,程度詞的搜索採取相同的模式,這裡,我們也考慮兩種常見的情況(''號代表jieba詞庫的分詞結果):
非常 不 好吃
不是 很 好吃
由此可見,程度詞的出現位置和否定詞相似。同樣的,我們在詞彙的位置處向前搜索1或2個位置,根據程度詞的程度大小,對分數乘以不同的係數。
4.2.3 公式計算
因此,之前的公式右式中的(i)可以寫成下面的格式:
mathWordScore.png
公式:-1的指數t取決於是否極性反轉,k代表的是程度詞的程度,word(j)是每個詞的原始分數。
4.3 基於程度詞頻的優化
實際運行過程中,我發現程序的時間很長,尤其是針對長文本的時候。究其原因,是在之前的極性反轉和程度詞的判斷中,為了窮盡常見的情況,子分支的判斷語句非常多。為了減少程序在子分支語句方面判斷的時間損耗,採用赫夫曼樹[2]的優化思想:將'if-else'
理解成二叉樹,由於不同的程度詞在日常語言中出現的頻率是不同的,因此,可以將'more_degree'
和'ish_degree'
首先判斷,再依次判斷'very_degree'
、'most_degree'
和'least_degree'
,來達到樹的加權路徑最小的目的,實現對算法性能的優化。
4.4 首尾權重的調優
在第一個公式中,針對首尾兩部分的情感分數的計算是有參數'weight'
。這裡我挑選了2017年5月份第一個交易周的所有樣本進行了人工新聞情感的標註。在此基礎上,設置'weight'
的調整步長為0.1,從1開始,以(1,5]為區間,計算每個'weight'
的得到的準確度,來選出最優的'weight'
參數。
weightRate.png
從圖中顯而易見的看到,正確率最高是89.55%,對應的權重是1.4103。因此,我們將權重設置為1.4103。
4.5 分數界線的確定
在實際的測試過程中,我發現一些情況下,當分數過大的時候,結果往往是不準確的。比如有些時候分數達到
驚人的40多分,文本信息容量過大,不能簡單說其是積極或消極或中性的。為了解決這一難題,首先忽略分數的符號,即:取分數的絕對值(|score|
);然後選取以測試樣本最多和時間最靠近的2016上半年,統計分數的在上半年的情況。結果如下圖所示。
scoreScatterDistribution.png
容易發現,150分以上的分數出現的概率非常小(樣本容量17710)。因此,我們在之後的分析中,針對這個算法模型得出的分數,專門檢查150分數以上對應的新聞,由此來確定突發情況或者識別無用的新聞。在此基礎上,我又選取了2016年全年的新聞分數,並且做出了相應的頻率分佈直方圖。
scoreHistDistribution.png
這裡,沒有忽略正負值,從圖形的面積可以發現,在一個年度中,新聞報道積極情感居多。而在分數的最大值區間,基本同2016上半年的情況。
5. 致謝
感謝各位師兄師姐過程中的指點和幫助O(∩_∩)O~。
[1]:Jieba詞庫的學習和介紹
url: https://yq.aliyun.com/articles/26040
[2]:赫夫曼樹的思想和構建
url: https://baike.baidu.com/item/%E5%93%88%E5%A4%AB%E6%9B%BC%E6%A0%91/2305769?fr=aladdin
[3]:參考《Automatic domain-specific sentiment lexicon generation with label propagation》