利用机器学习可以很方便的做情感分析。本篇文章将介绍在R语言中如何利用机器学习方法来做情感分析。在R语言中,由Timothy P.Jurka开发的情感分析以及更一般的文本挖掘包已经得到了很好的发展。你可以查看下sentiment包以及梦幻般的RTextTools包。实际上,Timothy还写了一个针对低内存下多元Logistic回归(也称最大熵)的R包maxtent。
然而,RTextTools包中不包含朴素贝叶斯方法。e1071包可以很好的执行朴素贝叶斯方法。e1071是TU Wien(维也纳科技大学)统计系的一门课程。这个包的主要开发者是David Meyer。
我们仍然有必要了解文本分析方面的知识。用R语言来处理文本分析已经是公认的事实(详见R语言中的自然语言处理)。tm包算是其中成功的一部分:它是R语言在文本挖掘应用中的一个框架。它在文本清洗(词干提取,删除停用词等)以及将文本转换为词条-文档矩阵(dtm)方面做得很好。这里是对它的一个介绍。文本分析最重要的部分就是得到每个文档的特征向量,其中词语特征最重要的。当然,你也可以将单个词语特征扩展为双词组,三连词,n-连词等。在本篇文章,我们以单个词语特征为例做演示。
注意,在R中用ngram包来处理n-连词。在过去,Rweka包提供了函数来处理它,感兴趣的可以查看这个案例。现在,你可以设置RTextTools包中create_matrix函数的参数ngramLength来实现它。
第一步是读取数据:
创建词条-文档矩阵:
现在,我们可以用这个数据集来训练朴素贝叶斯模型。注意,e1071要求响应变量是数值型或因子型的。我们用下面的方法将字符串型数据转换成因子型:
测试结果准确度:
显然,这个结果跟python得到的结果是相同的(这篇文章是用python得到的结果)。
其它机器学习方法怎样呢?
下面我们使用RTextTools包来处理它。
首先,指定相应的数据:
其次,用多种机器学习算法训练模型:
现在,我们可以使用训练过的模型做测试集分类:
准确性如何呢?
得到模型的结果摘要(特别是结果的有效性):
结果的交叉验证:
结果可在我的Rpub页面找到。可以看到,maxent的准确性跟朴素贝叶斯是一样的,其它方法的结果准确性更差。这是可以理解的,因为我们给的是一个非常小的数据集。扩大训练集后,利用更复杂的方法我们对推文做的情感分析可以得到一个更好的结果。示例演示如下:
推文情感分析
数据来自victornep。victorneo展示的是用python对推文做情感分析。这里,我们用R来处理它:
读取数据:
首先,尝试下朴素贝叶斯
然后,尝试其他方法:
这里,我们也希望得到正式的测试结果。包括:
1.analytics@algorithm_summary:包括精确度,召回率,准确率,F-scores的摘要
2.analytics@label_summary:类标签摘要
3.analytics@document_summary:所有数据和得分的原摘要
4.analytics@ensemble_summary:所有 精确度/覆盖度 比值的摘要
现在让我们看看结果:
与朴素贝叶斯方法相比,其它算法的结果更好,召回精度高于0.95。结果可在Rpub查看
原文链接:http://www.xueqing.cc/cms/article/107
%>%是管道符的意思,把左边的输出(不包括 <- 之前的)当成右边的输入。
都可以shift + alt + 上下 :快速复制粘贴
alt + 上下 :移动行
ctrl + alt + 上下 :多重光标
首先选中要注释掉的行,然后按Ctrl+shift+C ,这样就注释掉了。
sessionInfo()
.libPaths()
一篇关于包的博客
library(installr)
updateR()
COS中文论坛 统计之都旗下的论坛网站(d.cosx.org),它和其主站(cosx.org)一 起,是一个致力于推广与应用统计学知识的网站和社区。
1 help("t.test")
2 ?t.test
3 help.search("t.test")
4 apropos("t.test")
5 RGui>Help>Html help
6 查看R包pdf手册
getwd() 显示工作目录
setwd() 设定工作目录
list.files() 列出目录或文件夹下的文件
demo( ) 显示R的基本程序包
example( ) 显示在线帮助的例子
example(barplot)
可以把若干行命令保存在一个文本文件(比如Eg3.R)中,然 后用source函数来运行整个文件: source("E:/R demo/Chapter1-Eg3.R")
sum, mean, var, sd, min, max, range, median, IQR(四分位间距)等为统计量, sort,order,rank与排序有关, 其它还有ave,fivenum,mad,quantile, stem等
-1:1/0 当中/是优先级靠后的操作。相当于c(-1,0,1)/0
names(df) <- c("male", "female", "unknown")
对于矩阵,我们可以使用属性rownames和colnames来访问行名和列名。
我们也可以先定义矩阵x然后再为dimnames(x)赋值:
数值型数据 :1.2345e30
复数常量就用3.5-2.1i
缺失值:NA(Not Available)
是否含有缺失值:
NaN表示不确定的数
• NaN属于NA的一种
• NA不是NaN
注意下面例子的比较 :
assign("x1", c(1, 2))
sort(x)返回x的元素从小到大排序的结果向量。
x=c(2,10,6,8,4,5)sort(x) [1] 2 4 5 6 8 10 order(x)返回使得x从小到大排列的元素下标向量(x[order(x)]等效于sort(x))。
此外numeric(n)可以产生一个长度为n的零向量(numeric(n)是一个 很好用的外部存储器)
paste函数用来把它的自变量连成一个字符串,中间用空格分开
Re( )计算实部,Im( )计算虚部, Mod( ) 计算复数模,Arg( )计算复数幅角。
v为一个向量,取值在-length(x)到-1之间,表示扣除相应 位置的元素。例如:
可以用x[]的写法:
R的对象有两个基本的属性:类型属性(mode)和长度属性(length)。
长度为零的向量 numeric( ) 或者 numeric(0) character( ) 或者 character(0)
数组(array): 带多个下标的类型相同的元素的集合,
函数matrix():用于构造二维数组,即矩阵
函数factor( )用来把一个向量编码成为一个因子。
可以自行指定各离散取值水平(levels),不指定时由x的不同值来求得。
• labels可以用来指定各水平的标签,不指定时用各离散取值的对应字符串。
• exclude参数用来指定要转换为缺失值(NA)的元素值集合。
• ordered取真值时表示因子水平(Levels)是有次序的
因子可以用来作为另外的同长度变量的分类变量,使用tapply() 函数可以完成分类统计
nchar()这个函数简单,统计向量中每个元素的字符个数
tolower()和toupper()可以进行大小写字母的转换
chartr()把字符串里的元素,按要求进行转换
拆分字符串用strsplit()函数,strsplit得到的结果是列表,后面的处理要调用列表
其任何一个语句都可以看成是一个表达式。
表达式之间以分号分隔或用换行分隔。
表达式可以续行,只要前一行不是完整表达式,则下一行为上一行的继续。
线性回归模型:
lm()函数的返回值叫做模型拟合结果对象,本质上是一个列表, 有model 、coefficients、residuals等成员。lm()的结果显示十分 简单,为了获得更多的拟合信息,可以使用对lm类对象有特 殊操作的通用函数,这些函数包括:
add1 coef effects kappa predict residuals alias deviance family labels print summary anova drop1 formula plot proj
加号+或 者减号-,表示在模型中加入一项或去掉一项,第一项前面如果是加号可以 省略
在非交互运行(程序)中应使用print()来输出。
• digits参数指定每个数输出的有效数字位数;
• quote 参数指定字符串输出时是否带两边的撇号;
• print.gap参数指定矩阵或数组输出时列之间的间距
也用来输出,但它可以把多个参数连接起来再输出(具有paste() 的功能)。例如:
读取文件:
strsplit()得到的结果是 列表。
grep() 和 grepl()
sub()和gsub()
但严格地说R语言 没有字符串替换的函数,因为R语言不管什么操作对参数都是传值不传址,区别如下:
用substr()和substring() 可以通过位置进行字符串拆分或提取,两者的参数设置基本相同:
strtrim() 函数可以用于将字符串修剪到特定的显示宽度通过位置进 行字符串拆分或提取:
由于日期内部是用double存储的天数,所以是可以相减的。
weekdays ( )取日期对象所处的周几;
months ( )取日期对象的月份;
quarters ( )取日期对象的季度;
其任何一个语句都可以看成是一个表达式。
表达式之间以分号分隔或用换行分隔。
表达式可以续行,只要前一行不是完整表达式,则下一行为上一行的继续。
quantile(x, probs=seq(0,1,0.25), na.rm=FALSE, names=TRUE, type=7, …)
probs给出相应的百分位数,默认值是0,0.25,0.5,0.75,1;na.rm是处 理缺失数据的,na.rm=TRUE时,NA和NaN将从数据中移走,向量取值中 若有NA或NaN,要添加这一参数,否则会出错;names若为TRUE,返回 值当中有names这个属性"type是取值1-9的整数,选择了九种分位数算法 (具体算法见帮助文件)中的一种。
数据的分布主要考察分布函数(p), 密度函数(d), 分位数函数(q)及产生随机数(r)
以正态分布为例:
hist(x, breaks="Sturges", freq=NULL, probability=!freq,… )
break规定了直方图的组距(必须覆盖数据的范围);freq是逻辑变量,TRUE是频率直方图, FALSE是密度直方图;probability和freq相反,TRUE是密度直方图,FALSE是频率直方图
其形式为 coplot(y ~ x | z),其中x 和y是数值型向量,z是同长度的因子。 对z的每一水平,绘制相应组的x和y的散点图
R缺省的图形边空常常太大,以至于有时图形窗口较小时边空占了整个图形的很大一部分。
R可以在同一页面开若干个按行、列排列的窗格,在每个窗格中可以作一 幅图。每个图有自己的边空,而所有图的外面可以包一个“外边空”。
一页多图用 mfrow 参数或 mfcol 参数规定,如
函数 mtext 用来在外边空加文字标注。其用法为
在多图环境中还可以用 mfg 参数来直接跳到某一个窗格,比如
可以不使用多图环境而直接在页面中的任意位置产生一个窗格来绘图,参数为 fig ,如:
先用as.factor()转化成因子。因为levels()函数里面必须是因子。
dat$Genre没有转化成因子形式,as.factor(dat$Genre)就可以了
该消息表明文件的最后一行不以行尾 (EOL) 字符结尾(换行符 ( \n ) 或回车 + 换行符 ( \r\n ))。此消息的初衷是警告您该文件可能不完整;大多数数据文件都有一个 EOL 字符作为文件中的最后一个字符。
这是因为R读取文件的时候,是一整段character,所以它只会返回1,适当给他分一下段。
变量可归结为名义型、有序型或连续型变量。名义型变量是没有顺序之分的类别变量。类别(名义型)变量和有序类别(有序型)变量在R中称为因子(factor)。因子在R中非常重要,因为它决定了数据的分析方式以及如何进行视觉呈现。因子(factor)是R语言中比较特殊的一个数据类型, 它是一个用于存储 的类型,举个例子,从性别上,可以把人分为:男人和女人,从年龄上划分,又可以把人分为:未成年人(<18岁),成年人(>=18)。
R把表示分类的数据称为因子,因子的行为有时像字符串,有时像整数。因子是一个向量,通常情况下,每个元素都是字符类型,也有其他数据类型的元素。因子具有因子水平(Levels),用于限制因子的元素的取值范围,R强制:因子水平是字符类型,因子的元素只能从因子水平中取值,这意味着,因子的每个元素要么是因子水平中的字符(或转换为其他数据类型),要么是缺失值,这是因子的约束,是语法上的规则。
通常情况下,在创建数据框变量时,R隐式把数据类型为字符的列创建为因子,这是因为R会把文本类型默认为类别数据,并自动转换为因子。前面我们在讲数据框时,就有提到。
通过class()函数检查gender列的类,结果是因子类型,而不是字符向量。
可以通过factor()函数创建因子,factor()函数的第一个参数必须是字符向量,通过levels参数显式设置因子水平。
参数注释:
例如,因子sex的值是向量c('f','m','f','f','m'),因子水平是c('f','m')
因子水平规定了 因子取值的范围 ,每一个因子,都包含因子水平的信息,例如,打印gender列,可以看到因子的元素和水平:
该因子中的每个值都是一个字符串,它们被限制为“f”、“m”和缺失值(NA)。如果把其他字符串添加到gender列中,R会抛出警告消息,并把错误赋值的元素设置为NA,例如:
因子水平,可以通过函数levels(factor)来查看:
水平的级数,相当于level的长度,可以由nlevels函数查询到:
使用factor函数创建因子,可以使用labels参数为每个因子水平添加标签,labels参数的字符顺序,要和levels参数的字符顺序保持一致,例如:
通常情况下,因子一般是无序的,这可以通过is.ordered()函数来验证:
因子的顺序,实际上是指因子水平的顺序,有序因子的因子水平是有序的。在特殊情况下,有些因子的水平在语义上大于或小于其他水平,R支持按顺序排列的因子,使用ordered函数,或通过给factor函数传入order=TRUE参数,把无序因子转换为有序的因子。
ordered()函数不能指定特定因子水平的顺序,通常情况下,因子中先出现的水平小于后出现的水平。例如,通过ordered函数把sex因子转换为有序的因子:
通过factor函数创建有序因子,通过levels指定因子的顺序。
因子的顺序,其实是因子水平的顺序,我们可以通过levels,使现有的因子按照指定的因子水平来排序。
例如,把heights数据框的gender,按照指定的levels,转换成有序因子:
在数据清理时,可能需要去掉与因子水平对应的数据,通常情况下,需要删除未使用的因子水平,可以使用droplevels函数,它接受因子或是数据框作为参数。
如果x是数据框,那么把数据框中未使用的因子删除。
在数据清理中,有时需要把因子转换为字符,通常情况下,使用as.character()函数,把因子转换为字符串:
使用as.numeric()或as.integer()函数可以把因子转换成对应的整数.
函数 cut() 能够把数值变量切成不同的块,然后返回一个因子.
参数注释:
例如,把身高数据,按照指定的切割点向量分割:
当需要把因子转换为有序因子时,要注意因子水平的顺序.