Big Data Analytics - Analisi del testo

In questo capitolo useremo i dati raccolti nella parte 1 del libro. I dati hanno un testo che descrive i profili dei liberi professionisti e la tariffa oraria che stanno addebitando in USD. L'idea della sezione seguente è quella di adattare un modello che, date le competenze di un libero professionista, siamo in grado di prevedere il suo stipendio orario.

Il codice seguente mostra come convertire il testo grezzo che in questo caso ha le competenze di un utente in una matrice di parole. Per questo usiamo una libreria R chiamata tm. Ciò significa che per ogni parola nel corpus creiamo una variabile con la quantità di occorrenze di ciascuna variabile.

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)

Ora che abbiamo il testo rappresentato come una matrice sparsa, possiamo adattare un modello che fornirà una soluzione sparsa. Una buona alternativa per questo caso è usare il LASSO (minimo ritiro assoluto e operatore di selezione). Questo è un modello di regressione in grado di selezionare le caratteristiche più rilevanti per prevedere l'obiettivo.

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

Ora abbiamo un modello che dato un insieme di competenze è in grado di prevedere lo stipendio orario di un libero professionista. Se vengono raccolti più dati, le prestazioni del modello miglioreranno, ma il codice per implementare questa pipeline sarebbe lo stesso.