R语言与统计分析R语言作业数据科学与R语言

33-tidytext包学习:tm包与tidytext包共建语料

2020-02-10  本文已影响0人  wonphen

tidy结构要求:a table with one-token-per-document-per-row,这使得我们可以使用流行的一整套工具,比如 dplyr、tidyr 和 ggplot2来探索和可视化文本数据。


格式转换

然而,除了 tidytext 包之外,大多数现有的用于自然语言处理的 r 工具都不兼容这种格式。 本文讨论的就是tm包生成的语料与tidy结构之间的互相转换。

1、使用科学辟谣网数据

require(pacman)
p_load(dplyr)
df <- read.csv("./rumors.csv",header = T,stringsAsFactors = F,strip.white = T) %>%
  select(title,correction) %>% tbl_df()

df$correction <- df$correction %>% gsub("<U+00A[0-9]>","",.) %>%
  # 清除所有括号中的内容
  gsub("\\(.*\\)","",.) %>% gsub("(.*)","",.) %>% gsub("\\\n","",.) %>%
  gsub("点击下载本组图片","",.) %>% textclean::replace_html()

2、构建DTM矩阵

p_load(tm,jiebaR,purrr)

# 中文分词
wk <- worker(stop_word = "./dict/characters-master/stop_words")
corpus <- df %>% mutate(words = map(correction,segment,wk)) %>% 
  select(title,words) %>% distinct(title,.keep_all = T)
# 手动拼接为一个长的字符串
txt <- map(corpus$words,paste,collapse=" ")

# 创建语料库
d.corpus <- Corpus(VectorSource(txt))

# 剔除多余的空白
d.corpus <- tm_map(d.corpus,stripWhitespace)
## Warning in tm_map.SimpleCorpus(d.corpus,
## stripWhitespace): transformation drops documents
# 剔除标点符号
d.corpus <- tm_map(d.corpus,removePunctuation)
## Warning in tm_map.SimpleCorpus(d.corpus,
## removePunctuation): transformation drops documents
# 剔除数字
d.corpus <- tm_map(d.corpus,removeNumbers)
## Warning in tm_map.SimpleCorpus(d.corpus, removeNumbers):
## transformation drops documents
ctrl <- list(wordlengths=c(1,Inf))
dtm <- DocumentTermMatrix(d.corpus,control = ctrl)

print(dtm)
## <<DocumentTermMatrix (documents: 1763, terms: 35923)>>
## Non-/sparse entries: 202385/63129864
## Sparsity           : 100%
## Maximal term length: 80
## Weighting          : term frequency (tf)

3、转换为tidy结构,转换后其他的操作跟tidytext一致

p_load(tidytext)
# 转换为one-token-per-document-per-row的数据框
dtm.td <- tidy(dtm)

print(dtm.td)
## # A tibble: 202,385 x 3
##    document term           count
##    <chr>    <chr>          <dbl>
##  1 1        一是               1
##  2 1        专家               2
##  3 1        个人行为           1
##  4 1        中                 2
##  5 1        中华预防医学会     1
##  6 1        中国               1
##  7 1        中国科学院         1
##  8 1        中心               1
##  9 1        主任               2
## 10 1        二是               1
## # ... with 202,375 more rows
# 将语料中的document名称改为文章名称
name <- df %>% select(title) %>%
  mutate(id=as.character(1:length(df$title)))

dtm.td.name <- dtm.td %>%  left_join(name,by=c("document"="id"),copy=T) %>%
  select(document=title,term,count)

4、tidy结构转换为DTM矩阵

dtm.matrix <- dtm.td.name %>% cast_dtm(document,term,count)
print(dtm.matrix)

注:目前还不清楚为何转换后文档数量会变少,同时也无法确定文档名称是否与原有文章一一对应。

