数据分析 文本分析
在本章中,我们将使用本书第 1 部分中抓取的数据。该数据包含描述自由职业者简介的文本,以及他们以美元计价的小时费率。以下部分的想法是拟合一个模型,在给定自由职业者的技能的情况下,我们能够预测其小时工资。
以下代码显示了如何在词袋矩阵中转换在这种情况下具有用户技能的原始文本。为此,我们使用了一个名为 tm 的 R 库。这意味着对于语料库中的每个单词,我们都会根据每个变量的出现次数创建变量。
library(tm)
library(data.table)
source('text_analytics/text_analytics_functions.R')
data = fread('text_analytics/data/profiles.txt')
rate = as.numeric(data$rate)
keep = !is.na(rate)
rate = rate[keep]
### Make bag of words of title and body
X_all = bag_words(data$user_skills[keep])
X_all = removeSparseTerms(X_all, 0.999)
X_all
# <<DocumentTermMatrix (documents: 389, terms: 1422)>>
# Non-/sparse entries: 4057/549101
# Sparsity : 99%
# Maximal term length: 80
# Weighting : term frequency-inverse document frequency (normalized) (tf-idf)
### Make a sparse matrix with all the data
X_all <-as_sparseMatrix(X_all)
现在我们将文本表示为一个稀疏矩阵,我们可以拟合一个模型来提供稀疏解决方案。这种情况的一个很好的替代方法是使用 LASSO(最小绝对收缩和选择运算符)。这是一个回归模型,能够选择最相关的特征来预测目标。
train_inx = 1:200
X_train = X_all[train_inx, ]
y_train = rate[train_inx]
X_test = X_all[-train_inx, ]
y_test = rate[-train_inx]
# Train a regression model
library(glmnet)
fit <-cv.glmnet(x = X_train, y = y_train,
family = 'gaussian', alpha = 1,
nfolds = 3, type.measure = 'mae')
plot(fit)
# Make predictions
predictions = predict(fit, newx = X_test)
predictions = as.vector(predictions[,1])
head(predictions)
# 36.23598 36.43046 51.69786 26.06811 35.13185 37.66367
# We can compute the mean absolute error for the test data
mean(abs(y_test-predictions))
# 15.02175
现在我们有一个模型,它给定了一组技能,可以预测自由职业者的时薪。如果收集更多数据,模型的性能会提高,但实现此管道的代码将是相同的。