作者:黄天元,复旦大学博士在读,目前研究涉及文本挖掘、社交网络分析和机器学习等。希望与大家分享学习经验,推广并加深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语言自然语言处理:文本分类相关推荐

  1. R语言构建xgboost文本分类模型(bag of words):xgb.cv函数交叉验证确定xgboost模型的最优子树个数、交叉验证获取最优子树之后构建最优xgboost模型并评估模型文本分类效能

    R语言构建xgboost文本分类模型(bag of words):xgb.cv函数交叉验证确定xgboost模型的最优子树个数.交叉验证获取最优子树之后构建最优xgboost模型并评估模型文本分类效能 ...

  2. 自然语言处理——文本分类概述

    内容提要 分类概述 分类流程 数据采集 爬虫技术 页面处理 文本预处理 英文处理 中文处理 去停用词 文本表示 特征选择 分类模型 分类概述   分类(Classification)是指自动对数据进行 ...

  3. R语言使用两个分类变量创建双向表(Two Way Table、两个分类变量的频率表)实战: 矩阵的双向表、dataframe的双向表、条形图和马赛克图来可视化频率表

    R语言使用两个分类变量创建双向表(Two Way Table.两个分类变量的频率表)实战: 矩阵的双向表.dataframe的双向表.条形图和马赛克图来可视化频率表 目录

  4. R语言创建自定义颜色(分类变量与颜色形成稳定映射)实战:设置因子变量(分类变量)到可视化颜色的稳定映射

    R语言创建自定义颜色(分类变量与颜色形成稳定映射)实战:设置因子变量(分类变量)到可视化颜色的稳定映射 目录

  5. R语言基于glmnet构建分类模型并可视化特征系数(coefficient)以及L1正则化系数(lambda)实战

    R语言基于glmnet构建分类模型并可视化特征系数(coefficient)以及L1正则化系数(lambda)实战 # 导入测试数据集 data(BinomialExample) x <- Bi ...

  6. 美团店铺评价语言处理以及文本分类(logistic regression)

    美团店铺评价语言处理以及文本分类(logistic regression) 美团店铺评价语言处理以及分类(LogisticRegression) 第一篇 数据清洗与分析部分 第二篇 可视化部分, 第三 ...

  7. R语言使用逻辑回归分类算法

    R语言使用逻辑回归分类算法 逻辑回归属于概率统计的分类算法模型的算法,是根据一个或者多个特征进行类别标号预测.在R语言中可以通过调用logit函数执行逻辑回归分类算法并预测输出概率.通过调用glm函数 ...

  8. 自然语言处理——文本分类综述

    最近在学习文本分类,读了很多博主的文章,要么已经严重过时(还在一个劲介绍SVM.贝叶斯),要么就是机器翻译的别人的英文论文,几乎看遍全文,竟然没有一篇能看的综述,花了一个月时间,参考了很多文献,特此写 ...

  9. r语言的逻辑回归分类

    iris 是r语言内置的数据集 head(iris) # 与python的不同iris.head() Sepal.Length Sepal.Width Petal.Length Petal.Width ...

  10. [深度学习] 自然语言处理 --- 文本分类模型总结

    文本分类 包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMO,BERT等)的文本分类 fastText 模型 textCNN 模型 charCNN 模型 Bi-LSTM 模型 ...

最新文章

  1. 学习MongoDB (1) :配置安装
  2. 军哥lnmp一键安装包nginx支持pathinfo配置
  3. 我在阿里做中后台开发
  4. 《数据科学:R语言实现》——2.5 使用Excel文件
  5. 高通---GPUCPU频率和工作模式的获取设置
  6. 【技术综述】“看透”神经网络
  7. P4321-随机漫游【状压dp,数学期望,高斯消元】
  8. python环境快速安装opencv 离线版安装
  9. constraint mysql_MySQL(Constraint)
  10. 接口请求json解析问题
  11. SAP SolMan 严重漏洞的自动化 exploit 代码遭公开
  12. [转载] Python-科赫雪花(科克曲线)
  13. js读取文件的内置方法之 FileReader
  14. 根据IP地址查询物理位置(IP地址定位库)并且查询当前地址的天气信息(中国气象网)
  15. 高通8953平台usb转以太网芯片ax88772驱动
  16. Android 蓝牙设备的查找与连接
  17. ClickHouse表引擎到底怎么选
  18. 编程语言的巅峰(嚯哈哈哈哈)
  19. 嵌入式uClinux及其应用开发(1)
  20. OC开发之——OC简介(1)

热门文章

  1. Linux怎么取消软链接
  2. Linux多台机器配置ssh免登录
  3. MySQL 事务的实现原理,写得太好了!
  4. 好烦,一封报警邮件,大量服务节点 redis 响应超时,又得要捉“虫”!
  5. 一个工作三年左右的Java程序员跟大家分享从业心得
  6. 火爆全球的区块链到底是怎么一回事?一文带你看懂
  7. 谷歌用3亿张图做了个深度学习实验,结论:数据还是越大越好
  8. 微软百名员工公开请愿,力挺“996.ICU”
  9. 「收藏」其实是欺骗自己
  10. 大腾讯的第一个开源项目「Tinker」