## <<DocumentTermMatrix (documents: 1668, terms: 35923)>>
## Non-/sparse entries: 202228/59717336
## Sparsity           : 100%
## Maximal term length: 80
## Weighting          : term frequency (tf)
inspect(dtm.matrix[5:10, 10:20])
## <<DocumentTermMatrix (documents: 6, terms: 11)>>
## Non-/sparse entries: 10/56
## Sparsity           : 85%
## Maximal term length: 3
## Weighting          : term frequency (tf)
## Sample             :
##                             Terms
## Docs                         出品人 传播 促使 低 二是
##   爱因斯坦的数学很烂              1    0    0  0    0
##   家养猪笼草可以有效灭蚊          1    0    0  0    0
##   利用磁铁和钢丝可制作永动机      1    0    0  0    0
##   月经期间洗头会致癌              1    0    0  1    0
##   孕妈肚脐凸起生的就是儿子        1    0    0  0    0
##   最聪明的孩子都吃素              1    0    0  1    0
##                             Terms
## Docs                         公用 几分钟 免疫学 体液
##   爱因斯坦的数学很烂            0      0      0    0
##   家养猪笼草可以有效灭蚊        0      0      0    0
##   利用磁铁和钢丝可制作永动机    0      0      0    0
##   月经期间洗头会致癌            0      0      0    0
##   孕妈肚脐凸起生的就是儿子      0      0      0    0
##   最聪明的孩子都吃素            0      0      0    3
##                             Terms
## Docs                         信息
##   爱因斯坦的数学很烂            0
##   家养猪笼草可以有效灭蚊        0
##   利用磁铁和钢丝可制作永动机    0
##   月经期间洗头会致癌            0
##   孕妈肚脐凸起生的就是儿子      0
##   最聪明的孩子都吃素            1

5、使用tidy结构文档快速创建DTM矩阵

test <- read.csv("./signature.jieba.csv",header = T,stringsAsFactors = F) %>% 
  dplyr::select(id,content)

signature.dtm <- test %>% unnest_tokens(word,content) %>%
  dplyr::count(id,word) %>%
  cast_dtm(id,word,n)

print(signature.dtm)
## <<DocumentTermMatrix (documents: 391, terms: 1412)>>
## Non-/sparse entries: 2684/549408
## Sparsity           : 100%
## Maximal term length: 4
## Weighting          : term frequency (tf)

6、移除稀疏元素

inspect(removeSparseTerms(dtm.matrix,0.5))
## <<DocumentTermMatrix (documents: 1668, terms: 1)>>
## Non-/sparse entries: 900/768
## Sparsity           : 46%
## Maximal term length: 1
## Weighting          : term frequency (tf)
## Sample             :
##                                     Terms
## Docs                                 中
##   “竹炭食物”排毒养颜?               28
##   2017十大“科学”流言揭晓             19
##   保温杯里泡枸杞”是万能养生方式      16
##   吃螃蟹的禁忌                       12
##   吃早餐危险、薯条治脱发             13
##   发烧吃点消炎药                     21
##   藿香正气水和头孢一起服用会产生剧毒 12
##   诺贝尔奖得主说,牛肉、牛奶都致癌   12
##   食品标签会提供消费者需要的所有信息 17
##   与“水”有关的流言                   13

7、查找至少出现450次的词语

findFreqTerms(dtm.matrix,450)
##  [1] "专家"   "中"     "中国"   "发现"   "含量"  
##  [6] "研究"   "科学"   "里"     "食物"   "作用"  
## [11] "健康"   "发生"   "导致"   "年"     "影响"  
## [16] "情况"   "效果"   "更"     "月"     "说"    
## [21] "说法"   "身体"   "一种"   "医院"   "吃"    
## [26] "时"     "营养"   "治疗"   "皮肤"   "真的"  
## [31] "疾病"   "维生素" "食品"   "高"     "患者"  
## [36] "谣言"   "食用"   "人体"   "含有"   "请"    
## [41] "来源"   "药物"   "五线谱" "作者"   "授权"  
## [46] "网站"   "蝌蚪"   "转载"

8、查找与“冠状病毒”有0.8以上相关性的词

findAssocs(dtm.matrix,"冠状病毒",0.8)
## $冠状病毒
##     ncov 念念不忘     非典 
##     0.91     0.91     0.91
上一篇 下一篇

猜你喜欢

热点阅读