久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

情感分析:基于詞典的分析方法

 枯井道人 2016-07-13
好主意值得擴散,,激發(fā)我們創(chuàng)造的動力

所有的數(shù)據(jù)挖掘方法和思路基本上很久之前都已經(jīng)形成了,只是現(xiàn)代計算機的普及讓這些創(chuàng)新的想法擁有了看似可行的技術支撐,,給了他們起死回生的機會,,從歷史的故紙堆里搖身一變,成了高大上的現(xiàn)代挖掘感念,。情感分析的歷史也可以追溯到1950年,,沒錯你真的沒有看錯,那時的情感分析用于研究論文評述的態(tài)度,。如今,,廣闊的社交媒體為情感分析提供了用武之地,文本數(shù)據(jù)源源不斷地從微博,、博客,、微信、社交平臺,、新聞評論,、百度知道等等交互平臺抓取下來,而情感分析被廣泛的應用于挖掘互聯(lián)網(wǎng)上的主觀信息,。

從基礎上講,,情感分析能夠幫助企業(yè)掌握文本所表達的情感傾向:正向、負向,、還是中性,,給予企業(yè)分析特定人群特別是消費者對某一固定話題、產(chǎn)品,、方法持有的態(tài)度,。企業(yè)可以使用挖掘出來的情感信息尋找新的營銷機會,改善營銷方式,,針對人群采取精準營銷等等,,美國總統(tǒng)奧觀海團隊就使用情感分析方法監(jiān)控大眾對其政策的態(tài)度和反應。

1.情感分析及其應用:這里是老生常談

在企業(yè)內(nèi),所有的數(shù)據(jù)挖掘工作歸根結底要解決業(yè)務問題,,這一點認識的越深刻越能腳踏實地的解決問題,,而不是制造虛假問題然后解決或者是答非所問,結果不能對問題實現(xiàn)有效的干預,。

1.1.情感分析的用途

情感分析也一樣要尋找自己的業(yè)務用途,。當然情感分析有很多用途,網(wǎng)絡社交越來越火,,名博或意見領袖越來越多,,可以對商品和服務打分、評價的站點更是如雨后春筍,,用戶的評價和建議可以全網(wǎng)傳播,,這些數(shù)據(jù)毫無疑問是精準營銷的動力來源。企業(yè)也可以根據(jù)情感分析建立自己的數(shù)字形象,,識別新的市場機會,,做好市場細分,進而推動產(chǎn)品成功上市,,但抓住這些評論的價值部分也是企業(yè)的巨大挑戰(zhàn),。上述正是情感分析的應用背景,但其主要用途包括:

監(jiān)控社交媒體

社交媒體監(jiān)控可以非常有效的管理品牌的影響力或識別對品牌有影響力的意見領袖,,比如你想知道自己品牌負面評論的來源,,你可以監(jiān)控50個行業(yè)意見領袖的微博、博客,,分析他們微博或文章下面的用戶評論,,從而確定誰會引導負向評論,之后就可以和這些意見領袖合作,,從而轉化他們的負面影響,。

公共關系

情感分析同時能幫助企業(yè)改善或重塑公共關系策略,例如情感分析可以探索銷售熱點和行業(yè)的流行趨勢,,同樣就像上一步表述的一樣,,通過情感分析找到社會上對品牌有好感的意見領袖,建立并維持合作的關系,,這種方式顯然是一種行之有效的公共關系管理策略,。

市場營銷

情感分析正在逐步替代傳統(tǒng)市場研究的內(nèi)容,比如情感需求調(diào)研,、使用習慣及態(tài)度研究等等,,例如,三星想知道客戶對他們的新機型的評價,,在社交媒體和數(shù)據(jù)挖掘興起之前他們只能通過市場調(diào)研的方式解決,。而數(shù)據(jù)分析則可以抓取消費者在各大消費網(wǎng)站如亞馬孫,、京東、天貓,、社交媒體留下的評論數(shù)據(jù),,分析這些文本內(nèi)容。從而獲知消費者對某個新機型的情感傾向,,或者獲得消費者對某個新機型的了解程度以及消費者對機型的哪些屬性比較贊賞而對另外某些方面并不感冒,。

