机器学习

自然语言处理-R

2018-04-22  本文已影响5人  灵妍

楔子:
tm程序包就算在本地安装上了,也会无法载入,我们可以通过手动打勾的方式检测是不是需要安装其它的辅助包,联网安装则不需要考虑这些问题

tsv.PNG
自然语言处理是指我们分析的对象是文本,可以是中文、日文、英文等等。这里我们要分析评论是好还是坏,也就是通过输入一条评论,计算机可以识别评论的性质。
对于自然语言处理,常用的CSV数据格式是不适用的,因为是逗号分隔符,逗号很容易被误认为是文本信息本身,所以我们使用tsv格式,也就是将逗号变为tab制表符,也就是多个空格分割文本数据。
1、读取数据

代码:

# Natural Language Processing

# Importing the dataset
dataset_original = read.delim('Restaurant_Reviews.tsv', quote = '', stringsAsFactors = FALSE)

这里delim是指读取tsv文件,参数quote为空代表在文本中的引号将不会被读取。stringAsFactors为错误代表文本不会被看成分类因子,由于我们要处理的是字符与字符之间的关系,不能将评论本身视为某一类。

2、创建词袋
copus.PNG

代码:

# Cleaning the texts
# install.packages('tm')
# install.packages('SnowballC')
library(NLP)
library(tm)
library(SnowballC)
corpus = VCorpus(VectorSource(dataset_original$Review))

所谓的corpus词袋就是指文集,由一篇一篇的文章组成,这里一条评论构成一篇文章。

3、去掉噪声数据(清理数据)

代码:

corpus = tm_map(corpus, content_transformer(tolower))
corpus = tm_map(corpus, removeNumbers)
corpus = tm_map(corpus, removePunctuation)
corpus = tm_map(corpus, removeWords, stopwords())
corpus = tm_map(corpus, stemDocument)
corpus = tm_map(corpus, stripWhitespace)

这里包括大小写转换,去掉数字,去掉标点符号,去掉虚词(指示代词,this,that),词根化(转化成一般现在时,一些语言的动词有多种词态,名词有单复数形式,还有形容词的一般形式等等),之前去除数字、标点符号、虚词会使单词间留下多余的间隔,这里要重新使单词间的间隔为一个空格。
虚词实词
这里特别介绍一下tm包,是文本挖掘包,可以对文字信息做很多处理

大小写验证.PNG
取去除数字验证.PNG
去除标点符号验证.PNG
取出虚词验证.PNG
这里要特别说明一下虚词是不具有实际意义,只是构成语法的词,也以是指示代词,少量的名词,量词等等。我们的stopwords函数是来自于SnowBallc包的函数,表示不同语言的虚词,默认是英语。
词根化验证.PNG
去除多余空格验证.PNG
4、建立稀疏矩阵
dtm.PNG

代码:

# Creating the Bag of Words model
dtm = DocumentTermMatrix(corpus)
dtm = removeSparseTerms(dtm, 0.999)

这里的稀疏矩阵是以每一条评论为行,以每一个不同的单词为列记录一条评论中这个单词是否出现过,也可能是出现了几次。
由于矩阵的列数比较大,我们规定了最大稀疏程度,这里有1000条评论,我们去除了稀疏程度大于99.9%的,也就是只在一条评论中出现过的单词。

5、分类模型

适用于文本分类的分类算法有朴素贝叶斯,决策树,随机森林等等,这里我们使用随机森林算法。
代码:

dataset = as.data.frame(as.matrix(dtm))
dataset$Liked = dataset_original$Liked

# Encoding the target feature as factor
dataset$Liked = factor(dataset$Liked, levels = c(0, 1))

# Splitting the dataset into the Training set and Test set
# install.packages('caTools')
library(caTools)
set.seed(123)
split = sample.split(dataset$Liked, SplitRatio = 0.8)
training_set = subset(dataset, split == TRUE)
test_set = subset(dataset, split == FALSE)

# Fitting Random Forest Classification to the Training set
# install.packages('randomForest')
library(randomForest)
classifier = randomForest(x = training_set[-692],
                          y = training_set$Liked,
                          ntree = 10)

# Predicting the Test set results
y_pred = predict(classifier, newdata = test_set[-692])

# Making the Confusion Matrix
cm = table(test_set[, 692], y_pred)

由于上文得到的是稀疏矩阵,分类算法处理的是数据文件,前两行代码我们把稀疏矩阵转换成数据文件,并且添加了分类结果列。
然后3行和4行我们对于分类结果进行因子化,这样才便于分类。
由于数据集样本比较小,我们将训练集和测试集的比例划分为4:1。
注意:如果没有对分类结果进行因子化,我们得到的可能是回归树。
运行结果:


cm.PNG
上一篇 下一篇

猜你喜欢

热点阅读