R语言文本特征工程:词袋模型

2018 年 12 月 22 日 R语言中文社区

作者:黄天元,复旦大学博士在读,目前研究涉及文本挖掘、社交网络分析和机器学习等。希望与大家分享学习经验,推广并加深R语言在业界的应用。

邮箱:huang.tian-yuan@qq.com


Bag of words,中文译作词袋模型,即把文本的单词分开之后,统计每个单词出现的次数,然后作为该文本的特征表示。我们引用网上的一个图片来解释:



把原始文本转化为词袋模型的表示。Courtesy Zheng & Casari (2018)


下面我们会自己构造数据然后举一个实际例子,首先加载包:

library(pacman)
p_load(tidyverse,tidytext)


实践操作

第一步,我们先手动创造一个数据集:

corpus = c('The sky is blue and beautiful.',
          'Love this blue and beautiful sky!',
          'The quick brown fox jumps over the lazy dog.',
          'The brown fox is quick and the blue dog is lazy!',
          'The sky is very blue and the sky is very beautiful today',
          'The dog is lazy but the brown fox is quick!' )
labels = c('weather', 'weather', 'animals', 'animals', 'weather', 'animals')

tibble(Document = corpus,Category = labels,) -> corpus_df
corpus_df %>%
  mutate(id = 1:n()) -> corpus_df
corpus_df


## # A tibble: 6x 3
##  Document                                                Category    id
##  <chr>                                                   <chr>    <int>
## 1 The sky is blue and beautiful.                           weather      1
## 2 Love this blue and beautiful sky!                        weather      2
## 3 The quick brown fox jumps over the lazy dog.             animals      3
## 4 The brown fox is quick and the blue dog islazy!         animals      4
## 5 The sky is very blue and the sky is verybeautiful today weather      5
## 6 The dog is lazy but the brown fox is quick!              animals      6


词袋模型分词

因为这里有多个文本,因此要先根据文本分组,再来进行词袋模型分词。

corpus_df %>%
  group_by(id) %>%
  unnest_tokens(word,Document) %>%
  count(word,sort = T) %>%
  ungroup() -> bag_of_words_raw


去除停止词

中文里面有等等不携带信息的词,而英文则有the/is等词,我们不希望把它们考虑进去,因此需要去掉。这里我们用包里面自带的停止词包,然后取出它们。

data("stop_words")

bag_of_words_raw %>%
  anti_join(stop_words) %>%
  arrange(id) -> bag_of_words_tidy


## Joining, by = "word"


观察与替换

现在让我们看看转化后的格式是什么样的。

bag_of_words_tidy %>%
  print(n = Inf)


## # A tibble: 27x 3
##       idword          n
##   <int> <chr>    <int>
##  1     1 beautiful     1
##  2     1 blue          1
##  3     1 sky           1
##  4     2 beautiful     1
##  5     2 blue          1
##  6     2 love          1
##  7     2 sky           1
##  8     3 brown         1
##  9     3 dog           1
## 10     3fox           1
## 11     3jumps         1
## 12     3lazy          1
## 13     3quick         1
## 14     4blue          1
## 15     4brown         1
## 16     4dog           1
## 17     4fox           1
## 18     4lazy          1
## 19     4quick         1
## 20     5sky           2
## 21     5beautiful     1
## 22     5 blue          1
## 23     6brown         1
## 24     6dog           1
## 25     6fox           1
## 26     6lazy          1
## 27     6quick         1


也许有时候你需要的是文档-词矩阵,那么好,我们来变形:

bag_of_words_tidy %>%
  spread(word,n,fill = 0) -> bag_of_words_dtm

bag_of_words_dtm


## # A tibble: 6x 11
##      idbeautiful  blue brown   dog  fox jumps  lazy  love quick  sky
##  <int>     <dbl><dbl> <dbl> <dbl> <dbl> <dbl> <dbl><dbl> <dbl> <dbl>
## 1     1         1    1     0     0    0     0     0    0     0     1
## 2     2         1    1     0     0    0     0     0    1     0     1
## 3     3         0    0     1     1    1     1     1    0     1     0
## 4     4         0    1     1     1    1     0     1    0     1     0
## 5     5         1    1     0     0    0     0     0    0     0     2
## 6     6         0    0     1     1    1     0     1    0     1     0