政策分析

分析微博上的評論可以非常準確的了解大眾對政策的理解和情感傾向,慕尼黑大學的研究表明推特上的信息能夠非常準確的反映選民的政治傾向,,通過分析2009年德國大選期間選民涉及政黨和政客的10萬條推特,,結論是推特的信息能夠預示大選的結果,其準確性不亞于傳統(tǒng)的民意調(diào)研,。

數(shù)據(jù)挖掘

情感分析作為一種數(shù)據(jù)挖掘的方式,可以用于采集競爭對手的競爭優(yōu)勢,,企業(yè)可以輕易地跟蹤社交媒體的情感傾向和社交媒體對競爭對手的情感傾向,,了解消費者對競爭品牌的印象及對其產(chǎn)品的情感傾向,這是非常優(yōu)秀的競爭優(yōu)勢分析策略,。更重要的是,,情感分析的結果和情感指數(shù)還可以作為變量應用到其他數(shù)據(jù)挖掘項目,例如預測用戶流失的概率時就可以關聯(lián)用戶的情感指數(shù)作為變量,。

1.2.情感分析的方法論

受制于人們表達態(tài)度的方式異常復雜,,情感分析面臨很多挑戰(zhàn),簡單的方法難以識別真正的情感傾向,。但常見的分析方法大致可以梳理為兩個常見的方向:基于詞典的情感分析法和基于監(jiān)督算法的情感分析方法,。

1.2.1.基于詞典的情感分析法

基于詞典的情感分析法起源于基于語法規(guī)則的文本分析,方法比較簡單純樸,,首先需要具有語法敏感性的專業(yè)人士構建情感分析的詞典:正向情感詞典和負向情感詞典,,即將某語言中用于表達情感的詞匯分為兩個類別,然后比對文本中正負情感詞的個數(shù)之類的方法,,評估文本的情感傾向,,這種方法非常容易理解。
情感詞也分輕重緩急,,比如喜歡和愛雖然都是正向,,但其程度上不一樣,因此根據(jù)語言專家的分析,,給予情感詞不同的情感級別或權重算是對上述分析方法的改進,,毫無疑問種方法包含一定的語法分析的成分,大家不要忘了谷歌翻譯的早期版本就是基于語法的方式,,其效果可見一斑,。

1.2.2.基于監(jiān)督算法的情感分析方法

基于監(jiān)督算法的情感分析過程首先制作一個規(guī)模龐大的訓練集,,由人工識別文本的正負向,然后通過機器學習或算法(SVM,、隨機森林,、樸素貝葉斯等等)等方式訓練模型,得出模型后再用來識別新文本的情感傾向,,比較像垃圾郵件的分類方法,,首先精挑一些垃圾郵件和正常郵件,讓模型學習,,然后再將模型用于垃圾郵件的分選,。

1.2.3.一種準確率幾達87%的新方法

本書介紹一種新方法,準確率高于常見的分析方式,,而且仍有提升空間,。

1.2.4.情感分析一些積累知識和方向

首先我們應感感謝一些前輩的積累工作,就詞典方面中國知網(wǎng)的研究者整理出了知網(wǎng)情感hownet詞典,,更新地址:http://www./html/c_bulletin_2007.htm,,另外還有臺灣大學整理的臺灣大學情感NTUSD,還有富士通公司的情感詞典,、程度詞典等等,。
除了情感詞典以外,情感分析語料庫方面也有不錯的工作積累,,比如清華大學李軍標注的情感分析語料庫等等,,以及Tang先生等人另辟蹊徑根據(jù)表情符號標注微博情感語料庫類別的方法。
以上都是非常優(yōu)秀的工作,,本書將大量采用前人的研究成果,,但站在巨人的肩上能不能看得更遠就另是一說啦?;诙嗄陱氖挛谋就诰蚝妥匀徽Z言分析工作的經(jīng)驗,,在情感分析方案設計和評價時我覺得應該考慮一下幾點:

