预计阅读

文本挖掘的一些基础概念





基础术语

中文分词

采用 jiebaR 作为中文分词工具,相比于 Rwordseg 包,不仅效果好,而且没有 rJava 包 (JAVA) 环境依赖。

library(jiebaRD)
library(jiebaR)
jieba_seg <- worker()
segment("齐白石对花鸟虫鱼都有研究呢", jieba_seg)
## [1] "齐白石"   "对"       "花鸟虫鱼" "都"       "有"       "研究"     "呢"

英文分词

英文环境下,词与词之间本身就是以空格分开的。

segment("Hello world!", jieba_seg)
## [1] "Hello" "world"

停止词

数字、标点符号、空格不参与分词,会被抹掉。

segment("国画大师齐白石对花鸟虫鱼都有研究呢!", jieba_seg)
## [1] "国画"     "大师"     "齐白石"   "对"       "花鸟虫鱼" "都"       "有"      
## [8] "研究"     "呢"

还可以添加停止词,将「花鸟虫鱼」作为停止词添加到停止词库中。

jieba_seg <- worker(stop_word = "data/text/stop_word.txt")
segment("国画大师齐白石对花鸟虫鱼都有研究呢", jieba_seg)
## [1] "国画"   "大师"   "齐白石" "对"     "都"     "有"     "研究"   "呢"

词频统计

输入字符串向量,计算每个字符串出现的次数。jiebaR 包的函数 freq() 可以统计词出现的频次。

freq(c("a", "a", "c"))
##   char freq
## 1    c    1
## 2    a    2

TF-IDF

输入一个列表,列表中每个元素是字符串向量,每个字符串向量代表一个文档。jiebaR 包的函数 get_idf() 可以计算 TF-IDF(Document Frequency - Inverse Document Frequency) 值。

get_idf(list(c("abc", "def"), c("abc", " ")))
##   name  count
## 1  def 0.6931
## 2  abc 0.0000

提取词干

中文环境没有词干化(stemming)过程(比如 applied / applies -> apply),只考虑分词、词性,但是英文有,举例如下。

library(tm)
## Loading required package: NLP
# 动词 appli
stemDocument(x = c("apply", "applying", "applied", "applies"))
## [1] "appli" "appli" "appli" "appli"
# 名词
stemDocument(x = c("data", "models", "functions", "foxes", "wives", "children"))
## [1] "data"     "model"    "function" "fox"      "wive"     "children"

词形还原

还是举个例子来说明,词形还原(lemmatize)就是将 appli 转化为 applied 或 apply 的过程。

# 词形还原 stemCompletion
stemCompletion(x = "appli", dictionary =  c("apply", "applying", "applied", "applies"), type = "shortest")
##     appli 
## "applied"

SemNetCleaner 包(Converts Words to their Singular Form)处理名词,一次只能处理一个词,分词后可以用,统计词频时合并同类项。

SemNetCleaner::singularize(word = "data")
## [1] "data"
SemNetCleaner::singularize(word = "models")
## [1] "model"

拓展阅读

spacyr 包

spacyr 包通过 reticulate 包调用 Python 社区的自然语言处理模块 spacy ,支持多种语言的分词、词性识别等。配置好 Python 环境,下载中文环境下的语言模型。

library(spacyr)
# 下载语言模型
# spacy_download_langmodel("zh_core_web_sm")
# 初始化语言模型
spacy_initialize(model = "zh_core_web_sm")
## successfully initialized (spaCy Version: 3.7.2, language model: zh_core_web_sm)
# Token 化是分词
spacy_tokenize("国画大师齐白石对花鸟虫鱼都有研究呢")
## $text1
##  [1] "国画"   "大师"   "齐白石" "对"     "花鸟"   "虫鱼"   "都"     "有"    
##  [9] "研究"   "呢"
# 示例
txt <- c(d1 = "国画大师齐白石对花鸟虫鱼都有研究呢",
         d2 = "中国人民银行很行",
         d3 = "张大千在研究国画")
