31-tidytext包学习:计算TF和TF-IDF

1、读取并整理数据

library(pacman)
p_load(tidytext,tidyverse,stringr)

# 读取文件
txt <- readLines("./data_set/xslm/血色浪漫.txt",encoding = "unknown",n=-1L,ok=T,warn=T,skipNul=T) 
血色浪漫
# 删除分节等重复信息
txt <- txt %>% gsub("出版社:长江文艺出版社作者:都梁|\\[上一篇\\]","",.) %>% str_trim() 

# 按【下一篇】拆分
txt2 <- txt %>% paste(collapse = " ") %>% str_split("\\[下一篇\\]") 

# 按章节整理为数据框
chapter <- vector("character",244)
content <- vector("character",244)
for (line in txt2) {
  temp <- line %>% str_split("引子|\\([0-9]+\\)")
  for (i in 1:length(line)) {
    chapter[i] <- temp[[i]][1] %>% gsub("[《血色浪漫上》]","",.) %>% str_trim(side = "both")
    content[i] <- temp[[i]][2] %>% str_trim(side = "both")
  }
  df <- tibble(chapter=chapter,content=content)
}

# 给第0章添加标题“引子”
df$chapter[1] <- "引子"

# 按章节(chapter)将各小节(content)合并
txt3 <- aggregate(content~chapter,df,paste)

# 去掉字符及字母
txt3$content <- txt3$content %>% gsub("[%a-z\\\\\\\"()]","",.) 

# 创建有效水平章节名称列表
chapter.levels <- c("引子","第一章","第二章","第三章","第四章","第五章","第六章",
                    "第七章","第八章","第九章","第十章","第十一章","第十二章",
                    "第十三章","第十四章","第十五章","第十六章","第十七章",
                    "第十八章","第十九章","第二十章","第二十一章","第二十二章",
                    "第二十三章","第二十四章","第二十五章","尾声")
txt3$chapter <- factor(txt3$chapter,levels = chapter.levels)
# 按章节重新排序
txt3 <- txt3 %>% arrange(chapter)

# 写入文件
# write.csv(txt3,"./txt3.csv")
整理后的文档

2、中文分词

使用dplyr::count()函数计算词频一直有问题,最后选择使用text2vec包。

p_load(jiebaR,plyr,text2vec)
# txt3 <- read.csv("./txt3.csv",header = T,stringsAsFactors = F)


# 将小说主要人物姓名保存为用户字典xslm
wk <-worker(user = "./dict/characters-master/xslm")

tok.fun <- function(strings) {llply(strings,segment,wk)}
# 设置分词迭代器
it <- itoken(txt3$content,
             preprocessor = identity,
             tokenizer = tok.fun,
             ids = txt3$chapter,
             progressbar = interactive())

# 创建词矩阵
vocab <- create_vocabulary(it)

3、计算TF和TF-IDF

3.1 计算TF

book.words <- tibble(chapter=vocab$doc_count,
                     word=as.character(vocab$term),
                     n=as.integer(vocab$term_count))

# 计算每章中频次最高的词
max.word <- aggregate(n~chapter,book.words,max)

# 词频tf=某个词在文章中出现的次数/该文出现次数最多的词出现的次数
book <- book.words %>% left_join(max.word,by="chapter",copy=T) %>% 
  dplyr::rename(n=n.x,max=n.y) %>% mutate(tf=n/max)
print(book)
# A tibble: 24,572 x 5
   chapter word         n   max     tf
     <int> <chr>    <int> <int>  <dbl>
 1       1 得太早       1    35 0.0286
 2       1 招待         1    35 0.0286
 3       1 全副武装     1    35 0.0286
 4       1 演义         1    35 0.0286
 5       1 低么         1    35 0.0286
 6       1 黄皮书       1    35 0.0286
 7       1 养人         1    35 0.0286
 8       1 付些         1    35 0.0286
 9       1 解           1    35 0.0286
10       1 破裂         1    35 0.0286
# ... with 24,562 more rows

3.2 查看前6章节TF的分布情况

book %>% filter(chapter<7) %>%
  ggplot(aes(tf, fill = chapter)) +
    geom_histogram(show.legend = FALSE,bins = 40,na.rm = T,col="white") +
  #  xlim(NA, 1) +
    labs(x=NULL,y=NULL) +
    facet_wrap(~chapter, ncol=2,scales = "free_y")
词频长尾分布

3.3 齐普夫定律(Zipf’s law)

在一个自然语言的语料库中,一个词的出现频数和这个词在这个语料中的排名(这个排名是基于出现次数的)成反比。Zipf定律是文献计量学的重要定律之一,它和罗特卡定律、布拉德福定律一起被并称为文献计量学的三大定律。

book %>% select(chapter,n) %>% mutate(rank=10*(1:length(n))) %>%
  ggplot(aes(rank,n)) + geom_point(col="red") + scale_x_log10()
齐普夫定律

3.4 TF-IDF矩阵

book.tfidf <- book %>% select(-max) %>% bind_tf_idf(word,chapter,n) %>%
  arrange(-tf_idf)

# tf_idf表示词语在文章中的重要程度,可视化前两章最重要的13个词
book.tfidf %>% mutate(word=factor(word,levels = rev(unique(word)))) %>%
  filter(chapter<3) %>% group_by(chapter) %>% top_n(13,tf_idf) %>%
  ungroup() %>% ggplot(aes(word,tf_idf,fill=chapter)) +
  geom_col(show.legend = F) +
  labs(x=NULL,y="tf_idf") +
  facet_wrap(~chapter,ncol = 2,scales = "free") +
  coord_flip()
TF-IDF
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容