1.是否需要詞典
2.是否具有跨行業(yè)分析的功能
3.使用什么算法,是分類任務還是分值預測,,這關系到情感分析的細膩細膩度問題
4.是否需要使用規(guī)則及其與程序速度的平衡關系
5.是否關注情感歸屬問題,,即主體詞和情感的歸屬關系,是整體層次還是單個文本的個體層次
6.準確率和速度

以上算是情感分析的幾個基本問題,,本章盡量從這些方面探索實現(xiàn),。

2.文本分析的基本武器:工欲善其事

工欲善其事,必先利其器,,R和python都是數(shù)據(jù)挖掘的利器,,雖然我們選擇了使用R做情感分析,但我個人認為python更具后發(fā)優(yōu)勢,,如果你搜索自然語言處理的話,,會發(fā)現(xiàn)很多內(nèi)容和python有關,,至于其他方面的比較,個人認為沒有必要,,只看這一點就ok了,。

2.1.Rjava包配置

既然選擇了R語言,就需要將R語言打造一番,,首先RJava包需要安裝,,它是R語言和Java的通信接口,允許在R中直接調(diào)用Java的對象和方法,,恰恰能滿足很多包的需要,,比如Rwordseg。
Linux環(huán)境下只要R與Java的版本對應即可使用常規(guī)方法安裝RJava,,而windows環(huán)境下就比較麻煩,,首先要安裝java,去oracle官網(wǎng)下載JDK版安裝包,,注意,,這里是jdk不是jre,是64位還是32位要和R版本相同,。
然后需要安裝Rtools,,下載地址http://cran./bin/windows/Rtools/,,當然要選擇和R匹配的Rtools,。
完成以上工作以后需要配置環(huán)境,win7右鍵我的電腦——高級系統(tǒng)設置——環(huán)境變量,,在環(huán)境變量中分別新建或添加相應的環(huán)境路徑,。
第一個classpath,新建classpath添加下面代碼

classpath
.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;C:\Program Files\R\R-3.2.1\library\rJava\jri

這里最后一個值有時需要指定到jri的版本是x64還是i386,,如果是64,,那么需要C:\Program Files\R\R-3.2.1\library\rJava\jri\x64,有時又不需要這么指定,真是一件神奇的事情,。

第二個JAVA_HOME,,新建,然后把下面的內(nèi)容添加進去

JAVA_HOME
C:\Program Files\Java\jdk1.8.0_51

第三個Path,,新建path,注意一下所有的軟件都要區(qū)分i386或x64

Path
C:\Rtools\bin;C:\Rtools\gcc-4.6.3\bin;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;C:\Program Files\R\R-3.2.1\bin\i386;C:\Program Files\R\R-3.2.1\bin\x64;C:\Program Files\Java\jdk1.8.0_51\jre\bin\server

第四個R_HOME,,添加

R_HOME
C:\Program Files\R\R-3.2.1

以上所有路徑均是你的軟件安裝路徑,其他不需要修改,。

安裝rJava包
if (!suppressWarnings(require("rJava"))) {
install.packages("rJava")
require("rJava")
}
.jinit()
s <- .jnew("java/lang/String", "Hello World!")
s
#[1] "Java-Object{Hello World!}"

如果s正常返回"Java-Object{Hello World!}"則RJava已經(jīng)成功了,。只有RJava配置成功了,Rwordseg安裝才可能成功,,前者是后者的依賴包,。

2.2.Rwordseg包安裝

