【R語言】依知乎問題標籤數據集繪圖(3月24日學習筆記)

老師給出的作業要求是根據數據集繪圖,這一題的難點依然在於對數據的處理。
在這裏插入圖片描述
老師給我們的原數據集如下圖
在這裏插入圖片描述
接下來我們需要運用R語言對數據進行處理
首先解決第一個問題

一、最頻繁的100個標籤及頻率

1.設置工作路徑與讀入數據

一般比較常用的數據讀取語句是

data = read.csv("train_data.csv",header = TRUE)

但是read.csv不適合對大數據進行處理,速度太慢。所以我們選擇read_csv()函數,需要用到readr
綜合以上理解,第一步代碼設計如下↓

library(ggplot2)
library(readr)

# 工作路徑
setwd("D://1Study//R//CH05")

# 讀入數據
#data = read.csv("train_data.csv",header = TRUE) # read.csv不適合對大數據進行處理,速度太慢
data_tags = read_csv("train_data.csv") #read_csv讀取大數據的時候效率更高
data_tags

2.提取標籤並製表

現在的標籤一欄在這裏插入圖片描述是被|所分開的

所以需要先處理"|"這個分割符號

tags_name = data_tags$tag_names#提取標籤名這一欄

tags_name = strsplit(x=tags_name,split = "|",fixed = TRUE)  # 按照|進行拆分
tags_name = unlist(tags_name) # 把拆分以後的數據重組成數據框

爲什麼要做這一步呢?
因爲我們可以發現,做這一步之前,數據在在這裏插入圖片描述
data中,是data類型,把它輸出出來長這樣
在這裏插入圖片描述
不是我們想要的像表格一樣的格式。
所以用unlist()函數重新打開,unlist()會將列表元素(數據框作爲特殊列表)則取出列表元素的組成作爲項

關於這一函數,在黃大明數據分析前輩的博文中翻譯了unlist()在R語言幫助文檔裏的內容,感興趣的同學可以點擊學習。

根據取出項生成頻數表

tagsFreq = as.data.frame(table(tags_name)) #生成頻數表

3.製圖

排序一下

# 排序一下
tagsFreq = tagsFreq[order(-tagsFreq$Freq),] # 按照tagsFre$Freq降序排列

取前100多的詞

data = tagsFreq[1:100,]

然後將圖形的柱狀圖再按從高到低排列

# 對柱子的順序進行重新排列
data$tags_name = factor(data$tags_name,levels = data$tags_name)

繪製頻數圖

ggplot(data,aes(x=tags_name,y = Freq))+
  geom_bar(stat = "identity")+
  theme(axis.text.x = element_text(angle = 60,hjust = 1))+
  xlab("關鍵字")+
  ylab("頻數")

在這裏插入圖片描述
接下來解決第二個問題

二、中文詞頻提取在這裏插入圖片描述

1.另存數據

第一步養成習慣另存數據,保證不破壞原數據,方便修正錯誤步驟

question_titles = data.frame(data_tags[,2])#另存爲數據,使不破壞原數據

2.引用中文分詞處理所需要的的包

library(jiebaR)
library(jiebaRD)

3.對所有中文標題進行分詞

seg_engine = worker()#固定分詞句式,定義環境
seg_question = segment(question_titles$question_title,seg_engine) # 對所有的標題進行中文分詞。

如果有停用詞文檔的話也可以直接在環境中輸入文檔

engine = worker(stop_word = "stopwordsC.txt")

4.生成頻數表並對內容進行排序

questionFreq = as.data.frame(table(seg_question))# 生成頻數表

questionFreq = questionFreq[order(-questionFreq$Freq),]#排序

5.去除停用詞

除了前面介紹的在環境中直接去除停用詞的方法外,也可以用語句的方式去除停用詞

#去除停用詞
stopwords = read.table("stopwordsC1.txt",header = FALSE)
cleaned_questionFreq = questionFreq
for(word in questionFreq$seg_question){
  if(word %in% stopwords$V1){#如果word出現在stopwords裏(標題中的分詞出現在停用詞列表中)
    
    cleaned_questionFreq = cleaned_questionFreq[-which(cleaned_questionFreq[,1]==word),]
    
    }
    
}

6.補充處理

# 過濾關鍵詞的最短長度,只有一個的詞不留
cleaned_questionFreq = cleaned_questionFreq[-which(nchar(as.character(cleaned_questionFreq[,1]))<2),]

data = cleaned_questionFreq[1:100,]

7.製圖

# 對柱子的順序進行重新排列
data$seg_question = factor(data$seg_question,levels = data$seg_question)


ggplot(data,aes(x=seg_question,y=Freq))+
  geom_bar(stat="identity")+
  theme(axis.text.x = element_text(angle = 60,hjust = 1))+
  xlab("關鍵字")+
  ylab("頻數")+
  labs(title = '頻率圖--前100個問題標題的頻繁詞')

