情感分析:基于詞典的分析方法_第1頁
情感分析:基于詞典的分析方法_第2頁
情感分析:基于詞典的分析方法_第3頁
情感分析:基于詞典的分析方法_第4頁
情感分析:基于詞典的分析方法_第5頁
已閱讀5頁,還剩16頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

情感分析:基于詞典的分析方法好主意值得擴散,激發(fā)我們創(chuàng)造的動力所有的數(shù)據(jù)挖掘方法和思路基本上很久之前都已經(jīng)形成了,只是現(xiàn)代計算機的普及讓這些創(chuàng)新的想法擁有了看似可行的技術(shù)支撐,給了他們起死回生的機會,從歷史的故紙堆里搖身一變,成了高大上的現(xiàn)代挖掘感念。情感分析的歷史也可以追溯到1950年,沒錯你真的沒有看錯,那時的情感分析用于研究論文評述的態(tài)度。如今,廣闊的社交媒體為情感分析提供了用武之地,文本數(shù)據(jù)源源不斷地從微博、博客、微信、社交平臺、新聞評論、百度知道等等交互平臺抓取下來,而情感分析被廣泛的應(yīng)用于挖掘互聯(lián)網(wǎng)上的主觀信息。從基礎(chǔ)上講,情感分析能夠幫助企業(yè)掌握文本所表達的情感傾向:正向、負向、還是中性,給予企業(yè)分析特定人群特別是消費者對某一固定話題、產(chǎn)品、方法持有的態(tài)度。企業(yè)可以使用挖掘出來的情感信息尋找新的營銷機會,改善營銷方式,針對人群采取精準營銷等等,美國總統(tǒng)奧觀海團隊就使用情感分析方法監(jiān)控大眾對其政策的態(tài)度和反應(yīng)。1.情感分析及其應(yīng)用:這里是老生常談在企業(yè)內(nèi),所有的數(shù)據(jù)挖掘工作歸根結(jié)底要解決業(yè)務(wù)問題,這一點認識的越深刻越能腳踏實地的解決問題,而不是制造虛假問題然后解決或者是答非所問,結(jié)果不能對問題實現(xiàn)有效的干預(yù)。1.1.情感分析的用途情感分析也一樣要尋找自己的業(yè)務(wù)用途。當然情感分析有很多用途,網(wǎng)絡(luò)社交越來越火,名博或意見領(lǐng)袖越來越多,可以對商品和服務(wù)打分、評價的站點更是如雨后春筍,用戶的評價和建議可以全網(wǎng)傳播,這些數(shù)據(jù)毫無疑問是精準營銷的動力來源。企業(yè)也可以根據(jù)情感分析建立自己的數(shù)字形象,識別新的市場機會,做好市場細分,進而推動產(chǎn)品成功上市,但抓住這些評論的價值部分也是企業(yè)的巨大挑戰(zhàn)。上述正是情感分析的應(yīng)用背景,但其主要用途包括:監(jiān)控社交媒體社交媒體監(jiān)控可以非常有效的管理品牌的影響力或識別對品牌有影響力的意見領(lǐng)袖,比如你想知道自己品牌負面評論的來源,你可以監(jiān)控50個行業(yè)意見領(lǐng)袖的微博、博客,分析他們微博或文章下面的用戶評論,從而確定誰會引導(dǎo)負向評論,之后就可以和這些意見領(lǐng)袖合作,從而轉(zhuǎn)化他們的負面影響。公共關(guān)系情感分析同時能幫助企業(yè)改善或重塑公共關(guān)系策略,例如情感分析可以探索銷售熱點和行業(yè)的流行趨勢,同樣就像上一步表述的一樣,通過情感分析找到社會上對品牌有好感的意見領(lǐng)袖,建立并維持合作的關(guān)系,這種方式顯然是一種行之有效的公共關(guān)系管理策略。市場營銷情感分析正在逐步替代傳統(tǒng)市場研究的內(nèi)容,比如情感需求調(diào)研、使用習(xí)慣及態(tài)度研究等等,例如,三星想知道客戶對他們的新機型的評價,在社交媒體和數(shù)據(jù)挖掘興起之前他們只能通過市場調(diào)研的方式解決。而數(shù)據(jù)分析則可以抓取消費者在各大消費網(wǎng)站如亞馬孫、京東、天貓、社交媒體留下的評論數(shù)據(jù),分析這些文本內(nèi)容。從而獲知消費者對某個新機型的情感傾向,或者獲得消費者對某個新機型的了解程度以及消費者對機型的哪些屬性比較贊賞而對另外某些方面并不感冒。政策分析分析微博上的評論可以非常準確的了解大眾對政策的理解和情感傾向,慕尼黑大學(xué)的研究表明推特上的信息能夠非常準確的反映選民的政治傾向,通過分析2009年德國大選期間選民涉及政黨和政客的10萬條推特,結(jié)論是推特的信息能夠預(yù)示大選的結(jié)果,其準確性不亞于傳統(tǒng)的民意調(diào)研。數(shù)據(jù)挖掘情感分析作為一種數(shù)據(jù)挖掘的方式,可以用于采集競爭對手的競爭優(yōu)勢,企業(yè)可以輕易地跟蹤社交媒體的情感傾向和社交媒體對競爭對手的情感傾向,了解消費者對競爭品牌的印象及對其產(chǎn)品的情感傾向,這是非常優(yōu)秀的競爭優(yōu)勢分析策略。更重要的是,情感分析的結(jié)果和情感指數(shù)還可以作為變量應(yīng)用到其他數(shù)據(jù)挖掘項目,例如預(yù)測用戶流失的概率時就可以關(guān)聯(lián)用戶的情感指數(shù)作為變量。 1.2.情感分析的方法論受制于人們表達態(tài)度的方式異常復(fù)雜,情感分析面臨很多挑戰(zhàn),簡單的方法難以識別真正的情感傾向。但常見的分析方法大致可以梳理為兩個常見的方向:基于詞典的情感分析法和基于監(jiān)督算法的情感分析方法。1.2.1.基于詞典的情感分析法基于詞典的情感分析法起源于基于語法規(guī)則的文本分析,方法比較簡單純樸,首先需要具有語法敏感性的專業(yè)人士構(gòu)建情感分析的詞典:正向情感詞典和負向情感詞典,即將某語言中用于表達情感的詞匯分為兩個類別,然后比對文本中正負情感詞的個數(shù)之類的方法,評估文本的情感傾向,這種方法非常容易理解。情感詞也分輕重緩急,比如喜歡和愛雖然都是正向,但其程度上不一樣,因此根據(jù)語言專家的分析,給予情感詞不同的情感級別或權(quán)重算是對上述分析方法的改進,毫無疑問種方法包含一定的語法分析的成分,大家不要忘了谷歌翻譯的早期版本就是基于語法的方式,其效果可見一斑。1.2.2.基于監(jiān)督算法的情感分析方法基于監(jiān)督算法的情感分析過程首先制作一個規(guī)模龐大的訓(xùn)練集,由人工識別文本的正負向,然后通過機器學(xué)習(xí)或算法(SVM、隨機森林、樸素貝葉斯等等)等方式訓(xùn)練模型,得出模型后再用來識別新文本的情感傾向,比較像垃圾郵件的分類方法,首先精挑一些垃圾郵件和正常郵件,讓模型學(xué)習(xí),然后再將模型用于垃圾郵件的分選。1.2.3.一種準確率幾達87%的新方法本書介紹一種新方法,準確率高于常見的分析方式,而且仍有提升空間。1.2.4.情感分析一些積累知識和方向首先我們應(yīng)感感謝一些前輩的積累工作,就詞典方面中國知網(wǎng)的研究者整理出了知網(wǎng)情感hownet詞典,更新地址:/html/c_bulletin_2007.htm,另外還有臺灣大學(xué)整理的臺灣大學(xué)情感NTUSD,還有富士通公司的情感詞典、程度詞典等等。除了情感詞典以外,情感分析語料庫方面也有不錯的工作積累,比如清華大學(xué)李軍標注的情感分析語料庫等等,以及Tang先生等人另辟蹊徑根據(jù)表情符號標注微博情感語料庫類別的方法。以上都是非常優(yōu)秀的工作,本書將大量采用前人的研究成果,但站在巨人的肩上能不能看得更遠就另是一說啦?;诙嗄陱氖挛谋就诰蚝妥匀徽Z言分析工作的經(jīng)驗,在情感分析方案設(shè)計和評價時我覺得應(yīng)該考慮一下幾點: 1.是否需要詞典是否具有跨行業(yè)分析的功能使用什么算法,是分類任務(wù)還是分值預(yù)測,這關(guān)系到情感分析的細膩細膩度問題是否需要使用規(guī)則及其與程序速度的平衡關(guān)系是否關(guān)注情感歸屬問題,即主體詞和情感的歸屬關(guān)系,是整體層次還是單個文本的個體層次準確率和速度以上算是情感分析的幾個基本問題,本章盡量從這些方面探索實現(xiàn)。2.文本分析的基本武器:工欲善其事工欲善其事,必先利其器,R和python都是數(shù)據(jù)挖掘的利器,雖然我們選擇了使用R做情感分析,但我個人認為python更具后發(fā)優(yōu)勢,如果你搜索自然語言處理的話,會發(fā)現(xiàn)很多內(nèi)容和python有關(guān),至于其他方面的比較,個人認為沒有必要,只看這一點就ok了。2.1.Rjava包配置既然選擇了R語言,就需要將R語言打造一番,首先RJava包需要安裝,它是R語言和Java的通信接口,允許在R中直接調(diào)用Java的對象和方法,恰恰能滿足很多包的需要,比如 Rwordseg。Linux環(huán)境下只要R與Java的版本對應(yīng)即可使用常規(guī)方法安裝RJava,而windows環(huán)境下就比較麻煩, 首先要安裝java,去oracle官網(wǎng)下載JDK版安裝包,注意,這里是jdk不是jre,是64位還是32位要和R版本相同。然后需要安裝Rtools,下載地址/bin/windows/Rtools/,當然要選擇和R匹配的Rtools。完成以上工作以后需要配置環(huán)境,win7右鍵我的電腦——高級系統(tǒng)設(shè)置——環(huán)境變量,在環(huán)境變量中分別新建或添加相應(yīng)的環(huán)境路徑。第一個classpath,新建classpath添加下面代碼classpath.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;C:\ProgramFiles\R\R-3.2.1\library\rJava\jri這里最后一個值有時需要指定到j(luò)ri的版本是x64還是i386,如果是64,那么需要C:\ProgramFiles\R\R-3.2.1\library\rJava\jri\x64,有時又不需要這么指定,真是一件神奇的事情。第二個JAVA_HOME,新建,然后把下面的內(nèi)容添加進去JAVA_HOMEC:\ProgramFiles\Java\jdk1.8.0_51第三個Path,新建path,注意一下所有的軟件都要區(qū)分 i386或x64PathC:\Rtools\bin;C:\Rtools\gcc-4.6.3\bin;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;C:\ProgramFiles\R\R-3.2.1\bin\i386;C:\ProgramFiles\R\R-3.2.1\bin\x64;C:\ProgramFiles\Java\jdk1.8.0_51\jre\bin\server第四個R_HOME,添加R_HOMEC:\ProgramFiles\R\R-3.2.1以上所有路徑均是你的軟件安裝路徑,其他不需要修改。安裝rJava包if(!suppressWarnings(require("rJava"))){install.packages("rJava")require("rJava")}.jinit()s<-.jnew("java/lang/String","HelloWorld!")s#[1]"Java-Object{HelloWorld!}"如果s正常返回"Java-Object{HelloWorld!}"則RJava已經(jīng)成功了。只有RJava配置成功了,Rwordseg安裝才可能成功,前者是后者的依賴包。2.2.Rwordseg包安裝如果返回不正常說明你的 RJava還沒安裝好,需要重新安裝,Rwordseg是我接觸最早的中文分詞包,所以情有獨鐘,并不是因為它多么優(yōu)秀,而是覺得分詞是文本分析的基礎(chǔ)工作,就其準確性而言,各種方法之間實在沒有實質(zhì)性的差別,因此也就沒有養(yǎng)成換來換去的壞毛病。其實,有一點很奇怪,大家口口聲聲玩大數(shù)據(jù),但往往在某些細節(jié)問題上止步不前,比如為了分詞準確性提高一個千分點,花費大量的時間、財力和精力,我請問,這些改變對數(shù)億級的文本分析結(jié)果能有多大的影響呢。另外,數(shù)據(jù)量巨大的分析保證我們在群體上的精確性,這也是統(tǒng)計的本質(zhì),而有些人在評價結(jié)果時可能糾結(jié)于極個別的個體,這本就是一種本末倒置的思維。如果我們的自變量是由個體組成的,必然需要從群體上評價準確性,而不是糾結(jié)于黑天鵝事件。至于防止黑天鵝事件,自然可以設(shè)計一套風(fēng)險管理措施,比如可以分化賭注,多玩幾次。扯遠了,繼續(xù)安裝Rwordseg。安裝Rwordseginstall.packages("Rwordseg",repos="http://R-Forge.R-")#這一步要完成需要安裝Rtoolslibrary(rJava)library(Rwordseg)segmentCN(”在此對原作者孫健表示強烈的敬意 !")如果在線安裝不成功,可以下載本地安裝。下載/R/?group_id=1054本地安裝很簡單,如果你使用Rstudio編輯器,點擊tools,選install.packages就可以安裝。如果segmentCN函數(shù)分詞成功就ok了,報錯就自求多福吧!2.3.jieba分詞包安裝雖然我比較執(zhí)著于Rwordseg,并不代表各位看管執(zhí)著于我的執(zhí)著,推薦結(jié)巴分詞包,小巧玲瓏,沒有那么多幺蛾子,而且R版本和python版本都有,除了詞性標注等分詞包必備功能以外,jiebaR還加入了一些基礎(chǔ)的文本分析算法, 比如提取關(guān)鍵字(TFIDF)、分析文本相似性等等,真是老少咸宜。安裝jiebaRlibrary(devtools)if(!suppressWarnings(require("Rcpp"))){install.packages("Rcpp")require("Rcpp")}install_github("qinwf/jiebaR")library(jiebaR)seg<-worker()seg<="江州市長江大橋,參加了長江大橋的通車儀式。 "seg<="H:/zimeiti/窺視數(shù)據(jù)背后的邏輯:基于R與python/bookwriting/第十二章輿情分析/rawdata/dataset_602123/ChnSentiCorp_htl_ba_2000/neg/neg.0.txt"fenci如果使用install_github函數(shù)安裝github上的包,需要調(diào)取devtools包,而該包需要Rtools,這也是提前安裝Rtools的原因;另外jiebaR使用Rcpp開發(fā),因此需要安裝調(diào)取Rcpp包。jiebaR其實是一個刀架,里面的每一把刀是一個分詞引擎(是的,好幾種),通過worker函數(shù)初始化引擎,建議不要更改默認設(shè)置(個人認為很多函數(shù)的默認設(shè)置必有其合理性),指定分詞引擎后,只需要將文本通過符號賦值給分詞引擎即可,有兩種方式:其一直接賦值一句話;其二指定文本路徑,分詞結(jié)果存放在相應(yīng)的路徑內(nèi);當然也可以像使用Rwordseg包的segmentCN函數(shù)一樣使用segment函數(shù)分詞,只不過后者需要指定分詞引擎。之所以多說了兩句,是為了努力說服大家盡量使用jiebaR,但是下面的內(nèi)容我們主要使用Rwordseg包分詞,是不是很變態(tài)?其實就分詞這段不一樣而已。3.基于詞典的情感分析的效率高過瞎猜么?上面已經(jīng)簡單介紹了基于詞典的情感分析的過程,一般經(jīng)過以下幾個過程:數(shù)據(jù)整理、詞典整理、情感詞匹配、計算情感得分和方法評估等過程。這種分析方法因其思路簡單而遭人詬病,更有甚者說分析效果趕不上猴子瞎猜,咱不看廣告,看療效。3.1.數(shù)據(jù)整理及詞典構(gòu)建這一節(jié)我們完成文本語料庫和詞典的整理,使用譚松波和清華大學(xué)李軍等人標注的語料庫進行分析,詞典方面使用已經(jīng)公開的詞典資源,包括臺灣大學(xué)、中國知網(wǎng)等網(wǎng)站公布的情感詞典。3.1.1.數(shù)據(jù)整理語料庫共包含兩個數(shù)據(jù)集:清華大學(xué)李軍標注的近24000個酒店評論文本和譚松波整理的12000個來自京東、攜程、當當網(wǎng)的跨行業(yè)評論文本。李軍的語料庫(review_sentiment)包括兩個數(shù)據(jù)集(訓(xùn)練集和測試集)和兩個標注表(訓(xùn)練標注表和測試標注表),標注表注明了文本的情感傾向,正向為1,負向為-1。由于文本為分散的單個文本,所以需要批量讀入文本文件。獲取文本路徑reviewpath<-"H:/zimeiti/窺視數(shù)據(jù)背后的邏輯:基于R與python/bookwriting/第十二章輿情分析/rawdata/review_sentiment/train2"#reviewpath<-"H:/zimeiti/窺視數(shù)據(jù)背后的邏輯:基于R與python/bookwriting/第十二章輿情分析/rawdata/review_sentiment/test2"completepath上面第一句設(shè)定了文件存放的路徑,list.files函數(shù)獲取該路徑下所有文件的文件名,如果s參數(shù)為真,則返回完整的路徑,反之返回文件名稱, pattern設(shè)置符合正則表達式的規(guī)則,僅提取符合要求的文件,防止讀入系統(tǒng)文件,這里僅匹配以.txt結(jié)尾的文件。批量讀入文本read.txt<-function(x){des<-readLines(x)return(paste(des,collapse=""))}review<-lapply(completepath,read.txt)#Therewere50ormorewarnings(usewarnings()toseethefirst50)上面剛開始構(gòu)造了一個函數(shù) read.txt,目的是將一個完整路徑的txt文件加載進來,并將每個段落粘貼在一起,函數(shù)是一個非常中規(guī)中矩的R函數(shù)模式:第一句,打開文件并分行讀取,然后將每一行粘貼在一起,最后返回完整的文本內(nèi)容。在R的自編函數(shù)末尾return聲明返回的內(nèi)容,如果不聲明僅返回函數(shù)中形成的最后一個對象。paste函數(shù)有兩個指定間隔符號的參數(shù):sep和collapse,前者將兩個對象或兩個對象的元素對應(yīng)粘在一起時使用,后者是融合的意思,將向量或者list的元素粘在一起時使用。第二句使用了lapply函數(shù),避免了每一個文本循環(huán)讀取,保持了代碼的整潔,提高了運行速度。到這里,review這個list就記錄了文件下的所有文本內(nèi)容,它的每一個元素是一個文本的內(nèi)容。如果你忍不住想用循環(huán)處理,說明你還處于低級階段,不到萬不得已絕對不能輕易使用R語言循環(huán)。另外,如果程序警告,這里可能是部分文件最后一行沒有換行導(dǎo)致,不用擔心。list轉(zhuǎn)數(shù)據(jù)框docname<-list.files(reviewpath,pattern="*.txt$")reviewdf<-as.data.frame(cbind(docname,unlist(review)),stringsAsFactors=F)colnames(reviewdf)<-c("id","msg")reviewdf$msg<-gsub(pattern="",replacement="",reviewdf$msg)reviewdf$msg<-gsub("\t","",reviewdf$msg)#有時需要使用\\\treviewdf$msg<-gsub(",",",",reviewdf$msg)reviewdf$msg<-gsub("~|'","",reviewdf$msg)reviewdf$msg<-gsub("\\\"","",reviewdf$msg)#Warningmessage:#Inscan(file,what,nmax,sep,dec,quote,skip,nlines,na.strings,:#EOFwithinquotedstring1行讀取文件名稱;2行名稱和文本內(nèi)容按列(cbind)捆綁在一起成為一個新的數(shù)據(jù)框;3行修改列名;4行移除文本中的所有空格,第一個參數(shù)指定正則表達式模式,第二個參數(shù)指定替換為的內(nèi)容; 5、6行替換所有的\t和英文逗號,因為csv各式的文檔以英文逗號為分隔符,文中有英文逗號會報錯,除了英文逗號可能引起read.csv函數(shù)讀取csv文件報錯以外,還有英文單引號(')、英文雙引號(”)、波浪號(~),都會引起讀取時發(fā)生警告,帶來csv文件或txt文件讀取不完整的后果,如果一旦發(fā)生“EOFwithinquotedstring”就要想辦法找出這類符號將其替換掉;因此,7行依次替換了波浪號(~)和英文單引號('),它們之間用“|”符號隔開,表示或的關(guān)系;8行替換所有的英文雙引號(”),因為雙引號在R中有特殊含義,所以要使用三個斜杠()轉(zhuǎn)義。數(shù)據(jù)算是基本處理了一下,下一步要給文本匹配上情感標注。關(guān)聯(lián)標注 reviewclass<-read.table("H:/zimeiti/窺視數(shù)據(jù)背后的邏輯:基于R與python/bookwriting/第十二章輿情分析/rawdata/review_sentiment/train2.rlabelclass",stringsAsFactor=F)#reviewclass<-read.table("H:/zimeiti/窺視數(shù)據(jù)背后的邏輯:基于R與python/bookwriting/第十二章輿情分析/rawdata/review_sentiment/test2.rlabelclass",stringsAsFactor=F)colnames(reviewclass)<-c("id","label")library(plyr)reviewdf<-join(reviewdf,reviewclass)reviewdf<-reviewdf[!is.na(reviewdf$label),]train<-reviewdf#testread.table讀取訓(xùn)練集文本標注數(shù)據(jù),該函數(shù)是R中讀取數(shù)據(jù)的根函數(shù),很多函數(shù)都是繼承的 read.table,所以看到格式陌生的文件,可以嘗試使用這個函數(shù)讀取, 2行更改標注文檔的列名稱,id列和reviewdf中的id列相同,plyr包里的join函數(shù)會根據(jù)名稱相同的列進行匹配關(guān)聯(lián), join默認設(shè)置下執(zhí)行左連接;然后將整理好預(yù)料賦值給 train備用。這樣李軍標注的訓(xùn)練數(shù)據(jù)集就整理完成了,整理測試數(shù)據(jù)集使用相同的代碼,將注釋掉的代碼恢復(fù),同時將上一句注釋掉即dataset_602124數(shù)據(jù)集分為當當、京東、攜程三個子文件夾,下面又分別有pos和neg文件夾,顧名思義,pos文件夾下全是情感正向的文本;neg下則為負向的文件,為了操作簡便,分別把文本統(tǒng)一整理到 pos和neg文件夾內(nèi),然后在進行數(shù)據(jù)處理。獲取文本路徑 reviewpath<-"H:/zimeiti/窺視數(shù)據(jù)背后的邏輯:基于R與python/bookwriting/第十二章輿情分析/rawdata/dataset_602124/pos"reviewpath<-"H:/zimeiti/窺視數(shù)據(jù)背后的邏輯:基于R與python/bookwriting/第十二章輿情分析/rawdata/dataset_602124/neg"completepath讀取dataset_602124數(shù)據(jù)集,設(shè)定文嘉路徑。批量讀入文本review<-lapply(completepath,read.txt)#自編函數(shù)read.txtdocname<-list.files(reviewpath,pattern="*.txt$")label<-rep(1,length(docname))label<-rep(-1,length(docname))reviewdf<-as.data.frame(cbind(docname,unlist(review),label),stringsAsFactors=F)colnames(reviewdf)<-c("id","msg","label")reviewdf$msg<-gsub(pattern="",replacement="",reviewdf$msg)reviewdf$msg<-gsub("\t","",reviewdf$msg)#有時需要使用\\\treviewdf$msg<-gsub(",",",",reviewdf$msg)reviewdf$msg<-gsub("~|'","",reviewdf$msg)reviewdf$msg<-gsub("\\\"","",reviewdf$msg)pos6<-reviewdf#neg6<-reviewdftemp<-rbind(pos6,neg6)train<-rbind(train,temp)write.csv(train,'H:/zimeiti/窺視數(shù)據(jù)背后的邏輯:基于R與python/bookwriting/第十二章輿情分析/data/train.csv',s=FALSE)#write.csv(test,'H:/zimeiti/窺視數(shù)據(jù)背后的邏輯:基于R與python/bookwriting/第十二章輿情分析/rawdata/review_sentiment/test.csv',s=FALSE)1、2行不多說;3行為讀入的數(shù)據(jù)添加情感傾向標簽,正向數(shù)據(jù)全部標注為1,負向數(shù)據(jù)全部標注為-1(暫時注釋掉了),rep函數(shù)復(fù)制產(chǎn)生一個和向量docname等長的向量;4、5行捆綁3列生成數(shù)據(jù)框,并重新命名3列,列順序、名稱和train數(shù)據(jù)框保持一致;6、7、8、9、10行不多說了;11、12、13行將已有的數(shù)據(jù)按行粘( rbind)在一起,生成用于訓(xùn)練的語料庫train,測試的語料庫僅僅使用李軍的測試集 test即可(注釋代碼);只需將train和test輸出到專用的數(shù)據(jù)存儲文件夾data,write.csv輸出語料文檔,輸出格式為csv,參數(shù)s設(shè)置為非,表示不輸出行編號。這樣測試集和訓(xùn)練集語料庫都已經(jīng)準備好了,并存儲在data文件夾里備用。3.1.2.詞典構(gòu)建盡管我們搜集了很多部情感詞典(參看電子文檔),經(jīng)過挑選,暫時整合中國知網(wǎng)、臺大、清華和一部未標注來源的詞典等四部詞典,再次感謝這些詞典的作者。首先我們需要將這些詞典整合為正向情感詞集pos和負向情感詞集neg。我已經(jīng)將各個詞典的正負文本整理到兩個文件夾內(nèi):詞典整理dictpath<-"H:/zimeiti/窺視數(shù)據(jù)背后的邏輯:基于R與python/bookwriting/第十二章輿情分析/rawdict/posdic"dictpath<-"H:/zimeiti/窺視數(shù)據(jù)背后的邏輯:基于R與python/bookwriting/第十二章輿情分析/rawdict/negdic"completepath<-list.files(dictpath,pattern="*.txt$",s=TRUE)dict<-lapply(completepath,readLines)dict<-unique(unlist(dict))pos<-dictneg<-dictwrite.csv(pos,'H:/zimeiti/窺視數(shù)據(jù)背后的邏輯:基于R與python/bookwriting/第十二章輿情分析/dict/pos.csv',s=FALSE)#write.csv(neg,'H:/zimeiti/窺視數(shù)據(jù)背后的邏輯:基于R與python/bookwriting/第十二章輿情分析/dict/neg.csv',s=FALSE)1、2行不多說,3行l(wèi)apply函數(shù)直接使用了readLines函數(shù),將每個文件按行讀取;4行將list解散(unlist)成為一個向量,各個詞典中肯定有相互重復(fù)的詞,所以使用unique函數(shù)去一次重,這樣詞典的正向詞匯就整理完成了,負向詞匯使用相同的方法,部分特異的代碼可以使用注釋掉的內(nèi)容;最后將正負向詞匯文件輸出到dict文件夾即可。3.2.分詞整理基于詞典的情感分析實際上算法和模型先入為主的預(yù)訂了:統(tǒng)計文本正負情感詞的得分之和,如果得分為正,則文本情感傾向為正,反之亦然。所以不需要訓(xùn)練模型,直接使用測試集測試一下即可。基于以上,首先要進行中文分詞,在分詞之前要將文本預(yù)處理一下,包括清除一些英文和數(shù)字等等。分詞預(yù)處理 test<-read.csv("H:/zimeiti/窺視數(shù)據(jù)背后的邏輯:基于R與python/bookwriting/第十二章輿情分析/rawdata/review_sentiment/test.csv",sep=",",header=T,stringsAsFactors=F)sentence<-as.vector(test$msg)sentence<-gsub("[[:digit:]]*","",sentence)#清除數(shù)字[a-zA-Z]sentence<-gsub("[a-zA-Z]","",sentence)sentence<-gsub("\\.","",sentence)test<-test[!is.na(sentence),]sentence<-sentence[!is.na(sentence)]test<-test[!nchar(sentence)<2,]sentence1行讀取csv文件,并設(shè)置stringsAsFactors參數(shù)為非,不將字符轉(zhuǎn)化為因子;2行將文本內(nèi)容轉(zhuǎn)化為向量sentence;3行清除數(shù)字;4行清除英文字符;由于某些文檔可能是由外國人或者一些裝逼漢寫的評價,全部是英文,經(jīng)過以上幾步處理就只剩下了dot符號,所以5行將這類符號清除;經(jīng)過以上處理,可能一些文本已經(jīng)變成了空值或者小于兩個字符了,所以6行將原數(shù)據(jù)框中這些空值文本清除,7行將對應(yīng)的sentence里的空值清除,注意6行的篩選使用sentence是否為空值完成的,所以要先篩除數(shù)據(jù)框test內(nèi)的空值,然后再篩除sentence內(nèi)的空值;最后兩句篩出字符數(shù)小于2的文本,nchar函數(shù)對字符計數(shù),英文嘆號為R語言里的“非”函數(shù)。另外既然整合了大量的詞典,就要盡量保證分詞器能夠把這些情感詞匯分出來,所以需要將情感詞典添加到分詞器的詞典中去,雖然這種方法在特殊情況下并不一定湊效,但至少增加了分詞器在分詞時的計算權(quán)重。添加詞典pos<-read.csv("H:/zimeiti/窺視數(shù)據(jù)背后的邏輯:基于R與python/bookwriting/第十二章輿情分析/dict/pos.csv",header=T,sep=",",stringsAsFactors=F)weight<-rep(1,length(pos[,1]))pos<-cbind(pos,weight)neg<-read.csv("H:/zimeiti/窺視數(shù)據(jù)背后的邏輯:基于R與python/bookwriting/第十二章輿情分析/dict/neg.csv",header=T,sep=",",stringsAsFactors=F)weight<-rep(-1,length(neg[,1]))neg<-cbind(neg,weight)posneg<-rbind(pos,neg)names(posneg)<-c("term","weight")posneg<-posneg[!duplicated(posneg$term),]dict<-posneg[,"term"]library(Rwordseg)insertWords(dict)1讀取正向情感詞;2行創(chuàng)建權(quán)重向量,這里任何一個正向詞匯的權(quán)重均為 1,負向詞匯的權(quán)重為-1;3行為pos添加權(quán)重列;4、5、6行作用同上,為負向情感詞添加權(quán)重列;7行將正負情感詞按行粘貼在一起;8行更改列名稱;因為各個詞典對情感詞的傾向定義可能矛盾,出現(xiàn)同一個詞具有情感正向和負向兩種傾向的情況,盡管這種情況更加符合現(xiàn)實,但是違背了基于詞典的情感分析的原假設(shè),所以要將這些詞去重,我們的方法是一個詞如果同時屬于正向和負向,僅保留正向分類,9行duplicated函數(shù)的作用和unique函數(shù)比較相似,它返回重復(fù)項的位置編號,比如“愛”這個詞在數(shù)據(jù)框和向量中第二次及更多次出現(xiàn)的位置,第一次出現(xiàn)的位置不返回,如果加了“非”函數(shù),表示僅保留第一次出現(xiàn)的詞匯;10、11、12行提取posneg的term列并使用Rwordseg包添加自定義詞典的函數(shù)insertWords將詞典添加入分詞器。下面就可以分詞了,Rwordseg分詞包分詞函數(shù)segmentCN,僅需將向量、字符串、或者文本文件地址賦值給參數(shù)strwords即可,結(jié)果是一個和原向量等長的list,list的每一個元素是一個詞語字符向量,對應(yīng)原來的文本向量,函數(shù)的其他參數(shù)僅nosymbol需要關(guān)注一下,指定是否保留文本中的符號。分詞system.time(x<-segmentCN(strwords=sentence))t

溫馨提示

  • 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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論