如果返回不正常說明你的RJava還沒安裝好,,需要重新安裝,Rwordseg是我接觸最早的中文分詞包,,所以情有獨鐘,,并不是因為它多么優(yōu)秀,而是覺得分詞是文本分析的基礎工作,,就其準確性而言,,各種方法之間實在沒有實質(zhì)性的差別,因此也就沒有養(yǎng)成換來換去的壞毛病,。
其實,,有一點很奇怪,大家口口聲聲玩大數(shù)據(jù),,但往往在某些細節(jié)問題上止步不前,,比如為了分詞準確性提高一個千分點,花費大量的時間,、財力和精力,,我請問,這些改變對數(shù)億級的文本分析結果能有多大的影響呢,。
另外,,數(shù)據(jù)量巨大的分析保證我們在群體上的精確性,這也是統(tǒng)計的本質(zhì),,而有些人在評價結果時可能糾結于極個別的個體,,這本就是一種本末倒置的思維。如果我們的自變量是由個體組成的,,必然需要從群體上評價準確性,,而不是糾結于黑天鵝事件。至于防止黑天鵝事件,,自然可以設計一套風險管理措施,,比如可以分化賭注,多玩幾次,。扯遠了,,繼續(xù)安裝Rwordseg。

安裝Rwordseg
install.packages("Rwordseg", repos = "http://R-Forge.R-project.org")#這一步要完成需要安裝Rtools
library(rJava)
library(Rwordseg)
segmentCN("在此對原作者孫健表示強烈的敬意!")

如果在線安裝不成功,,可以下載本地安裝,。

下載
https://r-forge./R/?group_id=1054

本地安裝很簡單,如果你使用Rstudio編輯器,,點擊tools,,選install.packages就可以安裝。如果segmentCN函數(shù)分詞成功就ok了,,報錯就自求多福吧,!

2.3.jieba分詞包安裝

雖然我比較執(zhí)著于Rwordseg,,并不代表各位看管執(zhí)著于我的執(zhí)著,推薦結巴分詞包,,小巧玲瓏,,沒有那么多幺蛾子,而且R版本和python版本都有,,除了詞性標注等分詞包必備功能以外,,jiebaR還加入了一些基礎的文本分析算法,比如提取關鍵字(TFIDF),、分析文本相似性等等,,真是老少咸宜。

安裝jiebaR
library(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 <- segment("江州市長江大橋參加了長江大橋的通車儀式", seg)

如果使用install_github函數(shù)安裝github上的包,需要調(diào)取devtools包,,而該包需要Rtools,,這也是提前安裝Rtools的原因;另外jiebaR使用Rcpp開發(fā),,因此需要安裝調(diào)取Rcpp包,。
jiebaR其實是一個刀架,里面的每一把刀是一個分詞引擎(是的,,好幾種),,通過worker函數(shù)初始化引擎,建議不要更改默認設置(個人認為很多函數(shù)的默認設置必有其合理性),,指定分詞引擎后,,只需要將文本通過<=符號賦值給分詞引擎即可,,有兩種方式:其一直接賦值一句話,;其二指定文本路徑,分詞結果存放在相應的路徑內(nèi),;當然也可以像使用Rwordseg包的segmentCN函數(shù)一樣使用segment函數(shù)分詞,,只不過后者需要指定分詞引擎。
之所以多說了兩句,,是為了努力說服大家盡量使用jiebaR,,但是下面的內(nèi)容我們主要使用Rwordseg包分詞,是不是很變態(tài),?其實就分詞這段不一樣而已,。

3.基于詞典的情感分析的效率高過瞎猜么?

上面已經(jīng)簡單介紹了基于詞典的情感分析的過程,,一般經(jīng)過以下幾個過程:數(shù)據(jù)整理,、詞典整理,、情感詞匹配、計算情感得分和方法評估等過程,。這種分析方法因其思路簡單而遭人詬病,,更有甚者說分析效果趕不上猴子瞎猜,咱不看廣告,,看療效,。

3.1.數(shù)據(jù)整理及詞典構建

這一節(jié)我們完成文本語料庫和詞典的整理,使用譚松波和清華大學李軍等人標注的語料庫進行分析,,詞典方面使用已經(jīng)公開的詞典資源,,包括臺灣大學、中國知網(wǎng)等網(wǎng)站公布的情感詞典,。

3.1.1.數(shù)據(jù)整理

語料庫共包含兩個數(shù)據(jù)集:清華大學李軍標注的近24000個酒店評論文本和譚松波整理的12000個來自京東,、攜程、當當網(wǎng)的跨行業(yè)評論文本,。李軍的語料庫(review_sentiment)包括兩個數(shù)據(jù)集(訓練集和測試集)和兩個標注表(訓練標注表和測試標注表),,標注表注明了文本的情感傾向,正向為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 <- list.files(reviewpath, pattern = "*.txt$", full.names = TRUE)

上面第一句設定了文件存放的路徑,,list.files函數(shù)獲取該路徑下所有文件的文件名,如果full.names參數(shù)為真,,則返回完整的路徑,,反之返回文件名稱,pattern設置符合正則表達式的規(guī)則,,僅提取符合要求的文件,,防止讀入系統(tǒng)文件,這里僅匹配以.txt結尾的文件,。

批量讀入文本
read.txt <- function(x) {
des <- readLines(x)
return(paste(des, collapse = ""))
}
review <- lapply(completepath, read.txt)
#There were 50 or more warnings (use warnings() to see the first 50)

上面剛開始構造了一個函數(shù)read.txt,,目的是將一個完整路徑的txt文件加載進來,并將每個段落粘貼在一起,,函數(shù)是一個非常中規(guī)中矩的R函數(shù)模式:第一句,,打開文件并分行讀取,然后將每一行粘貼在一起,,最后返回完整的文本內(nèi)容,。在R的自編函數(shù)末尾return聲明返回的內(nèi)容,如果不聲明僅返回函數(shù)中形成的最后一個對象。paste函數(shù)有兩個指定間隔符號的參數(shù):sep和collapse,,前者將兩個對象或兩個對象的元素對應粘在一起時使用,,后者是融合的意思,將向量或者list的元素粘在一起時使用,。第二句使用了lapply函數(shù),,避免了每一個文本循環(huán)讀取,保持了代碼的整潔,,提高了運行速度,。到這里,review這個list就記錄了文件下的所有文本內(nèi)容,,它的每一個元素是一個文本的內(nèi)容,。如果你忍不住想用循環(huán)處理,說明你還處于低級階段,,不到萬不得已絕對不能輕易使用R語言循環(huán),。另外,如果程序警告,,這里可能是部分文件最后一行沒有換行導致,,不用擔心。

list轉數(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) #有時需要使用\\\t 
reviewdf$msg <- gsub(",", ",,", reviewdf$msg)
reviewdf$msg <- gsub("~|'", "", reviewdf$msg)
reviewdf$msg <- gsub("\\\"", "", reviewdf$msg)
# Warning message:
# In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, :
# EOF within quoted string

1行讀取文件名稱,;2行名稱和文本內(nèi)容按列(cbind)捆綁在一起成為一個新的數(shù)據(jù)框;3行修改列名,;4行移除文本中的所有空格,,第一個參數(shù)指定正則表達式模式,第二個參數(shù)指定替換為的內(nèi)容,;5,、6行替換所有的\t和英文逗號,因為csv各式的文檔以英文逗號為分隔符,,文中有英文逗號會報錯,,除了英文逗號可能引起read.csv函數(shù)讀取csv文件報錯以外,還有英文單引號(’),、英文雙引號(”),、波浪號(~),,都會引起讀取時發(fā)生警告,,帶來csv文件或txt文件讀取不完整的后果,如果一旦發(fā)生“EOF within quoted string”就要想辦法找出這類符號將其替換掉,;因此,,7行依次替換了波浪號(~)和英文單引號(’),它們之間用“|”符號隔開,表示或的關系,;8行替換所有的英文雙引號(”),,因為雙引號在R中有特殊含義,所以要使用三個斜杠(\\)轉義,。數(shù)據(jù)算是基本處理了一下,,下一步要給文本匹配上情感標注。

關聯(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
# test <- reviewdf

read.table讀取訓練集文本標注數(shù)據(jù),,該函數(shù)是R中讀取數(shù)據(jù)的根函數(shù),,很多函數(shù)都是繼承的read.table,所以看到格式陌生的文件,,可以嘗試使用這個函數(shù)讀取,,2行更改標注文檔的列名稱,id列和reviewdf中的id列相同,,plyr包里的join函數(shù)會根據(jù)名稱相同的列進行匹配關聯(lián),,join默認設置下執(zhí)行左連接;然后將整理好預料賦值給train備用,。這樣李軍標注的訓練數(shù)據(jù)集就整理完成了,,整理測試數(shù)據(jù)集使用相同的代碼,將注釋掉的代碼恢復,,同時將上一句注釋掉即可,。
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 <- list.files(reviewpath, pattern = "*.txt$", full.names = TRUE)

讀取dataset_602124數(shù)據(jù)集,,設定文嘉路徑,。

批量讀入文本
review <- lapply(completepath, read.txt) #自編函數(shù)read.txt
docname <- 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) #有時需要使用\\\t 
reviewdf$msg <- gsub(",", ",", reviewdf$msg)
reviewdf$msg <- gsub("~|'", "", reviewdf$msg)
reviewdf$msg <- gsub("\\\"", "", reviewdf$msg)
pos6 <- reviewdf
# neg6 <- reviewdf
temp <- rbind(pos6, neg6)
train <- rbind(train, temp)
write.csv(train, 'H:/zimeiti/窺視數(shù)據(jù)背后的邏輯:基于R與python/bookwriting/第十二章輿情分析/data/train.csv', row.names = FALSE)
# write.csv(test, 'H:/zimeiti/窺視數(shù)據(jù)背后的邏輯:基于R與python/bookwriting/第十二章輿情分析/rawdata/review_sentiment/test.csv', row.names = FALSE)

1,、2行不多說,;3行為讀入的數(shù)據(jù)添加情感傾向標簽,正向數(shù)據(jù)全部標注為1,,負向數(shù)據(jù)全部標注為-1(暫時注釋掉了),,rep函數(shù)復制產(chǎn)生一個和向量docname等長的向量,;4、5行捆綁3列生成數(shù)據(jù)框,,并重新命名3列,,列順序、名稱和train數(shù)據(jù)框保持一致,;6,、7、8,、9,、10行不多說了;11,、12,、13行將已有的數(shù)據(jù)按行粘(rbind)在一起,生成用于訓練的語料庫train,,測試的語料庫僅僅使用李軍的測試集test即可(注釋代碼),;只需將train和test輸出到專用的數(shù)據(jù)存儲文件夾data,write.csv輸出語料文檔,,輸出格式為csv,,參數(shù)row.names設置為非,表示不輸出行編號,。
這樣測試集和訓練集語料庫都已經(jīng)準備好了,,并存儲在data文件夾里備用。

3.1.2.詞典構建

盡管我們搜集了很多部情感詞典(參看電子文檔),,經(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$", full.names = TRUE)
dict <- lapply(completepath, readLines)
dict <- unique(unlist(dict))
pos <- dict
# neg <- dict
write.csv(pos, 'H:/zimeiti/窺視數(shù)據(jù)背后的邏輯:基于R與python/bookwriting/第十二章輿情分析/dict/pos.csv', row.names = FALSE)
# write.csv(neg, 'H:/zimeiti/窺視數(shù)據(jù)背后的邏輯:基于R與python/bookwriting/第十二章輿情分析/dict/neg.csv', row.names = FALSE)

1,、2行不多說,3行l(wèi)apply函數(shù)直接使用了readLines函數(shù),,將每個文件按行讀?。?行將list解散(unlist)成為一個向量,,各個詞典中肯定有相互重復的詞,,所以使用unique函數(shù)去一次重,這樣詞典的正向詞匯就整理完成了,,負向詞匯使用相同的方法,,部分特異的代碼可以使用注釋掉的內(nèi)容,;最后將正負向詞匯文件輸出到dict文件夾即可,。

3.2.分詞整理

基于詞典的情感分析實際上算法和模型先入為主的預訂了:統(tǒng)計文本正負情感詞的得分之和,,如果得分為正,則文本情感傾向為正,,反之亦然,。所以不需要訓練模型,直接使用測試集測試一下即可,。
基于以上,,首先要進行中文分詞,在分詞之前要將文本預處理一下,,包括清除一些英文和數(shù)字等等,。

分詞預處理
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, ]
sentence <- sentence[!nchar(sentence) < 2]

1行讀取csv文件,并設置stringsAsFactors參數(shù)為非,,不將字符轉化為因子,;2行將文本內(nèi)容轉化為向量sentence;3行清除數(shù)字;4行清除英文字符;由于某些文檔可能是由外國人或者一些裝逼漢寫的評價,,全部是英文,,經(jīng)過以上幾步處理就只剩下了dot符號,所以5行將這類符號清除,;經(jīng)過以上處理,,可能一些文本已經(jīng)變成了空值或者小于兩個字符了,所以6行將原數(shù)據(jù)框中這些空值文本清除,,7行將對應的sentence里的空值清除,,注意6行的篩選使用sentence是否為空值完成的,所以要先篩除數(shù)據(jù)框test內(nèi)的空值,,然后再篩除sentence內(nèi)的空值,;最后兩句篩出字符數(shù)小于2的文本,nchar函數(shù)對字符計數(shù),,英文嘆號為R語言里的“非”函數(shù),。
另外既然整合了大量的詞典,就要盡量保證分詞器能夠把這些情感詞匯分出來,,所以需要將情感詞典添加到分詞器的詞典中去,,雖然這種方法在特殊情況下并不一定湊效,但至少增加了分詞器在分詞時的計算權重,。

添加詞典
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)建權重向量,這里任何一個正向詞匯的權重均為1,,負向詞匯的權重為-1,;3行為pos添加權重列,;4、5,、6行作用同上,,為負向情感詞添加權重列;7行將正負情感詞按行粘貼在一起,;8行更改列名稱,;因為各個詞典對情感詞的傾向定義可能矛盾,出現(xiàn)同一個詞具有情感正向和負向兩種傾向的情況,,盡管這種情況更加符合現(xiàn)實,,但是違背了基于詞典的情感分析的原假設,所以要將這些詞去重,,我們的方法是一個詞如果同時屬于正向和負向,,僅保留正向分類,9行duplicated函數(shù)的作用和unique函數(shù)比較相似,,它返回重復項的位置編號,,比如“愛”這個詞在數(shù)據(jù)框和向量中第二次及更多次出現(xiàn)的位置,第一次出現(xiàn)的位置不返回,,如果加了“非”函數(shù),,表示僅保留第一次出現(xiàn)的詞匯;10,、11,、12行提取posneg的term列并使用Rwordseg包添加自定義詞典的函數(shù)insertWords將詞典添加入分詞器。

