#---------------------------------------------------------------#
## NLP                                                        ##

rm(list = ls())
library(lsa)                        # latente semantique analyse       
getwd()
                                    # archivos in /clasicos
dir <- paste(getwd(),"clasicos", sep ="/")
  
data(stopwords_en)                  # stopword inglés
stopwords_en[1:5]

                                    # todas las palabras
M_palabra= textmatrix(dir, stopwords=stopwords_en,
                   stemming=FALSE, 
                   minGlobFreq=0)
dim(M_palabra)
M_palabra.df <- data.frame(M_palabra[,])

                                    # los radicales/stem
M= textmatrix(dir, stopwords=stopwords_en,
              stemming=TRUE, 
              minGlobFreq=0)
dim(M)

                                    # menos de stem
M= textmatrix(dir, stopwords=stopwords_en,
              stemming=TRUE, 
              minGlobFreq=6)
dim(M)
M.df <- data.frame(M[,])

attributes(M)$dim                   # estudio estructura M
attributes(M)$class
attributes(M)$dimnames$terms
attributes(M)$dimnames$docs

#---------------------------------------------------------------#

X <-  lw_logtf(M) * gw_idf(M)                 # weight functions

SVD <- lsa(X, dims=dimcalc_raw())             # todos val sing
S   <- SVD[3] # diagonal valores singulares
S   <- unlist(S)
n_s <- sum((cumsum(S)/sum(S))<0.8)            # Pareto
n_s

SVD <- lsa(M, dims=n_s)                       # filtro
S   <- SVD[3] # diagonal valores singulares
S   <- unlist(S)                              # truco
S   <- diag(unlist(S))
S

U <- SVD[1] # U términos/tópicos (vectores singulares derechos)
U <- data.frame(U)                            # lazy astuce
U <- as.matrix(U)
head(U)


V <- SVD[2] # V documento/tópicos (vectores singulares izquierdos)
V <- data.frame(V)
V <- as.matrix(V)
head(V)


#---------------------------------------------------------------#
plot(V,     # plot en el espacio de los conceptos/tópicos
     xlab = "topique 1",
     ylab = "topique 2", 
     xlim = c(-0.9,0.3),  # ajuste manual
     ylim = c(-1, 0.7))   # ajuste manual

text(V, labels = row.names(V),  # etiquetas
        adj    = c(-0.1,0.3))   # ajuste manual


#---------------------------------------------------------------#
M_ <- U %*% S %*% t(V)          # reconstrucción y prueba
dens <- density(M_-M)
plot(dens)
sd_dens <- sd(M_-M)
sd_dens

#---------------------------------------------------------------#

StV <- S %*% t(V)               # tópicos por documentos
head(StV)
US  <- U %*% S                  # término para tópicos
head(US)

                                # normalización z-score
                                # de las columnas de U
z_score_1  <- (U[,1] - mean(U[,1]))/sd(U[,1])
z_score_1[1:5]

z_score_2  <- (U[,2] - mean(U[,2]))/sd(U[,2])
z_score_2[1:5]

                                # diferencia entre tópicos
                                # búsqueda de los máximos
delta_U <- z_score_2 - z_score_1
delta_U_ <- abs(delta_U)
sd(delta_U_)
which(delta_U_ > 3*sd(delta_U_))
list_delta_fort <- delta_U[which(delta_U_ > 3*sd(delta_U_))]
sl <- sort(list_delta_fort)           # palabra disjunta XOR
sl[1:5]
sl[(length(sl)-5):length(sl)]


                                # echar un ojo
round(associate(M,"love")[1:5],3)
round(associate(M,"sudden")[1:5],3)

                                        # alrededor de las palabra
positions <- which(( row.names(M_palabra.df) == "love"))
positions <- seq(-2,10) + positions     # truco que debe recordar
alrededor_de_love.df <- data.frame(M_palabra.df[positions,])

positions <- which(( row.names(M_palabra.df) == "sudden"))
positions <- seq(-2,4) + positions
alrededor_de_sudden.df <- data.frame(M_palabra.df[positions,])

#---------------------------------------------------------------#

