R语言文本挖掘tm包详解(附代码实现)
- 文本挖掘相關介紹
- 1什么是文本挖掘
- 2NLP
- 3 分詞
- 4 OCR
- 5 常用算法
- 6 文本挖掘處理流程
- 7 相應R包簡介
- 8 文本處理
- 詞干化stemming snowball包
- 記號化Tokenization RWeka包
- 中文分詞 Rwordseg包
- 9 tm包常用操作介紹
- tm包具體操作
- 建立語料庫
- 導出語料庫
- 語料庫檢索和查看
- 元數據查看與管理
- 詞條-文檔關系矩陣
- 1創建詞條-文檔關系矩陣
- 2文檔距離計算
- 文本聚類
- 層次聚類法
- Kmeans聚類
- K中心法聚類
- Knn算法
- 支持向量機SVM
文本挖掘相關介紹
1、什么是文本挖掘
文本挖掘是抽取有效、新穎、有用、可理解的、散布在文本文件中的有價值知識,并且利用這些知識更好地組織信息的過程。
在文本挖掘領域中,文本自動分類,判同,情感分析是文本挖掘比較常見的應用 。文本分類技術主要應用在百度新聞,谷歌新聞等新聞網站,對新聞內容進行自動分類,并且實現根據用戶專業傾向的文檔推薦;搜索引擎去重,論文抄襲判別系統等。情感分析技術主要應用在電商評論分析系統,政府和媒體輿情監測系統等。語意理解技術應用在機器翻譯、聊天機器人等。
2、NLP
文本挖掘可以視為NLP(Natural language processing,自然語言處理)的一個子領域,目標是在大量非結構化文本中整理析取出有價值的內容。由于人類語言具有很高的復雜性,例如不同語言間語法不同,組成方式不同,還有語言種類的多樣性,使得NLP是目前機器學習領域最困難的技術之一,里面的難點大部分成為各個應用領域(搜索引擎,情感識別,機器寫作等等)的核心障礙,是實現高度智能機器人的關鍵技術。NLP大部分方法適用于不同的語種,也有部分只適合特定語種。
NLP通常包含兩方面內容:詞法、語法。詞法的經典問題為分詞、拼寫檢查、語音識別等;語法的經典問題有詞類識別、詞義消歧、結構分析等;語音識別領域經典問題有語言識別、語音指令、電話監聽、語音生成等。
3、 分詞
在英語等語言中,詞與詞之間存在著空格,因此在進行處理過程中不需要對其進行分詞處理,但由于漢語等語言中詞與詞之間沒有存在分隔,因此需要對其進行分詞處理。分詞處理能夠避免不分詞所引發的全表掃描,全表掃描效率低且內存消耗大。
4、 OCR
OCR : optional character recognition 印刷體識別和手寫體識別、字形析取
應用:車牌識別、名片識別等
5、 常用算法
(算法需要一定的數學和統計學基礎)
貝葉斯分類器
隱馬爾科夫過程
有限狀態自動機(FSA):用于文本判同等
6、 文本挖掘處理流程
7、 相應R包簡介
語音與語音處理: emu包
詞庫數據庫: wordnet包(英文庫)
關鍵字提取和通用字符串操作: RKEA包;gsubfn包,tau包
自然語言處理: openNLP包,RWeka包;snowball包(分詞);Rstem包;KoNLP包
文本挖掘: tm包(相對完整和綜合);lsa包;topicmodels包;RTextTools包;textact包;zipfR包;……
8、 文本處理
1.詞干化stemming snowball包
2.記號化Tokenization RWeka包
3.中文分詞 Rwordseg包
Rwordseg包需下載安裝,網址:
https://r-forge.r-project.org/R/?group_id=1054
在上面網址中下載Rwordseg 如果是64位的話就要下載.zip文件
中文分詞比較有名的包非Rwordseg和jieba莫屬,他們采用的算法大同小異,但有一個地方有所差別:Rwordseg在分詞之前會去掉文本中所有的符號,這樣就會造成原本分開的句子前后相連,本來是分開的兩個字也許連在一起就是一個詞了。
而jieba分詞包不會去掉任何符號,而且返回的結果里面也會有符號。
9、 tm包常用操作介紹
1.DirSource:處理目錄
2.VectorSource:由文檔構成向量
3.DataframeSource:數據框,就像CSV 文件
4.Map操作:對文檔內容應用轉換函數
5.Xml轉化為純文本
6.去除多余空白
7.去除停用詞
8.填充
9.Reduce操作:將多個轉換函數的輸出合并成一個
tm包具體操作
tm包版本問題:代碼基于tm包0.6版本
關于版本差異問題,詳見:https://cran.r-project.org/web/packages/tm/news.html
1.建立語料庫
建立動態語料庫 Corpus(x,……)
Corpus(x, readerControl = list(reader=x$DefaultReader,language="en"),|…… )
建立靜態語料庫 Pcorpus(x,……)
PCorpus(x, readerControl = list(reader=x$DefaultReader,language="en"),dbControl = list(dbName="",dbType="DB1"),…… )
x參數有如下三種選擇:
DirSource
VectorSource
DataframeSource
(可以在readercontrol中的language中改變參數,建立各種語言的語料庫,詳見https://zh.wikipedia.org/zh/ISO_639-1%E4%BB%A3%E7%A0%81%E8%A1%A8)
另外,reader中可選參數如下,可以通過選擇不同的參數讀取不同形式的文件:
例:
#利用DirSource ovid1<-Corpus(DirSource("d:/Program Files/R/R-3.3.3/library/tm/texts/txt"), readerControl = list(language = "lat")) inspect(ovid1) #inspect可輸出語料庫的內容 #利用VectorSource docs <- c("This is a text.", "This another one.") ovid2 <- Corpus(VectorSource(docs)) inspect(ovid2) #利用DataframeSource data <- read.csv("D:/data/Finance Report 2012.csv") ovid3 <- Corpus(DataframeSource(data),readerControl=list(language="zh")) inspect(ovid3)2.導出語料庫
方法:writeCorpus(x, path = ".", filenames = NULL)
例:
3.語料庫檢索和查看
ovid[] 查找語料庫的某篇文檔
ovid[[]] 文檔內容
c(ovid,ovid) 語料庫拼接
lapply() 函數
length() 語料庫文檔數目
show()/print() 語料庫信息
summary() 語料庫信息(詳細)
inspect(ovid1[n:m]) 查找語料庫第n至m個文檔
meta(ovid[[n]], "id") 查看第n個語料庫的id
identical(ovid[[2]], ovid[["ovid_2.txt"]])查看第二個語料庫名稱是否為某個值
inspect(ovid[[2]]) 查看第二個文檔的詳細內容
lapply(ovid[1:2], as.character)分行查看內容
例1 按照文檔的屬性進行檢索
#根據id和heading屬性進行檢索 reut21578 <- system.file("texts", "crude", package = "tm") reuters <- Corpus(DirSource(reut21578), readerControl = list(reader = readReut21578XML)) #注意使用readReut21578XML時需要安裝xml包,否則出錯:Error in loadNamespace(name) : there is no package called ‘XML’idx <- meta(reuters, "id") == '237' & meta(reuters, "heading") == 'INDONESIA SEEN AT CROSSROADS OVER ECONOMIC CHANGE' reuters[idx] #查看搜索結果 inspect(reuters[idx][[1]])例2 全文檢索
#檢索文中含有某個單詞的文檔 data("crude") tm_filter(crude, FUN = function(x) any(grep("co[m]?pany", content(x))))tm_filter也可以換作tm_index,區別在于tm_filter返回結果為語料庫形式而tm_index返回結果則為true/false。
例3 語料庫轉換
#大小寫轉換 lapply(ovid,toupper) inspect(tm_map(ovid,toupper))4.元數據查看與管理
元數據(core data)用于標記語料庫的附件信息,它具有兩個級別:一個為語料庫元數據,一個為文檔元數據。Simple Dublin Core是一種帶有以下15種特定的數據元素的元數據。元數據只記錄語料庫或文檔的信息,與文檔相互獨立,互不影響。
–標題(Title)
–創建者(Creator)
–主題(Subject)
–描述(Description)
–發行者(Publisher)
–資助者(Contributor)
–日期(Date)
–類型(Type)
–格式(Format)
–標識符(Identifier)
–來源(Source)
–語言(Language)
–關系(Relation)
–范圍(Coverage)
–權限(Rights)
對core data或者Simple Dublin Core查看和管理方法如下:
meta(crude[[1]])查看語料庫元數據信息
meta(crude)查看語料庫元數據的格式
例
5.詞條-文檔關系矩陣
1、創建詞條-文檔關系矩陣
為了后續建模的需要,一般需要對語料庫創立詞條-文檔關系矩陣,創建詞條-文檔關系矩陣所用到的函數為:
TermDocumentMatrix(x, control = list())
DocumentTermMatrix(x, control = list())
它們創建的矩陣互為轉置矩陣。
control = list()中的可選參數有:removePunctuation,stopwords,weighting,stemming等,其中weighting可以計算詞條權重,有 weightTf, weightTfIdf, weightBin, 和weightSMART4種。
2、文檔距離計算
使用方法:
dist(rbind(x, y), method = "binary" ) dist(rbind(x, y), method = "canberra" ) dist(rbind(x, y), method = "maximum") dist(rbind(x, y), method = "manhattan")有的時候,不同量級間的數據進行距離計算時,會受量級的影響,為了使到各個變量平等地發揮作用,我們需要對數據進行中心化和標準化的變換。
scale(x, center = TRUE, scale = TRUE)6.文本聚類
1.層次聚類法
算法主要思想
1. 開始時,每個樣本各自作為一類
2. 規定某種度量作為樣本之間的距離及類與類之間的距離,并計算之
3. 將距離最短的兩個類合并為一個新類
4. 重復2-3,即不斷合并最近的兩個類,每次減少一個類,直至所有樣本被合并為一類
代碼實現
data(crude) crudeDTM <- DocumentTermMatrix(crude, control = list(stopwords = TRUE)) #crudeDTM <- removeSparseTerms(crudeDTM, 0.8) #可以選擇去除權重較小的項 crudeDTM.matrix <- as.matrix(crudeDTM) d <- dist(crudeDTM.matrix,method="euclidean") hclustRes <- hclust(d,method="complete") hclustRes.type <- cutree(hclustRes,k=5) #按聚類結果分5個類別 length(hclustRes.type) hclustRes.type #查看分類結果 plot(hclustRes, xlab = '') #畫出聚類系譜圖2.Kmeans聚類
算法主要思想
1. 選擇K個點作為初始質心
2. 將每個點指派到最近的質心,形成K個簇(聚類)
3. 重新計算每個簇的質心
4. 重復2-3直至質心不發生變化
代碼實現
k <- 5 kmeansRes <- kmeans(crudeDTM.matrix,k) #k是聚類數 mode(kmeansRes) #kmeansRes的內容 names(kmeansRes) kmeansRes$cluster #聚類結果 kmeansRes$size #每個類別下有多少條數據 #sort(kmeansRes$cluster) #對分類情況進行排序 ''' "cluster"是一個整數向量,用于表示記錄所屬的聚類 "centers"是一個矩陣,表示每聚類中各個變量的中心點 "totss"表示所生成聚類的總體距離平方和 "withinss"表示各個聚類組內的距離平方和 "tot.withinss"表示聚類組內的距離平方和總量 "betweenss"表示聚類組間的聚類平方和總量 "size"表示每個聚類組中成員的數量 '''kmeans算法優缺點
- 有效率,而且不容易受初始值選擇的影響
- 不能處理非球形的簇
- 不能處理不同尺寸,不同密度的簇
- 離群值可能有較大干擾(因此要先剔除)
3.K中心法聚類
算法主要思想
1. 隨機選擇k個點作為“中心點”
2. 計算剩余的點到這k個中心點的距離,每個點被分配到最近的中心點組成聚簇
3. 隨機選擇一個非中心點Or,用它代替某個現有的中心點Oj,計算這個代換的總代價S
4. 如果S<0,則用Or代替Oj,形成新的k個中心點集合
5. 重復2,直至中心點集合不發生變化
代碼實現
library(cluster) pa<-pam(d,2) #分兩類 summary(pa)k中心法優缺點:
- K中心法的優點:對于“噪音較大和存在離群值的情況,K中心法更加健壯,不像Kmeans那樣容易受到極端數據影響
- K中心法的缺點:執行代價更高
4.Knn算法
算法主要思想
1. 選取k個和待分類點距離最近的樣本點
2. 看1中的樣本點的分類情況,投票決定待分類點所屬的類
代碼實現
library("class") library("kernlab") data(spam) train <- rbind(spam[1:1360, ], spam[1814:3905, ]) trainCl <- train[,"type"]test <- rbind(spam[1361:1813, ], spam[3906:4601, ]) trueCl <- test[,"type"]knnCl <- knn(train[,-58], test[,-58], trainCl) (nnTable <- table("1-NN" = knnCl, "Reuters" = trueCl)) sum(diag(nnTable))/nrow(test) #查看分類正確率5.支持向量機SVM
算法主要思想
它是針對線性可分情況進行分析,對于線性不可分的情況,通過使用非線性映射算法將低維輸入空間線性不可分的樣本轉化為高維特征空間使其線性可分,從而 使得高維特征空間采用線性算法對樣本的非線性特征進行線性分析成為可能。
算法實現
ksvmTrain <- ksvm(type ~ ., data = train) svmCl <- predict(ksvmTrain, test[,-58]) (svmTable <- table("SVM" = svmCl, "Reuters" = trueCl)) sum(diag(svmTable))/nrow(test)總結
以上是生活随笔為你收集整理的R语言文本挖掘tm包详解(附代码实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【JAVAFX 构建中国地图2021最新
- 下一篇: 既生瑜(zookeeper)何生亮(re