下面就可以分詞了,,Rwordseg分詞包分詞函數(shù)segmentCN,,僅需將向量、字符串,、或者文本文件地址賦值給參數(shù)strwords即可,,結果是一個和原向量等長的list,list的每一個元素是一個詞語字符向量,,對應原來的文本向量,,函數(shù)的其他參數(shù)僅nosymbol需要關注一下,指定是否保留文本中的符號,。

分詞
system.time(x <- segmentCN(strwords = sentence)) 
temp <- lapply(x, length)
temp <- unlist(temp)
id <- rep(test[, "id"], temp)
label <- rep(test[, "label"], temp)
term <- unlist(x)
testterm <- as.data.frame(cbind(id, term, label), stringsAsFactors = F)

1行使用分詞函數(shù)segmentCN分詞,,其結果是一個和sentence等長的list,list的每一個元素是對應文本的分詞結果,,這里使用了system.time函數(shù)返回代碼塊的執(zhí)行時間,,建議每次可能耗費時間較長的過程,都要使用少量數(shù)據(jù)預估一下時間,,這是一個優(yōu)秀的習慣,;但是需要將分詞結果和文本的id關聯(lián)上,,那文本分出多少個詞就要重復多少次文本id,所以2行使用lapply函數(shù)返回x中每一個元素的長度,即文本分出多少個詞,;lapply返回的是一個list,,所以3行unlist;然后4行將每一個對應的id復制相應的次數(shù),,就可以和詞匯對應了,;5行將id對應的情感傾向標簽復制相同的次數(shù),;6行將list解散為向量,;7行將一一對應的三個向量按列捆綁為數(shù)據(jù)框,分詞整理就基本結束了,。
在分析過程中,,難免會產(chǎn)生很多中間變量,它們會占用大量內(nèi)存,,雖然dplyr包的管道函數(shù)看似解決了這個問題,,但是畢竟用處不廣。我通常會將所有的臨時中間變量命名為temp,,只需要保證下一個temp出現(xiàn)之前,,臨時變量不會再延用就可以了,如上面的temp,,這樣中間變量始終只有一個,,即temp。
雖然算法已經(jīng)足夠簡單,,沒有必要去除停用詞,,但是為了顯示誠意,文本分析里每一個環(huán)節(jié)都不能少,,這里還是認真的去除停用詞,,真的不是走過場哦。