# 解析
parsed_txt <- spacy_parse(txt)
## Warning in spacy_parse.character(txt): lemmatization may not work properly in
## model 'zh_core_web_sm'
# 结果
parsed_txt
##    doc_id sentence_id token_id  token lemma   pos   entity
## 1      d1           1        1   国画        NOUN         
## 2      d1           1        2   大师        NOUN         
## 3      d1           1        3 齐白石       PROPN PERSON_B
## 4      d1           1        4     对         ADP         
## 5      d1           1        5   花鸟        NOUN         
## 6      d1           1        6   虫鱼        NOUN         
## 7      d1           1        7     都         ADV         
## 8      d1           1        8     有        VERB         
## 9      d1           1        9   研究        NOUN         
## 10     d1           1       10     呢        PART         
## 11     d2           1        1   中国       PROPN    ORG_B
## 12     d2           1        2   人民        NOUN    ORG_I
## 13     d2           1        3   银行        NOUN    ORG_I
## 14     d2           1        4     很         ADV         
## 15     d2           1        5     行        VERB         
## 16     d3           1        1 张大千       PROPN PERSON_B
## 17     d3           1        2     在         ADP         
## 18     d3           1        3   研究        VERB         
## 19     d3           1        4   国画        NOUN

人名都是名词,如齐白石、张大千等,「研究」既可做动词,也可做名词,「都」和「很」是副词。「中国人民银行很行」的「行」应当是形容词,但被识别为动词。

文本处理

  1. stringr 包和 Base R 通过正则表达式对字符串(文本)清洗、处理。

  2. quantedatext2maptidytext 文本分析。

  3. tm 包在自然语言处理任务视图中被列为核心扩展包,有多个扩展插件包,支持外部数据和模型,两个文本数据 R-develR-help 来自 R 语言社区的邮件列表,整理后,适合用 tm 包来处理,语料库和模型。

文本建模

  1. fastTextRfasttext 的 R 语言接口,适用于大数据集,监督文本分类、词表示学习。
  2. text2vec 文本向量化、主题建模、距离和相似性度量、GloVe 词嵌入。
  3. word2vec 词向量化
  4. doc2vec 文档向量化

运行环境

本文运行中用到的相关 R 包的版本信息如下:

sessionInfo()
## R version 4.4.3 (2025-02-28)
## Platform: x86_64-apple-darwin20
## Running under: macOS Sequoia 15.3.2
## 
## Matrix products: default
## BLAS:   /Library/Frameworks/R.framework/Versions/4.4-x86_64/Resources/lib/libRblas.0.dylib 
## LAPACK: /Library/Frameworks/R.framework/Versions/4.4-x86_64/Resources/lib/libRlapack.dylib;  LAPACK version 3.12.0
## 
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
## 
## time zone: Asia/Shanghai
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] spacyr_1.3.0 tm_0.7-16    NLP_0.3-2    jiebaR_0.11  jiebaRD_0.1 
## 
## loaded via a namespace (and not attached):
##  [1] Matrix_1.7-3             jsonlite_1.9.1           compiler_4.4.3          
##  [4] promises_1.3.2           Rcpp_1.0.14              slam_0.1-55             
##  [7] xml2_1.3.8               parallel_4.4.3           later_1.4.1             
## [10] jquerylib_0.1.4          png_0.1-8                SemNetDictionaries_0.2.0
## [13] yaml_2.3.10              fastmap_1.2.0            lattice_0.22-6          
## [16] reticulate_1.41.0.1      R6_2.6.1                 SemNetCleaner_1.3.4     
## [19] SnowballC_0.7.1          knitr_1.50               bookdown_0.42           
## [22] bslib_0.9.0              rlang_1.1.5              cachem_1.1.0            
## [25] httpuv_1.6.15            xfun_0.51                sass_0.4.9              
## [28] cli_3.6.4                magrittr_2.0.3           digest_0.6.37           
## [31] grid_4.4.3               rstudioapi_0.17.1        lifecycle_1.0.4         
## [34] servr_0.32               evaluate_1.0.3           data.table_1.17.0       
## [37] blogdown_1.21            rmarkdown_2.29           tools_4.4.3             
## [40] htmltools_0.5.8.1