R语言自然语言处理:文本分类
作者:黄天元,复旦大学博士在读,目前研究涉及文本挖掘、社交网络分析和机器学习等。希望与大家分享学习经验,推广并加深R语言在业界的应用。
邮箱:huang.tian-yuan@qq.com
这次希望尝试用简单的技术(TF-IDF和相似度矩阵)做一次实践,即文档分类。
任务定义:对于任意给定的一个字符串,判断它与目前哪个文档最为相似,从而进行归类。首先要对当前的文档(数据见github.com/hope-data-sc)做词嵌入(就用最简单的TF-IDF模型),然后对于任意的新字符串,进行向量化之后,与先前的标准库做相似性的分析,看看与哪个文档相似性最近,就属于哪一个类别。
1 读入文件
library(pacman)p_load(tidyverse,data.table)
fread("classification_corpus_raw.csv",encoding = "UTF-8") %>% as_tibble() %>% mutate(id = 1:n())-> raw
这样,文件就在raw中了。
2 计算TF-IDF
这一部分参考HopeR:R语言自然语言处理:关键词提取(TF-IDF),先进行分词,然后对所有的词计算TF-IDF。
## 快速分词p_load(jiebaR)worker() -> wk
raw %>% mutate(words = map(title,segment,jieba = wk)) %>% select(id,words) -> corpus
## 计算TF-IDFcorpus %>% unnest() %>% count(id,words) %>% bind_tf_idf(term = words,document = id,n = n) -> corpus_tf_idf
仔细看,这个文档现在究竟有多少个词语呢?
corpus_tf_idf %>% distinct(words)
# A tibble: 1,510 x 1 words <chr> 1 百年 2 办公室 3 筹备工作 4 校庆 5 保卫部 6 处 7 安全 8 管理 9 生产 10 保密 # ... with 1,500 more rows
一共1510个,不多,因此我决定不进行筛选了。本来常规套路要把这个TF-IDF的矩阵变为一个文档-词语矩阵(Document Term Matrix,DTM)。但是既然走了tidy的路线,我突然认为那是一个多余的步骤,做了一个高维稀疏的矩阵效率异常低,而进行连接(join)的速度可谓异常地快。
下面我要写一个函数,它要完成一个这样的任务:对于任意给定的字符串,求这个字符串与当前所有文档的相似性,然后筛选出相似性最高的n个文档,显示出来。
虽然不需要构造矩阵,但是我还是要构造一个类似的数据框。
corpus_tf_idf %>% select(id,tf_idf) -> for_future_use
3 举例尝试
先假设给定的字符串为“大数据学院”,我们看看是否能够找到合理的相似文档。我们首先要明确,什么叫做相似?定义:1、字符串中包含相同的组分(相同的分词结果);2、当包含组分数量一致的时候,如果包含重要表征组分,其得分更高(举例说明:我们给定的字符串是“物理学院”,分词之后是“物理”和“学院”,但是“物理”这个词能够表征的程度更高,因此它会得到更高的得分,这个得分在我们的模型中是以TF-IDF的形式存在的)。
下面我们给出代码:
string = "大数据学院"
string %>% segment(jiebar = wk) %>% enframe() %>% transmute(words = value) -> string_table
for_future_use %>% inner_join(string_table) %>% group_by(id) %>% summarise(score = sum(tf_idf)) %>% arrange(desc(score)) -> sort_table
sort_table %>% slice(1:5) %>% inner_join(raw,by = "id")
# A tibble: 5 x 3 id score title <int> <dbl> <chr> 1 58 4.70 大数据学院 2 57 2.86 大数据研究院3 109 1.84 高级律师学院4 436 1.84 公共卫生学院5 479 1.84 管理学院
我们可以看到,“大数据学院”被正确地筛选出来,而排名第二的是“大数据研究院”,因为“大数据”作为一个比“学院”拥有更高TF-IDF的关键词,更能够表征“大数据”这个特征。其他3个选项得分其实是一样的,它们都因为有“学院”而被筛选出来,但是没有匹配更多更有价值的词语了。现在我们就可以正式对函数进行构造:
get_sim = function(string){ string %>% segment(jiebar = wk) %>% enframe() %>% transmute(words = value) -> string_table
for_future_use %>% inner_join(string_table,by = "words") %>% group_by(id) %>% summarise(score = sum(tf_idf)) %>% arrange(desc(score)) -> sort_table
sort_table %>% slice(1:3) %>% inner_join(raw,by = "id") -> result
ifelse(nrow(result) == 0, NA, result %>% pull(title) %>% str_c(collapse = ","))}
这个函数能够对任意的字符串进行识别,如果没有任何识别,就返回NA;如果识别到了,最多返回匹配度最高的3个分类,分类之间以“,”分隔(注意是英文的逗号,这个可以根据自己的洗好更改)。我们用两个例子看看结果如何:
get_sim("稀奇古怪")[1] NA
get_sim("大数据")[1] "大数据研究院,大数据学院,大数据试验场研究院(筹)"
显然,这个函数是有效的。
——————————————
往期精彩:
今天,我改名了!
大碗宽面 VS 律师函警告,情感分析吴亦凡自黑式圈粉!
精选| 2019年3月R新包推荐
R语言自然语言处理:文本分类相关推荐
- R语言构建xgboost文本分类模型(bag of words):xgb.cv函数交叉验证确定xgboost模型的最优子树个数、交叉验证获取最优子树之后构建最优xgboost模型并评估模型文本分类效能
R语言构建xgboost文本分类模型(bag of words):xgb.cv函数交叉验证确定xgboost模型的最优子树个数.交叉验证获取最优子树之后构建最优xgboost模型并评估模型文本分类效能 ...
- 自然语言处理——文本分类概述
内容提要 分类概述 分类流程 数据采集 爬虫技术 页面处理 文本预处理 英文处理 中文处理 去停用词 文本表示 特征选择 分类模型 分类概述 分类(Classification)是指自动对数据进行 ...
- R语言使用两个分类变量创建双向表(Two Way Table、两个分类变量的频率表)实战: 矩阵的双向表、dataframe的双向表、条形图和马赛克图来可视化频率表
R语言使用两个分类变量创建双向表(Two Way Table.两个分类变量的频率表)实战: 矩阵的双向表.dataframe的双向表.条形图和马赛克图来可视化频率表 目录
- R语言创建自定义颜色(分类变量与颜色形成稳定映射)实战:设置因子变量(分类变量)到可视化颜色的稳定映射
R语言创建自定义颜色(分类变量与颜色形成稳定映射)实战:设置因子变量(分类变量)到可视化颜色的稳定映射 目录
- R语言基于glmnet构建分类模型并可视化特征系数(coefficient)以及L1正则化系数(lambda)实战
R语言基于glmnet构建分类模型并可视化特征系数(coefficient)以及L1正则化系数(lambda)实战 # 导入测试数据集 data(BinomialExample) x <- Bi ...
- 美团店铺评价语言处理以及文本分类(logistic regression)
美团店铺评价语言处理以及文本分类(logistic regression) 美团店铺评价语言处理以及分类(LogisticRegression) 第一篇 数据清洗与分析部分 第二篇 可视化部分, 第三 ...
- R语言使用逻辑回归分类算法
R语言使用逻辑回归分类算法 逻辑回归属于概率统计的分类算法模型的算法,是根据一个或者多个特征进行类别标号预测.在R语言中可以通过调用logit函数执行逻辑回归分类算法并预测输出概率.通过调用glm函数 ...
- 自然语言处理——文本分类综述
最近在学习文本分类,读了很多博主的文章,要么已经严重过时(还在一个劲介绍SVM.贝叶斯),要么就是机器翻译的别人的英文论文,几乎看遍全文,竟然没有一篇能看的综述,花了一个月时间,参考了很多文献,特此写 ...
- r语言的逻辑回归分类
iris 是r语言内置的数据集 head(iris) # 与python的不同iris.head() Sepal.Length Sepal.Width Petal.Length Petal.Width ...
- [深度学习] 自然语言处理 --- 文本分类模型总结
文本分类 包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMO,BERT等)的文本分类 fastText 模型 textCNN 模型 charCNN 模型 Bi-LSTM 模型 ...
最新文章
- 学习MongoDB (1) :配置安装
- 军哥lnmp一键安装包nginx支持pathinfo配置
- 我在阿里做中后台开发
- 《数据科学:R语言实现》——2.5 使用Excel文件
- 高通---GPUCPU频率和工作模式的获取设置
- 【技术综述】“看透”神经网络
- P4321-随机漫游【状压dp,数学期望,高斯消元】
- python环境快速安装opencv 离线版安装
- constraint mysql_MySQL(Constraint)
- 接口请求json解析问题
- SAP SolMan 严重漏洞的自动化 exploit 代码遭公开
- [转载] Python-科赫雪花(科克曲线)
- js读取文件的内置方法之 FileReader
- 根据IP地址查询物理位置(IP地址定位库)并且查询当前地址的天气信息(中国气象网)
- 高通8953平台usb转以太网芯片ax88772驱动
- Android 蓝牙设备的查找与连接
- ClickHouse表引擎到底怎么选
- 编程语言的巅峰(嚯哈哈哈哈)
- 嵌入式uClinux及其应用开发(1)
- OC开发之——OC简介(1)