NLP自然語言處理(二)——基礎文本分析
4 人贊了文章2017-02-08 余文華 樂享數據DataScientists
這是NLP自然語言處理學習系列的第二篇,前面我們主要是從「詞」的角度,介紹了jieba分詞、詞性標註及關鍵詞提取的一些基礎問題。下面主要從「語義」角度,總結下如何運用R進行基礎的文本分析。
前言:基礎文本分析的主要步驟:
運用Rwordseg包進行中文分詞
運用tm包生成語料庫並進行清洗操作
創建文檔-詞頻矩陣(詞頻表)
進行文本分析(主題模型、聚類分析等)
文本分析可視化(詞雲、社交網路關係圖等)
一、運用Rwordseg包進行中文分詞
前面我們講過運用jieba分詞技術進行中文分詞處理,其實運用得最多的,是運用Rwordseg包進行中文分詞。就像通關打怪獸一樣,進行NLP自然語言處理,打的打一個怪獸就是對Rwordseg包進行安裝了,它依賴rJava包,因此需要預先安裝Java環境。它的安裝可見參考資料【1】。 用Rwordseg包分詞主要是segmentCN函數,例子如下。顯然「京津冀」屬於一個詞,如此我們可運用insertWords函數,臨時添加分詞詞典。如果想載入自定義詞典,可運用installDict函數【2】。 我們再以某新聞稿為例,進行文本分析。
library(Rwordseg)segmentCN("京津冀協同發展")
## [1] "京津" "冀" "協同" "發展"
insertWords("京津冀")segmentCN("京津冀協同發展")
## [1] "京津冀" "協同" "發展"
library(Rwordseg)bzc <- read.csv("bzc.csv",header = TRUE,stringsAsFactors = FALSE)sentence <- as.vector(bzc$contents)#下面都是為了清除文本中的垃圾sentence <- gsub("NA", "", sentence)#將"NA"符號替換sentence <- gsub("[[:digit:]]*", "", sentence) #清除數字及字母[a-zA-Z]sentence <- gsub("[a-zA-Z]", "", sentence)sentence <- sentence[!is.na(sentence)]x <- lapply(sentence, function(x) segmentCN(x, nature = TRUE))msgWords <- as.data.frame(cbind(rep(bzc[,2], unlist(lapply(x, length))), unlist(x), names(unlist(x))), stringsAsFactors = F)rownames(msgWords) <- seq(1:length(msgWords[,1]))names(msgWords) <- c("Docid", "Term","Nature")
生成一個分詞列表,一共7篇文章。
二、運用tm包生成語料庫並進行清洗操作
2.1去掉停詞操作
在生成語料庫前,可進行分詞的清洗工作,包括刪除數字、字母、特殊符號及去掉「啊、的、了、得、好」等停止詞。當然也可以在生成完語料庫後,運用tm包tm_mp函數進行操作,下面會提到。 經過清洗操作由2310個詞,清洗為1621個詞。
#載入stopword文件stopwords <- read.csv("stopword_CN.csv", header = T, sep = ",")msgWords <- msgWords[!(msgWords$Term %in% stopwords$term),]#去除停用詞
現在我們先來看看清洗後,創建個詞雲,查看詞的分布
library(tmcn)library(wordcloud)Freq_word <- getWordFreq(string = msgWords$Term)wordcloud(words = Freq_word$Word, freq = Freq_word$Freq,max.words = 40,random.color = TRUE, colors = rainbow(n = 7))
可以看到,效果並不是很好,一些我們不需要的詞,並未被刪除,如是一是可以在stopwords停詞表中添加些需要停止的詞,二是自創一個停詞表。我們試試第二種方法。
#新建停止詞stopwords_new <- c(會,處,局,市,年,二,二級,中,副)#排除停止詞Term <- msgWords[!(msgWords$Term %in% stopwords_new),]
2.2 創建語料庫
文本處理過程首先要擁有分析的語料(text corpus),因此分詞過後,首先要創建語料庫。tm包可以說是NLP最通用的框架了,在tm中主要的管理文件的結構被稱為語料庫(Corpus),代表了一系列的文檔集合。通過Corpus函數,創建動態語料庫【3】。
library(tm)corpus1 <- Corpus(VectorSource(x))#inspect(corpus1) #查看語料庫 #writeCorpus(corpus1)#保存為本地文件
2.3 運用tm包對語料庫進行清洗操作
主要使用tm_map函數處理語料的傳入函數,主要如下。由於tm包沒有中文停詞,需要運用到tmcn包中的stopwordsCN函數。
library(tmcn)#去除標籤,轉換為純文本corpus1 <- tm_map(corpus1,PlainTextDocument)#刪除空白corpus1 <- tm_map(corpus1,stripWhitespace)#去掉停止詞#corpus1 <- tm_map(corpus1,removeWords, stopwordsCN)#詞幹提取#corpus1 <- tm_map(corpus1,stemDocument)
三、創建文檔-詞頻矩陣(詞頻表)
創建一個文檔-詞頻矩陣是文本挖掘的基礎,可通過tm包創建,或自定義詞頻表創建。
3.1 tm包創建
dtm <- DocumentTermMatrix(corpus1)#查看文檔#inspect(dtm) #Non-/sparse entries: 482/2598 ---非0/是0 #Sparsity : 84% ---稀疏性 稀疏元素佔全部元素的比例 #Maximal term length: 23 ---切詞結果的字元最長那個的長度 #Weighting : term frequency (tf)---詞頻率 #如果需要考察多個文檔中特有辭彙的出現頻率,可以手工生成字典,並將它作為生成矩陣的參數#d<-c("質量","衛生","規範","推進") #以這幾個關鍵詞為查詢工具 #inspect(DocumentTermMatrix(corpus1,control=list(dictionary=d)))
在文檔詞頻矩陣上操作
#找出次數超過50的詞 findFreqTerms(dtm, 10)
## [1] "京津冀" "快速
檢測
工作" "快速
檢測
質量"
#找出與『京津冀』單詞相關係數在0.9以上的詞 findAssocs(dtm,"京津冀",0.98)
## $京津冀## 計生委
綜合 ## 0.98
#因為生成的矩陣是一個稀疏矩陣,再進行降維處理,之後轉為標準數據框格式 #我們可以去掉某些出現頻次太低的詞。dtm1<- removeSparseTerms(dtm, sparse=0.6) inspect(dtm1)
## <<DocumentTermMatrix (documents: 7, terms: 8)>>## Non-/sparse entries: 26/30## Sparsity : 54%## Maximal term length: 8## Weighting : term frequency (tf)## ## Terms## Docs 計生委
綜合 京津冀 快
檢 快速
檢測
工作## character(0) 1 3 0 4## character(0) 0 0 1 0## character(0) 0 0 4 2## character(0) 0 0 0 0## character(0) 0 0 0 0## character(0) 2 10 1 3## character(0) 1 5 1 2……
data <- as.data.frame(inspect(dtm1))
row.names(data)<- 1:7
3.2 手動製作頻數表
library(dplyr)library(reshape2)#建立一個全為1的列,方便統計Logic <- rep(1, length(msgWords[,1]))msgWords <- as.data.frame(cbind(msgWords, Logic), stringsAsFactors = F)msgTerm <- dcast(msgWords, Term ~ Docid, value.var = "Logic")#製作詞頻表msgTerm <- melt(msgTerm, id = 1)msgTerm <- msgTerm[which(msgTerm$value > 0),]names(msgTerm) <- c("Term", "Docid", "Freq")head(msgTerm)
## Term Docid Freq## 5 包括 2016年10月18日 1## 7 保證 2016年10月18日 3## 11 本次 2016年10月18日 3## 15 標準 2016年10月18日 1## 20 補充 2016年10月18日 1## 23 採樣 2016年10月18日 1
四、進行文本分析(主題模型、聚類分析等)
聚類分析
data.scale <- scale(data) d <- dist(data.scale, method = "euclidean") fit <- hclust(d, method="ward.D") #繪製聚類圖 plot(fit,main ="文件聚類分析",hang = -1)
主題分析
library(topicmodels)ctm <- CTM(dtm1, k = 2)terms(ctm, 2, 0.05)
## Topic 1 Topic 2 ## [1,] "快
檢" "京津冀" ## [2,] "市
衛生" "快速
檢測
工作"
五、可視化
除了以上的詞雲展示,還可以進行LDA主題分析後,進行社交網路關係展示。如下是進行可視化後圖形。
寫在最後
本篇是自然語言處理(NLP)的第二篇,其中主題模型並未詳細總結,在下面一篇中將重點介紹LDA主題模型、情感分析以及深度學習Word2vec進行詞嵌入學習。
參考資料
Rwordseg、Rweibo、tm的安裝http://www.dataguru.cn/thread-482875-1-1.html
【R文本挖掘】中文分詞Rwordseghttp://blog.163.com/zzz216@yeah/blog/static/162554684201412895732586/
【文本挖掘R】tm包http://blog.163.com/zzz216@yeah/blog/static/162554684201412892742116/
ChinaR2013-中文文本挖掘和tmcn包http://wenku.it168.com/d_001393502.shtml
R語言與NLP http://blog.csdn.net/column/details/13670.html
利用word2vec對關鍵詞進行聚類http://blog.csdn.net/zhaoxinfan/article/details/11069485
深度學習 word2vec 筆記http://www.open-open.com/lib/view/1420689477515#articleHeader0
要想獲取分析代碼,可查看原文,進入本人的GitHubhttps://github.com/Alven8816查看下載,或通過本人郵箱yuwenhuajiayou@sina.cn與本人聯繫
」樂享數據「個人公眾號,不代表任何團體利益,亦無任何商業目的。任何形式的轉載、演繹必須經過公眾號聯繫原作者獲得授權,保留一切權力。歡迎關注「樂享數據」。
推薦閱讀: