大数据分析 - 文本分析

在本章中,我们将使用本书第 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

现在我们有一个模型,给定一组技能能够预测自由职业者的小时工资。 如果收集到更多数据,模型的性能将会提高,但实现此管道的代码将是相同的。