使用 R 对文本数据进行机器学习
介绍
分析计算机如何理解文本的领域称为自然语言处理 (NLP)。NLP 有多种应用,如情绪分析、聊天机器人、AI 代理、社交媒体分析以及文本分类。在本指南中,您将学习如何使用流行的统计编程语言“R”在文本数据上构建监督机器学习模型。
数据
本指南中使用的数据来自机器学习竞赛网站 Kaggle。这是一份女装电子商务数据,由客户撰写的评论组成。在本指南中,我们将承担预测客户是否会推荐该产品的任务。在本指南中,我们将对原始数据集进行抽样。抽样数据包含 500 行和三个变量,如下所述:
- 服装 ID:这是唯一的 ID。
- 评论文本:包含客户评论的文本。
- 推荐 IND:二进制变量,表示客户推荐产品(“1”)或不推荐产品(“0”)。这是目标变量。让我们首先加载所需的库和数据。
library(readr)
library(dplyr)
#Text mining packages
library(tm)
library(SnowballC)
#loading the data
t1 <- read_csv("ml_text_data.csv")
glimpse(t1)
输出:
Observations: 500
Variables: 3
$ Clothing_ID <int> 1088, 996, 936, 856, 1047, 862, 194, 1117, 996...
$ Review_Text <chr> "Yummy, soft material, but very faded looking....
$ Recommended_IND <int> 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
上面的输出显示数据有三个变量,但重要的是变量“Review_Text”和“Recommended_IND”。
准备建模数据
由于文本数据不是传统的行列式格式(观察值和列中的变量),因此我们必须执行某些特定于文本的步骤。后续章节将讨论此类步骤的列表。
步骤 1-创建文本语料库
包含文本的变量需要转换为语料库以进行预处理。语料库是文档的集合。下面的第一行代码执行此任务。第二行打印第一个语料库的内容,而第三行打印相应的推荐分数。
corpus = Corpus(VectorSource(t1$Review_Text))
corpus[[1]][1]
t1$Recommended_IND[1]
输出:
1] "Yummy
从评论文字来看,显然客户对产品不满意,因此给出了零分的推荐分数。
第 2 步 - 转换为小写
该模型需要将“soft”和“Soft”等词视为相同。因此,使用以下代码行将所有单词转换为小写。
corpus = tm_map(corpus, PlainTextDocument)
corpus = tm_map(corpus, tolower)
Corpus[[1]][1]
输出:
1] "yummy
步骤 3 - 删除标点符号
这里的想法是删除所有非标准数字或字母。
corpus = tm_map(corpus, removePunctuation)
corpus[[1]][1]
输出:
1] "yummy soft material but very faded looking so much so that i am sending it back if a faded look is something you like then this is for you"
步骤 4 - 删除停用词
停用词是无用的单词,例如“i”、“is”、“at”、“me”、“our”。这些词没有用,因为此类停用词在语料库中出现的频率很高,但它们无助于区分目标类别。因此,删除停用词非常重要。
下面的代码行在“语料库”上使用tm_map函数并删除停用词以及单词“cloth”。删除单词“cloth”是因为此数据集是关于服装评论的,因此该词不会为模型增加任何预测能力。
corpus = tm_map(corpus, removeWords, c("cloth", stopwords("english")))
Corpus[[1]][1]
输出:
1] "yummy soft material faded looking much sending back faded look something like
第 5 步 - 词干提取
词干提取的理念是减少文本中出现的单词的屈折形式数量。例如,“argue”、“argued”、“arguing”、“argues”等单词被简化为它们的通用词干“argu”。这有助于减少词汇空间的大小。下面的代码行对语料库执行词干提取。
corpus = tm_map(corpus, stemDocument)
Corpus[[1]][1]
输出:
1] "yummi soft materi fade look much send back fade look someth like"
创建文档术语矩阵
最常用的文本预处理步骤已完成。现在我们准备提取词频,这些词频将用作预测问题中的特征。下面的代码行使用tm包中的DocumentTermMatrix函数并生成一个矩阵。矩阵中的行对应于文档(在我们的例子中是评论),列对应于这些评论中的单词。矩阵中的值是文档中单词的频率。
frequencies = DocumentTermMatrix(corpus)
上述命令会生成一个矩阵,其中许多单元格都包含零,这种问题称为稀疏性。建议删除文档中含有大量零的单词。以下代码行可执行此任务。
sparse = removeSparseTerms(frequencies, 0.995)
最后的数据准备步骤是将矩阵转换为数据框,这是“R”中广泛用于预测建模的格式。下面的第一行代码将矩阵转换为数据框,称为“tSparse”。第二行使所有变量名称都适合 R,而第三行代码将因变量添加到数据集。
tSparse = as.data.frame(as.matrix(sparse))
colnames(tSparse) = make.names(colnames(tSparse))
tSparse$recommended_id = t1$Recommended_IND
现在我们已准备好构建预测模型。但在此之前,设置模型的基线准确度始终是一个好主意。在分类问题的情况下,基线准确度是目标变量中多数标签的比例。下面的代码行打印目标变量“recommended_id”中标签的比例。
prop.table(table(tSparse$recommended_id)) #73.6% is the baseline accuracy
输出:
0 1
0.264 0.736
上述输出显示,73.6% 的评论来自推荐该产品的客户。这成为预测模型的基准准确率。
创建机器学习的训练和测试数据
为了评估预测模型的表现,我们将数据分为训练数据和测试数据。下面的第一行代码加载caTools包,该包将用于创建训练数据和测试数据。第二行设置“随机种子”,以便结果可重现。
第三行创建数据分区,保留 70% 的数据用于训练模型。第四行和第五行代码创建训练(“trainSparse”)和测试(“testSparse”)数据集。
library(caTools)
set.seed(100)
split = sample.split(tSparse$recommended_id, SplitRatio = 0.7)
trainSparse = subset(tSparse, split==TRUE)
testSparse = subset(tSparse, split==FALSE)
随机森林
随机森林分类算法是多个分类树的集合,它们作为一个整体运行。它是最强大的机器学习算法之一。在“R”中,可以使用randomForest库来构建随机森林模型,该模型加载在下面的第一行代码中。第二行设置随机状态以实现可重复性,而第三行和第四行代码将目标变量转换为“因子”类型。
第五行在训练数据上训练随机森林算法,而第六行使用训练后的模型在测试数据上进行预测。第七行打印混淆矩阵。
library(randomForest)
set.seed(100)
trainSparse$recommended_id = as.factor(trainSparse$recommended_id)
testSparse$recommended_id = as.factor(testSparse$recommended_id )
#Lines 5 to 7
RF_model = randomForest(recommended_id ~ ., data=trainSparse)
predictRF = predict(RF_model, newdata=testSparse)
table(testSparse$recommended_id, predictRF)
# Accuracy
117/(117+33) #78%
输出:
predictRF
0 1
0 12 28
1 5 105
[1] 0.78
上面的输出显示,在测试数据的 150 条记录中,模型对其中 117 条的预测正确,准确率为 78%。
预测模型的评估
我们为数据设定的基准准确度为 73%。随机森林模型轻松击败了这一基准模型,准确度达到 78%。
结论
在本指南中,您学习了使用强大的统计编程语言“R”进行文本清理和预处理的基础知识。您还学习了如何在文本数据上构建和评估随机森林分类算法。随机森林模型的表现优于基线方法。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~