整洁的数据应该是这样的
对于整洁的文本数据,储存在每行中的数据通常是单个单词,但也可以是n-gram,句子或段落。
使用unnest_tokens函数对数据进行处理
简单介绍一下unnest_tokens函数:
unnest_tokens这里使用的两个基本参数。首先,输出的列名,上面是word,然后是文本来输入列(text在本例中)。
使用之后unnest_tokens,我们将每行拆分
文本分析的流程:
就是写了傲慢与偏见的那个人,说实话这部作品的确值得一看
数据来自于Jane Austen的 janeaustenr 包
linenumber 对应的是多少行, chapter 对应的是第多少章。
要将其作为一个整洁的数据集来处理,还需要将句子转化成文更加基本的格式
此函数使用 tokenizers 包将原始数据框中的每一行文本分隔为标记。默认标记化用于单词,但其他选项包括字符,n-gram,句子,行,段落或正则表达式模式周围的分隔。
也就是修改下面这个参数:
既然数据是每行一个字的格式,我们可以使用像dplyr这样的整洁工具来操作它。通常在文本分析中,我们会想要删除停用词停用词是对分析无用的词,通常是非常常见的词,例如英语中的“the”,“of”,“to”等等。我们可以用一个删除停用词(保存在tidytext数据集中stop_words)anti_join()。
我们也可以使用 dplyr count() 来查找所有书籍中最常见的单词。
可以看见,最常见的单词是 miss
进行可视化:
因为我们一直在使用整洁的工具,所以我们的字数存储在一个整洁的数据框中。这允许我们将它直接传递给ggplot2包,例如创建最常见单词的可视化
刚接触R语言一周,和matab不同R作用于数据挖掘的库很多,详解见 R语言数据挖掘包
,下面简介文本分析经常使用到的三个包
tm 为文本挖掘提供综合性处理 Rwordmsg 进行中文分词 wordcloud 统计词云
以第三届泰迪杯A题提供的数据集国美-Sheet1进行文本分析 : 第三届泰迪杯
转化为txt的数据集如下图所示:
生成词云:
R语言特征:1. type.convert()函数主要用在read.table()函数中,返回向量和因子类型,当输入为double型时会丢失精度。
>type.convert(c('abc','bcd')) # 返回因子类型
[1] abc bcd
Levels: abc bcd
>type.convert(c(as.double(1.12121221111),'1.121')) # double型丢失精度
[1] 1.121212 1.121000
2. 如果一个文件包含有小数位的数据,通过read.table()函数读取时,会指定为numeric类型。
新建一个文件num.csv包括小数
1,2,1.11
2.1,3,4.5
用read.table读取文件,并查看列的类型。
>num<-read.table(file="num.csv",sep=",") # 读文件
>num
V1 V2 V3
1 1.0 2 1.11
2 2.1 3 4.50
>class(num)
[1] "data.frame"
>class(num$V1) # 查看列的类型为numeric
[1] "numeric"
3. tools包用Rdiff()函数的参数useDiff为FALSE时,与POSIX系统的diff -b命令类似。
新建文件num2.csv
3,2,1.11
2.1,3,4.5
用Rdiff()比较两个文件num.csv和num2.csv。
>Rdiff('num.csv','num2.csv',useDiff = FALSE)
1c1
<1,2,1.11
---
>3,2,1.11
[1] 1
4. 新函数anyNA(),结果与 any(is.na(.))一致,性能更好。
>is.na(c(1, NA))
[1] FALSE TRUE
>any(is.na(c(1, NA)))
[1] TRUE
>anyNA(c(1, NA))
[1] TRUE
5. arrayInd()和which()函数增加useNames参数,用于列名的匹配。我在测试过程,不太理解这个参数的意义。
>which
function (x, arr.ind = FALSE, useNames = TRUE)
6. is.unsorted()函数支持处理原始数据的向量。
>is.unsorted(1:10) # 排序的向量
[1] FALSE
>is.unsorted(sample(1:10)) # 无序的向量
[1] TRUE
7. 用于处理table的as.data.frame()函数和as.data.frame.table()函数,支持向provideDimnames(sep,base)函数传参数。我在测试过程中,也不理解具体是什么更新。
8. uniroot()函数增加新的可选参数extendInt,允许自动扩展取值范围,并增加返回对象参数init.it。
>f1 <- function(x) (121 - x^2)/(x^2+1) # 函数f1
>f2 <- function(x) exp(-x)*(x - 12) # 函数f2
>try(uniroot(f1, c(0,10))) # 在(0,10)的区间求f1函数的根
Error in uniroot(f1, c(0, 10)) :
f() values at end points not of opposite sign
>try(uniroot(f2, c(0, 2))) # 在(0,2)的区间求f2函数的根
Error in uniroot(f2, c(0, 2)) :
f() values at end points not of opposite sign
>str(uniroot(f1, c(0,10),extendInt="yes")) # 通过extendInt参数扩大取值搜索范围
List of 5
$ root : num 11
$ f.root : num -3.63e-06
$ iter : int 12
$ init.it : int 4
$ estim.prec: num 6.1e-05
>str(uniroot(f2, c(0,2), extendInt="yes")) # 通过extendInt参数扩大取值搜索范围
List of 5
$ root : num 12
$ f.root : num 4.18e-11
$ iter : int 23
$ init.it : int 9
$ estim.prec: num 6.1e-05
9. switch(f,)函数,当参数f是因子类型时,会出警告提示,需要转换字符串参数。
>switch(ff[1], A = "I am A", B="Bb..", C=" is C")# ->"A" # 警告提示
[1] "I am A"
Warning message:
In switch(ff[1], A = "I am A", B = "Bb..", C = " is C") :
EXPR is a "factor", treated as integer.
Consider using 'switch(as.character( * ), ...)' instead.
>switch(as.character(ff[1]), A = "I am A", B="Bb..", C=" is C") # 转型为字符串处理
[1] " is C"
10. 解析器已经更新,使用更少的内存。