版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
北京理工大學(xué)珠海學(xué)院2016屆本科生畢業(yè)設(shè)計基于機器學(xué)習(xí)的情緒分析研究——智能模型設(shè)計和實現(xiàn)基于機器學(xué)習(xí)的情緒分析研究——智能模型設(shè)計和實現(xiàn)摘要互聯(lián)網(wǎng)技術(shù)的迅速發(fā)展使得社交平臺逐漸成為熱點事件中社會情感的樞紐。社會熱點事件的輿論監(jiān)管的其中一個重要環(huán)節(jié)就是能夠準(zhǔn)確分析民眾的社會情緒。本文旨在探索可以基于文本大數(shù)據(jù)徹底分析民眾對熱點事件的社會情緒的模型和方法。先是從社交平臺上借助文本大數(shù)據(jù)、對數(shù)據(jù)進行提前處理以及用python自然語言處理包等方法建立能夠分析社會情緒的模型,其次找到最佳的機器學(xué)習(xí)算法,再次用機器學(xué)習(xí)的方法對模型進行訓(xùn)練,獲得一個情感分類器。最后用熱點事件“冠狀病毒”的真實數(shù)據(jù)在情感分類器上進行社會情緒分析驗證,證明了模型和方法的有效性。
關(guān)鍵詞:網(wǎng)絡(luò)文本大數(shù)據(jù);機器學(xué)習(xí);情緒分類器;社會情緒分析;Researchonemotionanalysisbasedonmachinelearning——DesignandimplementationofintelligentmodelAbstractTherapiddevelopmentofInternettechnologymakessocialplatformsgraduallybecomethehubofsocialemotioninhotevents.Oneoftheimportantaspectsofpublicopinionsupervisionofsocialhoteventsistheabilitytoaccuratelyanalyzethepublic'ssocialsentiment.Thispaperaimstoexplorethemodelandmethodthatcanthoroughlyanalysethepeople’ssocialemotionsofhoteventsbasedontextbigdata.Firstly,thewriterbuiltupthemodelofsocialemotionsanalysisbyvirtueoftextbigdatafromthesocialplatforms,datapreprocessingandtheuseofPythonNaturalLangugeToolkitandsoon.Secondly,utilizedthebestmachinelearningalgorithmandthentrainedthemodelbymachinelearningmethodtoobtainanemotionclassifier.Finally,therealdataofthehotevent"coronavirus"wasusedtoanalyzethesocialemotionsontheemotionclassifier,whichprovedthevalidityofthemodelandmethod.Keywords:Webtextbigdata、machinelearning、sentimentclassifier、socialsentimentanalysis;目錄TOC\o"1-3"\h\u10113誠信承諾書 前言:1.1設(shè)計目的及意義近來,社交媒體和電子商務(wù)平臺發(fā)展迅速,Twitter、微博、MSN、微信等社交網(wǎng)絡(luò)正逐漸地改變著人們的生活,越來越多的人習(xí)慣于通過網(wǎng)絡(luò)平臺表達自己的態(tài)度和情感,這些網(wǎng)絡(luò)文本是客戶流露的真實情感。對網(wǎng)絡(luò)文本大數(shù)據(jù)熱門事件的情緒進行分析可以使人們獲得更多關(guān)于內(nèi)心世界的知識,因此,從這些文本信息中自動準(zhǔn)確的識別客戶的情感類別,對政府輿情監(jiān)控、企業(yè)管理與決策來說是一個很大的支持,它也成為學(xué)術(shù)界近來持續(xù)關(guān)注的研究熱點,同時極大地促進了情緒分析技術(shù)的發(fā)展。1.2本課題國內(nèi)外現(xiàn)狀及存在問題文本情感分析也可以說是挖掘文本意見的方法。簡而言之,它是分析,處理,總結(jié)和推斷具有情感色彩的主觀文本的過程[1]。目前海內(nèi)外關(guān)于文本情緒分析研究的方向主要有兩個:一個是判斷主觀信息的細粒度,另一個是判斷文本的主客觀性。前者強調(diào)將情感詞作為中心去分析文本級的情緒傾向,而文本的情緒傾向是通過貶值情感詞的線性加權(quán)值來實現(xiàn)的。熊德蘭等人[2]基于HowNet語義詞典中詞匯語義相似度的計算方法。意在基于語義詞典,充分想到詞語組成在一起之后語義可能改變,直接影響到情感褒貶判斷的偏向結(jié)果,于是用各個詞語義進行權(quán)重計算結(jié)果來判斷從而避免受影響。該方式基于語義詞集,能很精確地預(yù)測情感傾向,但缺點是操作起來復(fù)雜且在很大程度上取決于詞匯層次分類算法的精確度。則此方法顯然對大量的文本數(shù)據(jù)處理是不合適。為了處理大量數(shù)據(jù),研究人員介紹了用于情感分析的機器學(xué)習(xí)方法,例如K最近鄰,最大熵模型,樸素貝葉斯和支持向量機(SVM)方法[3]。雖然以語義詞集為基礎(chǔ)的語義加權(quán)分類效果比機器學(xué)習(xí)方法較好,但勝在后者能夠更輕易地去分析處理大量的文本數(shù)據(jù)。例如徐軍等人[4]利用機器學(xué)習(xí)方法對新聞評論進行情感分類,在最理想的數(shù)據(jù)集上分類準(zhǔn)確率可以達到90%,然而這種方法缺乏語義分析,容易產(chǎn)生向量空間模型數(shù)據(jù)稀疏問題,對于中文文本處理中普遍存在的一詞多義和多詞一義問題也不能解決。聞彬等人[5]在情感詞識別中引人情感語義概念,基于語義理解來進行文本情感分類,可在一定程度上緩解一詞多義和多詞一義引起的分類準(zhǔn)確率不高的問題,它的不足之處在于只考慮到詞語語義層副詞的出現(xiàn)規(guī)律對詞語語義的作用,忽略了整個文本語境對詞語語義的影響。一些研究者[6]通過已有文本規(guī)則,充分考慮用文本的語法結(jié)構(gòu)去預(yù)測文本情緒傾向。但是不得不說該方式的實用性差、工藝復(fù)雜且難以推廣。也有部分研究者嘗試借助非標(biāo)注樣本不斷訓(xùn)練分類器的方法來提高半監(jiān)督學(xué)習(xí)方法的情感分類準(zhǔn)確率,實驗證明該方法是有效的[7]。還有謝麗星等[8]提出了一種基于SVM的層次結(jié)構(gòu)多策略中文微博情感分析方法;劉寶芹等[9]在將情緒類別組織成三層樹狀結(jié)構(gòu)后,采用樸素貝葉斯分類模型對中文微博進行多層次的情緒分析;歐陽純萍等[10]提出多策略中文微博細粒度情緒分析方法,采用SVM和KNN算法對微博進行細粒度情緒分析;雷龍艷等[11]在對微博進行文本特征表示的基礎(chǔ)上,采用SVN和KNN算法對微博進行細粒度情緒分析。等等這些國內(nèi)外的文本情感分類方法研究,對本設(shè)計的方法選擇與優(yōu)化都提供了一定的幫助。1.3本設(shè)計應(yīng)解決的主要問題接下來Twitter數(shù)據(jù)將作為我們今天的實戰(zhàn)項目用于情緒分析。由于采用了機器學(xué)習(xí),我們主要解決以下問題:從Twitter上獲取適量文本數(shù)據(jù);對文本數(shù)據(jù)進行必要的預(yù)處理;標(biāo)住類標(biāo)簽,分割開發(fā)集和測試集數(shù)據(jù);對預(yù)處理后的數(shù)據(jù)進行特征提取與向量加權(quán);訓(xùn)練模型,調(diào)整參數(shù),評估模型;用測試集進行測試驗證情緒分析的準(zhǔn)確率;2設(shè)計過程2.1設(shè)計簡要流程訓(xùn)練文本集訓(xùn)練文本集測試文本集文本預(yù)處理選舉特征詞集情感詞典向量空間表示SVM分類器情感分類結(jié)果訓(xùn)練SVM分類器文本預(yù)處理向量空間表示分類參數(shù)TF-IDF特征降維圖2.1-1_設(shè)計簡要流程圖2.2文本數(shù)據(jù)獲取2.2.1創(chuàng)建APP首先通過已有的twitter賬號訪問推特官方網(wǎng)站,想要抓取數(shù)據(jù)就要創(chuàng)建app去訪問twitter的API。創(chuàng)建app時,必要填寫信息為“name,Description,website”,其中name為APP的名稱;description是對自己APP的描述;website自己有網(wǎng)站寫自己的網(wǎng)站,沒有就寫一個符合格式的網(wǎng)站就行。并不需要進一步的驗證,app中的AccessToken、Access、TokenSecretConsumerKey(APIKey)和ConsumerSecret(APISecret)這四個開發(fā)者身份認證令牌參數(shù)才是我們的目標(biāo),也是獲取數(shù)據(jù)的基本條件。如果需要獲取大量數(shù)據(jù),可以申請多個app,因為單個的爬取次數(shù)和數(shù)量均有限制。2.2.2調(diào)配使用API之所以選擇Twitter作為實戰(zhàn)的文本數(shù)據(jù)是因為它提供很多類型的API,其中RestAPI與StreamingAPI是最為常見的。前者是經(jīng)常被用到的類型,而StreamingAPI可以用于追蹤想要了解的用戶或事件。下面介紹一下RESTAPI中有爬取意義的幾個API:GETstatuses/usertimeline:返回一個用戶發(fā)的推文。注意twitter里回復(fù)也相當(dāng)于發(fā)推文。GETfriends/ids:返回一個用戶的followees。GETfollowers/ids:返回一個用戶的followers。GETusers/show:返回一個用戶的信息。接下來,通過使用twitterapi進行數(shù)據(jù)抓取,目前的twitterapi有很多python語言版本,本設(shè)計將會用到的是tweepy。安裝tweepy庫,只需要在cmd中輸入pipinstalltweepy命令即可。2.2.3開始程序編輯Twitter平臺不僅給以了我們爬取數(shù)據(jù)所用到的API接口,并且還攜帶了供我們寫程序代碼參考所用到的Tweepy庫。最后將獲取到的數(shù)據(jù)將保存到csv格式文件中,獲取文本數(shù)據(jù)程序代碼如下:2.3數(shù)據(jù)預(yù)處理2.3.1句柄的刪除句柄(@user)攜帶是每個推特用戶得以批準(zhǔn)的一種方式,所以tweets文本數(shù)據(jù)中有的大量twitter句柄。而這個句柄其實沒有什么信息含量,因此我們刪除所有這些twitter句柄。為了省去不必要的麻煩,最好將測試集跟訓(xùn)練集都一齊處理掉。說到刪除tweet中用不到的文本模式,首先我們需要定義一個函數(shù),輸入兩個參數(shù),一個是文本原始字符串,另一個是字符串中我們想要刪除的文本模式。用該函數(shù)進行“@user”模式的刪除。最后,創(chuàng)建一個新的列名為processed_tweet,用于存放經(jīng)過清理和處理的tweet。程序代碼如下:2.3.2刪除標(biāo)點、數(shù)字和特殊字符標(biāo)點符號、數(shù)字和特殊字符對一般的文本處理沒什么幫助。就像twitter句柄一樣需要從文本中刪除掉它們,用空格替換除字符和標(biāo)簽的全部內(nèi)容。處理程序代碼如下:2.3.3處理表情符號將表情符號轉(zhuǎn)化為情緒表達,分別為Positive和negative。可以更加直觀的判斷文本的情緒傾向,轉(zhuǎn)化代碼如下:2.3.4詞干提取由于英文表達中的單詞大多帶有后綴,如(“ing”、“l(fā)y”、“er”、“es”、“s”等)對單詞沒有情緒改變的后綴。舉個例子,“fly”、“flyer”、“flying”,其中“flyer”和“flying”是單詞“fly”的不同變體。我們需要從一個單詞中剝離后綴,提取出對情緒分類有用的詞干信息,提取程序代碼如下:2.4標(biāo)注類標(biāo)簽在經(jīng)過預(yù)處理后的的數(shù)據(jù),分別劃分為訓(xùn)練以及測試文本集,訓(xùn)練集的數(shù)額要遠大于測試集的數(shù)額。本設(shè)計總獲取約一百萬個文本數(shù)據(jù),其中測試集數(shù)量約為百分之九十,然后按照文本的情感表達給它們分類為消極negative(標(biāo)注為0)和積極Positive(標(biāo)注為1)的標(biāo)簽,測試集用于后續(xù)的驗證,不需要標(biāo)注。標(biāo)注后的效果圖如下:圖2.4-1_類標(biāo)注效果圖2.5分詞由于在特征提取前,需要并將這些詞用作向量來表示文本,即將所有訓(xùn)練文檔進行分詞。舉個例子:在情感分類問題中,選擇特征可以基于“詞”這個層次,例如“Thistweetisexcellent”,我給他標(biāo)注成“Positive”的類標(biāo)簽。里面有4個詞,分別為“This”、“tweet”、“is”、“excellent”。意思是將這4個詞全部作為了分類特征詞,那么包含這個詞的文本就會被分類為“積極”。同理,對上面提及的那句文本,還能選擇雙詞組合(Bigrams)。這種方法就是將“Thistweet”,“tweetis”,“isexcellent”這種兩兩搭配作為分類特征。本設(shè)計將用到這兩種特征選擇作為分詞方式進行選擇,分詞程序代碼如下:2.6特征提取機器學(xué)習(xí)算法并不能直接使用原始數(shù)據(jù),這就需要我們對分詞后的的詞語集合(原始數(shù)據(jù))做一個特征提取處理,然后把原始數(shù)據(jù)轉(zhuǎn)變?yōu)槟軌虮粰C器學(xué)習(xí)算法認識的數(shù)量特征(固定長度的向量表示)。基于2.5提到的兩種特征選擇,可以用到N-Gram,一種基于概率去判別的模型的算法,該語言模型的根本原理就是將文本內(nèi)容依據(jù)不同的字節(jié)大小N去截取想要大小的片段序列。進行過濾后對所有的字節(jié)片段(gram)所浮出的頻度分別計算,最后合成向量特征空間(gram列表)。其中列表里面不同的gram代表著不同的特征向量維度。當(dāng)n=1時,為一元模型(unigrammodel),對應(yīng)公式如下:(式2.6-1)(式2.6-1)當(dāng)n=2時,為二元模型(bigrammodel),對應(yīng)公式如下:(式2.6-2)(式2.6-2))本設(shè)計在模型中分別創(chuàng)建了一元模型和二元模型特征向量列表,然后通過使用上面提到的兩種特征提取方式對數(shù)據(jù)集中所有的單詞在語料中出現(xiàn)的頻率,對比這兩種特征提取的測試效果,最終選擇最佳的特征特征向量維度,將數(shù)據(jù)以這個字節(jié)長度添加到特征列向量表中。實踐流程和程序設(shè)計如下:文檔信息文檔信息特征向量列表語段序列g(shù)ram頻度列表粗切分N-gram切分過濾圖2.6-1實踐流程圖2.7特征降維與TF-IDF特征降維顯然意味著減少特征維數(shù)。這有兩個不同含義。一是可以減少特征數(shù)量以加快算法計算。另一個是,如果使用某種方法來選擇信息豐富的特征,則可以減少噪聲并有效地提高分類的準(zhǔn)確性。何為信息量豐富?,可以回顧一下上面的例子:“Thistweetisexcellent”,很明顯,其實不需要把“This”、“tweet”、“is”、“excellent”這4個都當(dāng)做特征,因為“excellent”這一個詞,或者“isexcellent”這樣一個雙詞搭配就能夠判定了這個文本屬于“積極”的。這就足夠說明了“excellent”是一個信息量非常豐富的詞。下面將通過一定的統(tǒng)計方法找到信息量豐富的特征。TF-IDF(TermFrequency-InverseDocumentFrequency),是在分類問題中用于統(tǒng)計的一種方法。用于評估一個字詞在文本集或語義庫中的某個文本的影響度。字詞在文本中出現(xiàn)的次數(shù)越多嗎,其影響度越大。相反,字詞在語義庫中出現(xiàn)的頻率越高,該詞的影響度就越低。TF-IDF由TF和IDF這兩部分組成。詞頻(TermFrequency,TF)是計算文本中某個特定詞出現(xiàn)的多少次。同一個詞不管它重不重要,在長文本較于短文本出現(xiàn)的次數(shù)可能偏高。為了防止它的偏向,這個數(shù)值通常需要除以文章總詞數(shù)進行歸一化,表達式如下:(式2.7-1)(式2.7-1)但是需要考慮的問題是:一些出現(xiàn)頻率較高的詞通常對于情緒判斷沒有啥作用,反而一些較少出現(xiàn)的詞卻能表達出文本基本情緒。例如在大多數(shù)文本都會用到的"to"的詞頻就很高,但是其對情緒分類的作用卻比不上詞頻低的"Study"和“Sing”等詞。因此權(quán)重的計算不能只用到TF,必須考慮到:一個詞要跟其分類情緒的的能力成正比,能力越強,權(quán)重越大,反之則權(quán)重越小。要找到一些詞只是很少地出現(xiàn)在所有統(tǒng)計文本中的其中幾個,那么這些詞對文本情緒表達作用就很大。因此需要用到IDF來完成此工作,將這些詞的權(quán)重設(shè)計的更大去反映出這些詞的重要性,進而改正單純使用詞頻表示的特征值。逆向文件頻率(InverseDocumentFrequency,IDF)可用于去尋找具有優(yōu)秀分類能力的詞條,根據(jù)詞條出現(xiàn)在的文檔數(shù)較少,其逆向文件頻率就越大來判別。以下公式就可計算出某一特定詞語的IDF:(式2.7-2)(式2.7-2)為了使每一個IDF值都有意義,應(yīng)該避免一個極端的情況,就是某個詞在全部的文本中都出現(xiàn),其IDF值為0就失去了意義。因此我們在使用IDF時需要做一些平滑,如對上式的分母加1,就是為了防止分母等于0,使得沒有出現(xiàn)在語料庫中的詞也得到一個合理的IDF值。TF-IDF重在過濾掉常見的詞,留下信息量豐富的詞。想要輸出權(quán)重的TF-IDF,這個詞就需要滿足較多的出現(xiàn)在一個特定文本,較少的出現(xiàn)在文本集的文本中。理解了IDF的定義,接下來就可以推出計算某一個詞的TF-IDF值的公式了:(式2.7-3)(式2.7-3)即:(式2.7-4(式2.7-4)式中的表示某字詞在句子中出現(xiàn)的概率,其中N為訓(xùn)練集文本數(shù)量,表示訓(xùn)練集中包含特征詞的文本數(shù)。根據(jù)TF-IDF公式表示,某特征詞出現(xiàn)在一個文本集的次數(shù)越多,其其辨別能力越小,權(quán)重值越低;而在一個文本中出現(xiàn)的概率越高,可區(qū)分性就越大,權(quán)重也就越大。2.8搭建模型2.8.1以機器學(xué)習(xí)為基礎(chǔ)的文本情感分析方法首先對已經(jīng)標(biāo)注好的文本數(shù)據(jù)進行特征處理,然后對模型進行訓(xùn)練以進行監(jiān)督學(xué)習(xí)。訓(xùn)練完好的模型最后用于預(yù)測新文本測試集信息的情感極性。簡要操作流程如下圖所示:已經(jīng)標(biāo)住的文本數(shù)據(jù)已經(jīng)標(biāo)住的文本數(shù)據(jù)特征提取模型訓(xùn)練極性標(biāo)簽機器學(xué)習(xí)訓(xùn)練未標(biāo)住的句子特征提取取情感極性預(yù)測圖2.8-1_簡要操作流程圖機器學(xué)習(xí)依照分類算法的不同,分為國內(nèi)外研究現(xiàn)狀中使用的三種方法:樸素貝葉斯、最大熵和支持向量機(SVM)。相對于前兩者,由vapnik提出的支持向量機(SVM),被認為是最好的情緒分析方法,該方法通過尋找最小的結(jié)構(gòu)化風(fēng)險,降低泛化錯誤率和計算開銷,并且實現(xiàn)了經(jīng)驗危險和置信面積的最小化,最重要的是對于訓(xùn)練集較小的文本也可以獲得良好的統(tǒng)計規(guī)律和情感分析效果。高維數(shù)據(jù)使用支持向量機(SVM)的處理效果很不錯,想要很好的使用該方法,就要做好參數(shù)調(diào)節(jié)和核函數(shù)的挑選。2.8.2支持向量機SVM支持向量機(SupportVectorMachine,SVM)算法用于文本分類經(jīng)常被稱贊。該機器學(xué)習(xí)方法主要基于統(tǒng)計學(xué)習(xí)。該算法將數(shù)據(jù)集進行壓縮,轉(zhuǎn)化為向量集合,以降低結(jié)構(gòu)風(fēng)險,學(xué)習(xí)得到?jīng)Q策函數(shù)的分類技術(shù)。該技術(shù)能實現(xiàn)文本向量化,僅需要一定的文本數(shù)據(jù)就能被抽象得到訓(xùn)練集,解決了過去需要無限大樣本的問題,提高了分類的準(zhǔn)確性。使用支持向量機(SVM)算法,就能用有限的文本數(shù)據(jù)獲得最好的推廣能力,是因為它在模型的復(fù)雜性與學(xué)習(xí)能力之間尋找最好折中點實現(xiàn)的。下面說說支持向量機算法的贊點:(1)能匹配現(xiàn)有數(shù)額的的文本數(shù)據(jù),找到最好值點,充分照顧到有限數(shù)據(jù)的情況。(2)支持向量機算法在特征向量稀少的空間和特征向量密集的空間都能很好的執(zhí)行任務(wù),這是其他一些分類算法不能做到的。(3)支持向量機算法能幫你找到權(quán)重的特征向量,該工具的優(yōu)秀學(xué)習(xí)能力體現(xiàn)了它在文本分類中的巨大潛能。支持向量機(SVM)是一種二向線性分類器,線性可分和線性不可分,用于監(jiān)督學(xué)習(xí)。線性可分相對簡單,而線性不可分離則想到SVM,它能把原始數(shù)據(jù)映射到線性可分新界面,經(jīng)過投影,可在原始界面獲得劃分邊界。SVM是一種經(jīng)常用于分類問題的數(shù)學(xué)模型。它的主要思想是構(gòu)造一個多維超平面,對要分類的特征值進行分類,使用訓(xùn)練示例數(shù)據(jù)向量將其劃分為相對應(yīng)的類別,然后找到該平面的邊界最大化。wwyx圖2.8-2_SVM超平面分隔圖上文說到SVM針對非線性的情況,那它是怎么做到的呢?而核函數(shù)(Kernel)正是它解決這個問題的秘方,核函數(shù)通過在較于原本數(shù)據(jù)空間更高維的特征空間去看線性不可分的分類問題,從而得到了很好的分界面。核函數(shù)的精髓如下:在我們的學(xué)習(xí)研究過程中,經(jīng)常碰到各種線性不可分的情況。而我們常用的方法就是將原始數(shù)據(jù)特征映射到高維的象征空間里,(如上圖2.8-2_SVM超平面分割圖所示)這樣是為了使相關(guān)特征被分開達到分類的目的。以此類推,我們將所有碰到的線性不可分樣例,都像上面所說的一律映射到高維空間。那該維度豈不是高到嚇人,那改如何呢?接下來,核函數(shù)的出現(xiàn)意義不僅在于它實現(xiàn)特征從低到高的空間維度變換,還能將數(shù)據(jù)在低維空間上計算效果展現(xiàn)在高維空間中,防止了②中說到的復(fù)雜高維計算。接下來討論核函數(shù)的選擇,LinearSVC和使用SVC且在kerne中引入linear是本設(shè)計需要考慮的使用結(jié)果一樣的兩種選擇。其中SVC在任意核中可用,而LinearSVC只能運用于線性核,因此SVC的計算較復(fù)雜。這使得如果你決定使用線性SVM時,選擇用LinearSVC會比另一個的操作速度快很多。本設(shè)計就是用到了LinearSVC,程序片段如下:SVC屬于本設(shè)計所用到的sklearn中用于分類的SVM模型,SVR是另外提供的回歸模型用于預(yù)測。調(diào)用這兩種模型時的參數(shù)設(shè)置相似,簡單介紹一下SVC如何設(shè)置參數(shù)。上面提及到的SVC()參數(shù),其中的C是懲罰系數(shù),可以解釋為準(zhǔn)許分類出錯的權(quán)重(C越大,越不準(zhǔn)許出錯),越小,則準(zhǔn)許少量劃分出錯。2.9模型評估在使用人工智能算法時,經(jīng)過算法實現(xiàn)和模型訓(xùn)練后,可以對訓(xùn)練模型進行評估從而檢查算法的性能好不好,以便進行優(yōu)化得到想要的準(zhǔn)確率。下面我們將用涉及到精確率(Precision)、召回率(Recall)和準(zhǔn)確率(Accuracy)這幾個判斷標(biāo)準(zhǔn)的F1-score來進行模型評估:F1-score的定義:F1分數(shù)(F1-score)經(jīng)常被用于衡量一些基于機器學(xué)習(xí)的兩個以上分類問題比賽結(jié)果的判定標(biāo)準(zhǔn)。它是召回率和精確率的倒數(shù)平均數(shù),值最大時等于1,最小時等于0。其表達式如下:(式2.8-1)(式2.8-1)F1-score的計算:1.首先給以下變量定義概念:TruePositive(TP):推測結(jié)果標(biāo)準(zhǔn);FalsePositive(FP):錯將別的標(biāo)簽為推測本類;TrueNegative(TN):推測結(jié)果標(biāo)準(zhǔn);FalseNegative(FN):錯將本類歸類為別類標(biāo)簽;2.通過步驟1中的值算出的精準(zhǔn)度和召回率。精準(zhǔn)度(precision):指被分類器推測為正樣本占正例總數(shù)的比值。(式2.8-2)(式2.8-2)召回率(recall):代表被推測為正樣本占總正樣本的比值。(式2.8-3)(式2.8-3)準(zhǔn)確率(accuracy):指的是分類器對總樣本推測正確的比值。(式2.8-4))(式2.8-4))3.通過步驟2計算結(jié)果得出各個類別下的f1-score,下面為計算公式:(式2.8-5)(式2.8-5)各個類別下的F1-score可通過步驟3計算得的值,從而測評出分類器各個指標(biāo)結(jié)果,公式如下:(式2.8-6)(式2.8-6)f1_score函數(shù)在程序中的運用為了便捷使用f1_score函數(shù)可以直接在程序中加載sklearn包。分類器推段獲取average
:string,[None,‘binary’(default),
‘macro’,
‘weighted’]類別,挑選好參數(shù)可事半功倍。當(dāng)在意類別不穩(wěn)定時,使用‘binary’參數(shù)來解決二分類問題;在考慮類別的不平衡性前提下,用‘weighted’參數(shù)能夠算出類別的權(quán)重值;相反在不在意類別不穩(wěn)定時,使用‘macro’參數(shù),可以計算宏平均。相關(guān)代碼如下: 3設(shè)計總結(jié)SVM之所以被廣泛運用于處理分類問題,是因為它具備了較強的泛化和分類能力。一般有關(guān)SVM的分類方法很看重情感詞,并將權(quán)重的情感詞提取用作特征向量。而且存在的問題可分為以下三方面:(1)樣本數(shù)據(jù)稀少問題。情感詞集不能覆蓋全部文檔;(2)一詞多種含義問題。由于一個情感詞有時可以理解為多個語義,而造成的不同程度的情感偏差;(3)多個不同詞表達的是一個語義問題。相同的的情感可以用許多的情感詞去描述。當(dāng)傳統(tǒng)SVM方法遇到以上提及的3種情況時,其分類性能就會下降。由上述可知情感詞與文檔語義關(guān)系在這3個方面完全得以體現(xiàn)了。因此想要提高分類的精度,就需要考慮基于語義特征去分類,從而壯大情感詞的分類規(guī)模。為了解決傳統(tǒng)分類算法存在的上述問題,想到采用挖掘語義分類的方法,把情感詞典和將要處理的文本結(jié)合起來,通過測量詞與文本的語義差距用作特征向量。通過結(jié)合尚未發(fā)現(xiàn)的語義分析和SVM避開上文那3個問題。實驗展示本文用到的方法在分類精確度真的有所提升。本文采用基于支持向量機(SVM)分類的機器學(xué)習(xí)方法,首先選擇特征向量,將twitter的信息量豐富的情感詞、表情符號等當(dāng)做其特征向量,通過使用訓(xùn)練數(shù)據(jù)訓(xùn)練分類模型,得到一個情感分類器,最后對測試文本集進行劃分。本設(shè)計用到了依照民眾在twitter上的語言表達特色和語言表情規(guī)則,同時結(jié)合支持向量機(SVM)方法并完善SVM方法中的缺點,更大程度地優(yōu)化其分類效果,提高分類結(jié)果的可靠性。從分類器對測試數(shù)據(jù)進行情緒預(yù)測的結(jié)果可知,最后的實驗數(shù)據(jù)不錯,其準(zhǔn)確率和召回率都偏小,這更表明文本情緒分析在未來的研究中還可以走的更遠。最后總結(jié)一下文本分類的特殊性,不管是使用SVM還是其他工具分類時,都要記得考慮以下幾方面:在文本預(yù)處理過程中執(zhí)行的很多步驟對最終使用分類工具時都會產(chǎn)生一定影響。文本特征向量的選擇極其重要,因為即使你使用的分類器很強大,你的文本特征選擇的不好,最后也未必能訓(xùn)練得到效果好的分類結(jié)果。不好的文本特征向量,給你多好的參數(shù)你都很難去訓(xùn)練提升優(yōu)化你的分類器,一個不好的分類器,很容易在實際測試中出現(xiàn)錯誤分類的情況。在文本預(yù)處理和使用分類工具進行訓(xùn)練時,你所選擇的訓(xùn)練集本和測試集數(shù)據(jù)文本都會對其效果產(chǎn)生影響。本設(shè)計的后續(xù)提升感想:在自然語言處理方面很難深度學(xué)習(xí)的優(yōu)勢更為凸顯,深度學(xué)習(xí)的方法能夠自動進行特征提取、自主學(xué)習(xí)修正輸出、能很好地處理非線性復(fù)等雜數(shù)據(jù)。正成為眾多學(xué)者對于情緒分類的熱點研究對象,深度學(xué)習(xí)的方法將使文本情感分析研究走上更高的階層,實現(xiàn)更好的分類的效果。4參考文獻SubasicP,HuettnerA.Affectanalysisoftextusingfuzzysemantictyping[J].IEEETransactionsonFuzzySystems,2001,9(4):483-496熊德蘭,程菊明,田勝利.基于HowNet的句子褒貶傾向性研究[J].計算機工程與應(yīng)用,2008,44(22):143—145唐慧豐,譚松波,程學(xué)旗.基于監(jiān)督學(xué)習(xí)的中文情感分類技術(shù)比較研究[J].中文信息學(xué)報,2007,21(6):88—94徐軍,丁宇新,王曉龍.使用機器學(xué)習(xí)方法進行新聞的情感自動分類[J].中文信息學(xué)報,2007,21(6):95—100聞彬,何婷婷,羅樂,等.基于語義理解的文本情感分類方法研究[J].計算機科學(xué),2010,37(6):261—264段建勇,謝宇超,張梅.基于句法語義的網(wǎng)絡(luò)輿論情感傾向性評價技術(shù)研究IJ].情報雜志,2012,31(1):147—150高偉,王中卿,李壽山.基于集成學(xué)習(xí)的半監(jiān)督情感分類方法研究[J].中文信息學(xué)報,2013,27(3):120—126謝麗星,周明,孫茂松.基于層次結(jié)構(gòu)的多策略中文微博情感分析和特征抽取[J].中文信息學(xué)報,2012,26(1):73—83劉寶芹,牛耘.多層次中文微博情緒分析[J].計算機技術(shù)與發(fā)展2015,25(11):23—26歐陽純萍,陽小華,雷龍艷,等.多策略中文微博細粒度情緒分析研究[J].北京大學(xué)學(xué)報(自然科學(xué)版),2014,50(1):67—72雷龍艷.中文微博細粒度情緒識別研究[D].衡陽:南華大學(xué),20146附錄6.1數(shù)據(jù)預(yù)處理程序代碼#
-*-
coding:
utf-8
-*
import
re
import
sys
from
utils
import
write_status
from
nltk.stem.porter
import
PorterStemmer
#處理單詞句子
def
preprocess_word(word):
word
=
word.strip('\'"?!,.():;')
word
=
re.sub(r'(.)\1+',
r'\1\1',
word)
word
=
re.sub(r'(-|\')',
'',
word)
return
word
def
is_valid_word(word):
return
(re.search(r'^[a-zA-Z][a-z0-9A-Z\._]*$',
word)
is
not
None)
def
handle_emojis(tweet):
tweet
=
re.sub(r'(:\s?\)|:-\)|\(\s?:|\(-:|:\'\))',
'
EMO_POS
',
tweet)
tweet
=
re.sub(r'(:\s?D|:-D|x-?D|X-?D)',
'
EMO_POS
',
tweet)
tweet
=
re.sub(r'(<3|:\*)',
'
EMO_POS
',
tweet)
tweet
=
re.sub(r'(;-?\)|;-?D|\(-?;)',
'
EMO_POS
',
tweet)
tweet
=
re.sub(r'(:\s?\(|:-\(|\)\s?:|\)-:)',
'
EMO_NEG
',
tweet)
tweet
=
re.sub(r'(:,\(|:\'\(|:"\()',
'
EMO_NEG
',
tweet)
return
tweet
def
preprocess_tweet(tweet):
processed_tweet
=
[]
tweet
=
tweet.lower()
tweet
=
re.sub(r'((www\.[\S]+)|(https?://[\S]+))',
'
URL
',
tweet)
tweet
=
re.sub(r'@[\S]+',
'USER_MENTION',
tweet)
tweet
=
re.sub(r'#(\S+)',
r'
\1
',
tweet)
tweet
=
re.sub(r'\brt\b',
'',
tweet)
tweet
=
re.sub(r'\.{2,}',
'
',
tweet)
tweet
=
tweet.strip('
"\'')
tweet
=
handle_emojis(tweet)
tweet
=
re.sub(r'\s+',
'
',
tweet)
words
=
tweet.split()
for
word
in
words:
word
=
preprocess_word(word)
if
is_valid_word(word):
if
use_stemmer:
word
=
str(porter_stemmer.stem(word))
processed_tweet.append(word)
return
'
'.join(processed_tweet)
def
preprocess_csv(csv_file_name,
processed_file_name,
test_file=True):
save_to_file
=
open(processed_file_name,
'w'
,
encoding='UTF-8')
with
open(csv_file_name,
'r'
,
encoding='UTF-8')
as
csv:
lines
=
csv.readlines()
total
=
len(lines)
for
i,
line
in
enumerate(lines):
tweet_id
=
line[:line.find(',')]
if
not
test_file:
line
=
line[1
+
line.find(','):]
positive
=
int(line[:line.find(',')])
line
=
line[1
+
line.find(','):]
tweet
=
line
processed_tweet
=
preprocess_tweet(tweet)
if
not
test_file:
save_to_file.write('%s,%d,%s\n'
%
(tweet_id,
positive,
processed_tweet))
else:
save_to_file.write('%s,%s\n'
%
(tweet_id,
processed_tweet))
write_status(i
+
1,
total)
save_to_file.close()
('\nSaved
processed
tweets
to(將已處理的推文保存到):
%s'
%
processed_file_name)
return
processed_file_name
if
__name__
==
'__main__':
if
len(sys.argv)
!=
2:
('請按這樣的格式輸入:
python3
preprocess.py
train.csv
')
exit()
use_stemmer
=
False
csv_file_name
=
sys.argv[1]
processed_file_name
=
sys.argv[1][:-4]
+
'-processed.csv'
if
use_stemmer:
porter_stemmer
=
PorterStemmer()
processed_file_name
=
sys.argv[1][:-4]
+
'-processed-stemmed.csv'
preprocess_csv(csv_file_name,
processed_file_name,
test_file=True,)
6.2模型程序代碼from
sklearn
import
svm
import
utils
import
random
import
numpy
as
np
from
scipy.sparse
import
lil_matrix
from
sklearn.feature_extraction.text
import
TfidfTransformer
from
sklearn.metrics
import
accuracy_score
#調(diào)用準(zhǔn)確率
from
sklearn.metrics
import
recall_score
#調(diào)用召回率
from
sklearn.metrics
import
f1_score
#調(diào)用F1度量
from
sklearn.metrics
import
confusion_matrix
#調(diào)用誤差矩陣
#
Performs
classification
using
SVM.
FREQ_DIST_FILE
=
'train-processed-freqdist.pkl'
BI_FREQ_DIST_FILE
=
'train-processed-freqdist-bi.pkl'
TRAIN_PROCESSED_FILE
=
'train-processed.csv'
TEST_PROCESSED_FILE
=
'test-processed.csv'
TRAIN
=
True
UNIGRAM_SIZE
=
15000
VOCAB_SIZE
=
UNIGRAM_SIZE
USE_BIGRAMS
=
True
if
USE_BIGRAMS:
BIGRAM_SIZE
=
10000
VOCAB_SIZE
=
UNIGRAM_SIZE
+
BIGRAM_SIZE
FEAT_TYPE
=
'frequency'
def
get_feature_vector(tweet):
uni_feature_vector
=
[]
bi_feature_vector
=
[]
words
=
tweet.split()
for
i
in
range(len(words)
-
1):
word
=
words[i]
next_word
=
words[i
+
1]
if
unigrams.get(word):
uni_feature_vector.append(word)
if
USE_BIGRAMS:
if
bigrams.get((word,
next_word)):
bi_feature_vector.append((word,
next_word))
if
len(words)
>=
1:
if
unigrams.get(words[-1]):
uni_feature_vector.append(words[-1])
return
uni_feature_vector,
bi_feature_vector
def
extract_features(tweets,
batch_size=500,
test_file=True,
feat_type='presence'):
num_batches
=
int(np.ceil(len(tweets)
/
float(batch_size)))
for
i
in
range(num_batches):
batch
=
tweets[i
*
batch_size:
(i
+
1)
*
batch_size]
features
=
lil_matrix((batch_size,
VOCAB_SIZE))
labels
=
np.zeros(batch_size)
for
j,
tweet
in
enumerate(batch):
if
test_file:
tweet_words
=
tweet[1][0]
tweet_bigrams
=
tweet[1][1]
else:
tweet_words
=
tweet[2][0]
tweet_bigrams
=
tweet[2][1]
labels[j]
=
tweet[1]
if
feat_type
==
'presence':
tweet_words
=
set(tweet_words)
tweet_bigrams
=
set(tweet_bigrams)
for
word
in
tweet_words:
idx
=
unigrams.get(word)
if
idx:
features[j,
idx]
+=
1
if
USE_BIGRAMS:
for
bigram
in
tweet_bigrams:
idx
=
bigrams.get(bigram)
if
idx:
features[j,
UNIGRAM_SIZE
+
idx]
+=
1
yield
features,
labels
def
apply_tf_idf(X):
transformer
=
TfidfTransformer(smooth_idf=True,
sublinear_tf=True,
use_idf=True)
transformer.fit(X)
return
transformer
def
process_tweets(csv_file,
test_file=True):
"""Returns
a
list
of
tuples
of
type
(tweet_id,
feature_vector)
or
(tweet_id,
sentiment,
feature_vector)
Args:
csv_file
(str):
Name
of
processed
csv
file
generated
by
preprocess.py
test_file
(bool,
optional):
If
processing
test
file
Returns:
list:
Of
tuples
"""
tweets
=
[]
('Generating
feature
vectors')
with
open(csv_file,
'r')
as
csv:
lines
=
csv.readlines()
total
=
len(lines)
for
i,
line
in
enumerate(lines):
if
test_file:
tweet_id,
tweet
=
line.split(',')
else:
tweet_id,
sentiment,
tweet
=
line.split(',')
feature_vector
=
get_feature_vector(tweet)
if
test_file:
tweets.append((tweet_id,
feature_vector))
else:
tweets.append((tweet_id,
int(sentiment),
feature_vector))
utils.write_status(i
+
1,
total)
('\n')
return
tweets
if
__name__
==
'__main__':
np.random.seed(1337)
unigrams
=
utils.top_n_words(FREQ_DIST_FILE,
UNIGRAM_SIZE)
if
USE_BIGRAMS:
bigrams
=
utils.top_n_bigrams(BI_FREQ_DIST_FILE,
BIGRAM_SIZE)
tweets
=
process_tweets(TRAIN_PROCESSED_FILE,
test_file=False)
if
TRAIN:
train_tweets,
val_tweets
=
utils.split_data(tweets)
else:
random.shuffle(tweets)
train_tweets
=
tweets
del
tweets
('Extracting
features
&
training
batches')
clf
=
svm.LinearSVC(C=0.1)
batch_size
=
len(train_tweets)
i
=
1
n_train_batches
=
int(np.ceil(len(train_tweets)
/
float(batch_size)))
for
training_set_X,
training_set_y
in
extract_features(train_tweets,
test_file=False,
feat_type=FEAT_TYPE,
batch_size=batch_size):
utils.write_status(i,
n
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年寵物智能寵物酒店行業(yè)創(chuàng)新與運營報告
- 2026年可持續(xù)時尚產(chǎn)業(yè)創(chuàng)新設(shè)計與市場趨勢報告
- 公司投資決策委員會管理制度及流程
- 發(fā)電設(shè)備維護及試驗方案規(guī)范
- 建筑施工進度計劃與資源配置
- 順產(chǎn)監(jiān)測評分標(biāo)準(zhǔn)與實施指南
- 商業(yè)計劃書撰寫指南及范文模板
- 2025年風(fēng)力渦輪機十年發(fā)展:發(fā)電效率與抗風(fēng)能力行業(yè)報告
- 書店庫存管理及促銷策劃方案
- 高校校友會組織管理實務(wù)
- 綠化養(yǎng)護考核方案范本
- 餐飲企業(yè)后廚食品安全培訓(xùn)資料
- 國網(wǎng)安全家園題庫及答案解析
- 足踝外科進修匯報
- 【12篇】新部編版小學(xué)語文六年級上冊【課內(nèi)外閱讀理解專項訓(xùn)練(完整版)】含答案
- 船艇涂裝教學(xué)課件
- 招標(biāo)績效考核方案(3篇)
- 2025年貸款房屋轉(zhuǎn)贈協(xié)議書
- 2025天津市個人房屋租賃合同樣本
- 中藥熱熨敷技術(shù)及操作流程圖
- 鶴壁供熱管理辦法
評論
0/150
提交評論