去除停用詞
stopword <- read.csv("H:/zimeiti/窺視數(shù)據(jù)背后的邏輯:基于R與python/bookwriting/第十二章輿情分析/dict/stopword.csv", header = T, sep = ",", stringsAsFactors = F)
stopword <- stopword[!stopword$term %in% posneg$term,]
testterm <- testterm[!testterm$term %in% stopword,]

讀取停用詞典,;停用詞中有可能有些詞有感情色彩,,既然要去除停用詞,首先要將這類具有情感色彩的停用詞從停用詞表中去除,,函數(shù)%in%在posneg$term中查找stopword的元素,,如果查到了就返回真值,沒查到就返回假,,結果是一個和stopword等長的波爾值向量,,“非”函數(shù)將布爾值反向;3行去除停用詞,。

3.3.情感指數(shù)計算

現(xiàn)在有了分詞表testterm和情感詞典posneg,,另外已經(jīng)給情感詞添加了權重列,,那么只需要匹配term列,即可給testterm表關聯(lián)上情感權重,,然后就可以計算篇文本的情感得分了,,需要注意的是如果一個情感詞出現(xiàn)多次,其權重加倍,,當然你也可以嘗試對詞匯去重,,每個情感詞只記錄一次,也許會有出乎意料的結果,。

關聯(lián)情感詞權重
library(plyr)
testterm <- join(testterm, posneg)
testterm <- testterm[!is.na(testterm$weight), ]
head(testterm)

使用plyr包的join函數(shù)進行左關聯(lián),,給testterm表關聯(lián)上情感權重,然后篩除那些沒有權重的非情感詞匯,。奇怪的是很多看似不具有情感的詞,,這些詞典竟然也把他們當成了情感詞,看來還需要優(yōu)化情感詞典,。

計算情感指數(shù)
大音如霜(dayinrushuang)

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導購買等信息,謹防詐騙,。如發(fā)現(xiàn)有害或侵權內(nèi)容,,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多