基础术语
中文分词
采用 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
人名都是名词,如齐白石、张大千等,「研究」既可做动词,也可做名词,「都」和「很」是副词。「中国人民银行很行」的「行」应当是形容词,但被识别为动词。
文本处理
运行环境
本文运行中用到的相关 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