結果如圖
在這裏插入圖片描述
兩次製圖我們都用到了對柱子的順序進行重新排列的方法

data$seg_question = factor(data$seg_question,levels = data$seg_question)

這裏,x=data $ seg_question,levels = data$seg_question
對於x和levels,幫助中這樣描述

x
a vector of data, usually taking a small number of distinct values.

一個向量數據,通常是一組數量不多的清晰數據

levels
an optional vector of the unique values (as character strings) that x
might have taken. The default is the unique set of values taken by
as.character(x), sorted into increasing order of x. Note that this set
can be specified as smaller than sort(unique(x)).

x的唯一值(作爲字符串)的可選向量可能已經被拿走了。默認值是as.character(x),按x的遞增順序排序。注意這個集合
可以指定爲小於sort(unique(x))

所以能起到排序效果。

最後附上本次學習中產生的全部代碼↓

library(ggplot2)
library(readr)

# 工作路徑
setwd("D://1Study//R//CH05")

# 讀入數據
#data = read.csv("train_data.csv",header = TRUE) # read.csv不適合對大數據進行處理,速度太慢
data_tags = read_csv("train_data.csv") #read_csv讀取大數據的時候效率更高
data_tags

# 以|爲分隔符拆分Tag
tags_name = data_tags$tag_names#提取標籤名這一欄

#####
# 使用R語言的字符串拆分函數 strsplit
# str ="張三;李四;王五"
# splited = strsplit(str,";")
# splited
# 
# str ="張三|李四|王五"
# splited = strsplit(str,"|",fixed = TRUE)
# splited
#####
# 使用R語言的字符串拆分函數 strsplit
tags_name = strsplit(x=tags_name,split = "|",fixed = TRUE)  # 按照|進行拆分
tags_name = unlist(tags_name) # 把拆分以後的數據重組成數據框
tagsFreq = as.data.frame(table(tags_name)) #生成頻數表

# 排序一下
tagsFreq = tagsFreq[order(-tagsFreq$Freq),] # 按照tagsFre$Freq降序排列

data = tagsFreq[1:100,]

ggplot(data,aes(x=tags_name,y = Freq))+
  geom_bar(stat = "identity")

ggplot(data,aes(x=tags_name,y = Freq))+
  geom_bar(stat = "identity")+
  theme(axis.text.x = element_text(angle = 60,hjust = 1))

# 對柱子的順序進行重新排列
data$tags_name = factor(data$tags_name,levels = data$tags_name)

ggplot(data,aes(x=tags_name,y = Freq))+
  geom_bar(stat = "identity")+
  theme(axis.text.x = element_text(angle = 60,hjust = 1))+
  xlab("關鍵字")+
  ylab("頻數")


######
#繪製問題標題的頻繁詞前100以及頻率(先進行中文分詞)
question_titles = data.frame(data_tags[,2])#另存爲數據,使不破壞原數據
library(jiebaR)
library(jiebaRD)

seg_engine = worker()#固定分詞句式,定義環境
#engine = worker(stop_word = "stopwordsC.txt")也可以
#print(segment("南京市長江大橋",seg_engine))
seg_question = segment(question_titles$question_title,seg_engine) # 對所有的標題進行中文分詞。
#蘋果電腦上可以設置一個參數
#win上結巴分詞不能並行化,但是mac以及linux系統上可以並行分詞,極大提高效率
#16G的語料,linux使用32核

questionFreq = as.data.frame(table(seg_question))# 生成頻數表

questionFreq = questionFreq[order(-questionFreq$Freq),]#排序

#去除停用詞
stopwords = read.table("stopwordsC1.txt",header = FALSE)
cleaned_questionFreq = questionFreq
for(word in questionFreq$seg_question){
  if(word %in% stopwords$V1){#如果word出現在stopwords裏(標題中的分詞出現在停用詞列表中)
    
    cleaned_questionFreq = cleaned_questionFreq[-which(cleaned_questionFreq[,1]==word),]
    
    }
    
}

# 過濾關鍵詞的最短長度
cleaned_questionFreq = cleaned_questionFreq[-which(nchar(as.character(cleaned_questionFreq[,1]))<2),]

data = cleaned_questionFreq[1:100,]

# 對柱子的順序進行重新排列
data$seg_question = factor(data$seg_question,levels = data$seg_question)


ggplot(data,aes(x=seg_question,y=Freq))+
  geom_bar(stat="identity")+
  theme(axis.text.x = element_text(angle = 60,hjust = 1))+
  xlab("關鍵字")+
  ylab("頻數")+
  labs(title = '頻率圖--前100個問題標題的頻繁詞')

以上是我對標籤處理的全部理解,如果有誤,歡迎批評指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章