Phân tích dữ liệu lớn - Phân tích văn bản

Trong chương này, chúng ta sẽ sử dụng dữ liệu đã được thu thập trong phần 1 của cuốn sách. Dữ liệu có văn bản mô tả hồ sơ của các dịch giả tự do và mức phí hàng giờ mà họ đang tính bằng USD. Ý tưởng của phần sau là phù hợp với một mô hình cung cấp các kỹ năng của một freelancer, chúng tôi có thể dự đoán mức lương theo giờ của người đó.

Đoạn mã sau đây cho thấy cách chuyển đổi văn bản thô mà trong trường hợp này là các kỹ năng của người dùng trong một ma trận nhiều từ. Đối với điều này, chúng tôi sử dụng một thư viện R được gọi là tm. Điều này có nghĩa là đối với mỗi từ trong kho ngữ liệu, chúng tôi tạo biến với số lần xuất hiện của mỗi biến.

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)

Bây giờ chúng ta có văn bản được biểu diễn dưới dạng ma trận thưa thớt, chúng ta có thể phù hợp với một mô hình sẽ cho một giải pháp thưa thớt. Một giải pháp thay thế tốt cho trường hợp này là sử dụng LASSO (toán tử lựa chọn và co ngót ít nhất tuyệt đối). Đây là một mô hình hồi quy có thể chọn các tính năng phù hợp nhất để dự đoán mục tiêu.

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

Bây giờ chúng ta có một mô hình đưa ra một bộ kỹ năng có thể dự đoán mức lương theo giờ của một freelancer. Nếu nhiều dữ liệu hơn được thu thập, hiệu suất của mô hình sẽ cải thiện, nhưng mã để triển khai đường ống này sẽ giống nhau.