30-tidytext包学习:文本整理与情绪分析

1、载入数据

require(pacman)
p_load(tidyverse,tidytext,text2vec,jiebaR,plyr)
df <- read.csv("./signature.csv",stringsAsFactors = F,header = T) %>% 
  select("id",signature="Signature")

# 繁体字转换为简体字
p_load(ropencc)
df$signature <- run_convert(converter(TW2S), df$signature)

2、中文分词

wk <-worker(stop_word = "./dict/characters-master/stop_words",lines = T)

text <- df %>% mutate(words = map(signature,segment,jieba = wk)) %>% select(c("id","words")) %>% tbl_df()

# 将分词拼接为一个长的字符串
text$words <- map(text$words,paste,collapse=" ")

3、使用unnest_tokens()函数整理为tidy结构

# 将text中的words列整理后命名为words
text.df <- text %>% unnest_tokens(words,words)

# 将文本按章节整理
# austen_chapters <- austen_books() %>% unnest_tokens(chapter, text, token = "regex", pattern = "Chapter|CHAPTER [\\dIVXLC]")

4、去除停用词

# 使用第二种方法去除停用词
stop.words <- read.table("./dict/停用词表.txt",header = F,sep="\n",quote = "",
                         fileEncoding = "UTF-8",col.names = "words")
# 去掉停用词两边的空格
stop.words$words <- str_trim(stop.words$words)

# 向停用词词典中添加新词
# stop.words <- bind_rows(tibble(words=c("于","有")),stop.words)

text.df <- text.df %>% anti_join(stop.words,by="words")

5、dplyr::count()函数查找频次最高的词

text.df %>% dplyr::count(words,sort=TRUE)
## # A tibble: 1,267 x 2
##    words     n
##    <chr> <int>
##  1 人生     22
##  2 心       22
##  3 不       17
##  4 爱       16
##  5 中       15
##  6 生活     14
##  7 努力     13
##  8 有       12
##  9 无       11
## 10 做       11
## # ... with 1,257 more rows

6、根据词频画条形图

text.df %>% dplyr::count(words,sort=TRUE) %>%
  filter(n>11) %>%
  ggplot(aes(reorder(words,n),n)) +
  geom_col() +
  coord_flip() +
  labs(x="",y="")
词频条形图

7、计算词频TF

tf <- text.df %>% dplyr::count(id,words)

8、加载知网(hownet)情感词典

positive <- read.table("./dict/情感及修饰词/正面情感词语(中文).txt",header = F,
    stringsAsFactors = F,strip.white = T,skip = 1,col.names = "words")
# 去掉两边的空格
positive$words <- str_trim(positive$words)

negative <- read.table("./dict/情感及修饰词/负面情感词语(中文).txt",header = F,
    stringsAsFactors = F,strip.white = T,skip = 1,col.names = "words")

negative$words <- str_trim(negative$words)

9、匹配情感词典并可视化

# 计算每个签名中有多少个正向词
df.positive <- text.df %>% inner_join(positive,by="words") %>% dplyr::count(words,id)

df.positive <- aggregate(n~id,df.positive,sum)

# 计算每个签名中有多少个负向词
df.negative <- text.df %>% inner_join(negative) %>% dplyr::count(words,id=id) %>% select(id,n=n)
## Joining, by = "words"
df.negative <- aggregate(n~id,df.negative,sum)

df.sentiment <- df.positive %>% full_join(df.negative,by="id")

df.sentiment[is.na(df.sentiment)] <- 0

# 总体为正的为正面,总体为负的为负面,总体无情绪的为中立
df.sentiment <- df.sentiment %>% 
  mutate(sentiment = case_when(n.x - n.y > 0 ~ "正面",
                               n.x - n.y == 0 ~ "中立",
                               n.x - n.y < 0 ~ "负面")) %>%
  select(id,sentiment)

table(df.sentiment$sentiment) %>% as.data.frame() %>%
  ggplot(aes(as.factor(Var1),Freq)) +
  geom_col(show.legend = F) +
  labs(x="",y="")
情绪所占比例

10、词云图

p_load(wordcloud2)
temp <- text.df %>% dplyr::count(words) %>% filter(n>=2) 
wordcloud2(temp,size=1,color = "random-dark",backgroundColor = "gray",minRotation = -pi/4,
maxRotation = -pi/4,shape = "circle",fontFamily = "苹方")
词云图

11、最多的正、负情感词云

p_load(reshape2)
# 统计正面情感词
posi <- text.df %>% select(words) %>% dplyr::count(words) %>%
  inner_join(positive,by="words") %>%
  filter(n>=2) %>% arrange(-n) %>%
  mutate(sentiment = "positive")

# 统计负面情感词
nega <- text.df %>% select(words) %>%
  dplyr::count(words) %>% 
  inner_join(negative,by="words") %>%
  arrange(-n) %>%
  mutate(sentiment = "negative")

posi %>% rbind(nega) %>% 
  acast(words ~ sentiment,value.var = "n",fill = 0) %>%
  wordcloud::comparison.cloud(scale=c(3.3,.3),colors=c("gray80","gray20"),
                              match.colors = T,
                              rot.per = 0.1,title.size = 2.5,
                              title.bg.colors = c("green","red"),
                              title.colors = "gray20")
正负情感词云
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容