这样,我们就可以随心所欲地在R里面使用词袋模型了。不过真实的应用中,文档-词矩阵会特别大,我们可以用cast_dfmcast_dtm函数把它变成一个稀疏矩阵,然后再处理。这取决于你后续要用什么分析,因为特定的文本包中具有特定的矩阵格式。词袋模型是典型的文本数据特征工程方法,可以不用,不能不会,因为它是后面n元模型、word2vec的基础。



往期精彩:



公众号后台回复关键字即可学习

回复 爬虫             爬虫三大案例实战  
回复 
Python        1小时破冰入门

回复 数据挖掘      R语言入门及数据挖掘
回复 
人工智能      三个月入门人工智能
回复 数据分析师   数据分析师成长之路 
回复 机器学习      机器学习的商业应用
回复 数据科学      数据科学实战
回复 常用算法      常用数据挖掘算法

登录查看更多
1

相关内容

词袋模型是自然语言处理和信息检索(IR)中使用的简化表示。 在此模型中,文本(例如句子或文档)表示为其单词的包(多集),而忽略了语法甚至单词顺序,但保持了多重性。 词袋模型也已用于计算机视觉。词袋模型通常用于文档分类方法中,其中每个单词的出现频率用作训练分类器的功能。
【实用书】Python机器学习Scikit-Learn应用指南,247页pdf
专知会员服务
269+阅读 · 2020年6月10日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
226+阅读 · 2020年3月22日
【经典书】精通机器学习特征工程,中文版,178页pdf
专知会员服务
359+阅读 · 2020年2月15日
【干货】用BRET进行多标签文本分类(附代码)
专知会员服务
85+阅读 · 2019年12月27日
【论文推荐】文本分析应用的NLP特征推荐
专知会员服务
34+阅读 · 2019年12月8日
新书《面向机器学习和数据分析的特征工程》,419页pdf
专知会员服务
143+阅读 · 2019年10月10日
学习自然语言处理路线图
专知会员服务
139+阅读 · 2019年9月24日
R语言机器学习:xgboost的使用及其模型解释
R语言中文社区
11+阅读 · 2019年5月6日
R语言自然语言处理:文本分类
R语言中文社区
7+阅读 · 2019年4月27日
R语言自然语言处理:情感分析
R语言中文社区
16+阅读 · 2019年4月16日
R语言自然语言处理:关键词提取与文本摘要(TextRank)
R语言中文社区
4+阅读 · 2019年3月18日
R语言自然语言处理:词性标注与命名实体识别
R语言中文社区
7+阅读 · 2019年3月5日
NLP自然语言处理(二)——基础文本分析
乐享数据DataScientists
12+阅读 · 2017年2月7日
Arxiv
5+阅读 · 2018年5月10日
Arxiv
6+阅读 · 2018年3月29日
VIP会员
相关VIP内容
【实用书】Python机器学习Scikit-Learn应用指南,247页pdf
专知会员服务
269+阅读 · 2020年6月10日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
226+阅读 · 2020年3月22日
【经典书】精通机器学习特征工程,中文版,178页pdf
专知会员服务
359+阅读 · 2020年2月15日
【干货】用BRET进行多标签文本分类(附代码)
专知会员服务
85+阅读 · 2019年12月27日
【论文推荐】文本分析应用的NLP特征推荐
专知会员服务
34+阅读 · 2019年12月8日
新书《面向机器学习和数据分析的特征工程》,419页pdf
专知会员服务
143+阅读 · 2019年10月10日
学习自然语言处理路线图
专知会员服务
139+阅读 · 2019年9月24日
相关资讯
R语言机器学习:xgboost的使用及其模型解释
R语言中文社区
11+阅读 · 2019年5月6日
R语言自然语言处理:文本分类
R语言中文社区
7+阅读 · 2019年4月27日
R语言自然语言处理:情感分析
R语言中文社区
16+阅读 · 2019年4月16日
R语言自然语言处理:关键词提取与文本摘要(TextRank)
R语言中文社区
4+阅读 · 2019年3月18日
R语言自然语言处理:词性标注与命名实体识别
R语言中文社区
7+阅读 · 2019年3月5日
NLP自然语言处理(二)——基础文本分析
乐享数据DataScientists
12+阅读 · 2017年2月7日
Top
微信扫码咨询专知VIP会员