参见:李东风的R 教程

这里处理的小说是猫腻的《庆余年》(虽然我本人认为其写的相当糟糕),但正好看到了:http://download.fltxt.com/txt/yuqingnian.txt

小说文本如下:

02. 中文文本处理 - 图1

先前处理过英文小说的简单文本挖掘,这次来处理一下中文的,因为中文文章编码分词和英文不同,比如虽然unnest_tokens 可以非常厉害的识别大多数词,可还是对于庆余年这样的名称无法识别:

02. 中文文本处理 - 图2

这次使用jiebaR 包处理。

首先是汉字编码,选择GB18030 :

02. 中文文本处理 - 图3

如果需要处理中文停用词,这里有个网站:

https://github.com/elephantnose/characters/blob/master/stop_words

处理起来还是稍有不同,不过眼前一亮的是,发现readr 包似乎是个不错的替代基础包读文本的工具,read_file 读10M 左右文本,瞬间就读取了:

  1. p_load(rvest, readr, pengToolkit, wordcloud2, jiebaR, tidytext, dplyr, janeaustenr); beepr::beep(sound = "coin")
  2. wk <- worker()
  3. mytxt <- readr::read_file("yuqingnian.txt", locale = locale(encoding = "GB18030")) # 按汉字编码,读取文本
  4. words <- segment(mytxt, wk) # 读取文字,获得字符串类型
  5. tail(sort(table(words)))
  6. tab <- sort(table(words), decreasing = T) # 倒序排
  7. tab2 <- tab[nchar(names(tab)) > 1] # 去掉单个字内容

看看排名靠前的内容:

  1. > knitr::kable(head(tab2))
  2. |words | Freq|
  3. |:-----|-----:|
  4. |范闲 | 19735|
  5. |自己 | 12398|
  6. |没有 | 11307|
  7. |说道 | 10247|
  8. |知道 | 7998|
  9. |什么 | 6964|
  10. # 当然还有少不了的云图
  11. wordcloud2(head(tab2, 500))

02. 中文文本处理 - 图4

果然,范闲才是老大啊!

详细学习jiebaR

参见:https://zhuanlan.zhihu.com/p/35846130

此外,再来康康worker() 函数的详细用法:

02. 中文文本处理 - 图5

segment 函数:

02. 中文文本处理 - 图6

自定义词库

  • 手动设置自定义词句

02. 中文文本处理 - 图7

  • 借助外部txt 文件
  1. 搜狗提供了大量的专业领域词汇,其词库具有专门的.scel格式,词库导出与导入非常麻烦,这时,需要用到搜狗细胞词库转化包cidian,它不仅能够在R中将搜狗词库的scel格式转化为可读的词库,并且还能直接被分词包jiebaR调用!但需要注意的是:cidian包没有发布在CRAN,而是发布在github中,所以需要先获得开发者工具Rtools才能进行安装,也要用到install_github()函数。
  2. 第一次安装cidian包的时候,果然又有遇到问题,哎,还好又被我各种探索给解决了,直接上干货吧!
  1. #安装cidian包,时间会有点点长~
  2. install.packages("devtools") #R的开发者工具
  3. install.packages("stringi") #强大的字符处理包
  4. install.packages("pbapply") #能够为*apply族函数增加进度条
  5. install.packages("Rcpp")
  6. install.packages("RcppProgress")#RcppRcppProgressR直接调用外部的C++程序,增加运算速度
  7. library(devtools)
  8. install_github("qinwf/cidian") #用来从github上安装R包的函数,“qinwf”应该是cidian的作者
  9. library(cidian)
  10. # ps:貌似cidian 包暂时用不了了

搜狗词库:https://pinyin.sogou.com/dict/

这里有个在线词库转换网站:https://cidian.shinyapps.io/shiny-cidian/

  1. > decode_scel(scel = "./杭州市城市信息精选.scel",cpp = TRUE)
  2. output file: ./杭州市城市信息精选.scel_2018-04-19_00_57_55.dict
  3. # 重点来了,把搜狗词典文件改名,从杭州市城市信息精选.scel_2018-04-19_00_57_55.dict到user.dict.utf8,然后替换D:/R/R-3.4.4/library/jiebaRD/dict目录下面的user.dict.utf8。这样默认的用户词典,就是搜狗词典了,可以检验下新的user.dict.utf8:

jiebaR 自带图库含义:

  1. jieba.dict.utf8, 系统词典文件,最大概率法,utf8编码的
  2. hmm_model.utf8, 系统词典文件,隐式马尔科夫模型,utf8编码的
  3. user.dict.utf8, 用户词典文件,utf8编码的
  4. stop_words.utf8,停止词文件,utf8编码的
  5. idf.utf8IDF语料库,utf8编码的
  6. jieba.dict.zipjieba.dict.utf8的压缩包
  7. hmm_model.ziphmm_model.utf8的压缩包
  8. idf.zipidf.utf8的压缩包
  9. backup.rda,无注释
  10. model.rda,无注释
  11. README.md,说明文件

设置停止词

02. 中文文本处理 - 图8

获得词条中的关键词

02. 中文文本处理 - 图9

主要使用函数vector_keywords :

  1. > keys <- worker("keywords",topn=5)
  2. > vector_keywords(guolv,keys)
  3. 11.8212 11.7392 11.7392 11.7392 11.7392
  4. "灵峰" "太子湾" "桃柳" "间株" "八卦田"

如果感兴趣,未来能不能开发属于自己的文本分词算法呢?