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.