Para realizar esta prueba es necesario tener actualizada la máquina virtual con la versión más reciente de MLlib.
Para la actualización, debe seguir los pasos que se indican a continuación:
Entrar en la vm como root:
vagrant ssh
sudo bash
Ir a /usr/local/bin
Descargar la última versión de spark desde la vm mediante
wget http://www-eu.apache.org/dist/spark/spark-1.6.1/spark-1.6.1-bin-hadoop2.6.tgz
Desempaquetar:
tar xvf spark-1.6.1-bin-hadoop2.6.tgz
(y borrar el tgz)
Lo siguiente es un parche, pero suficiente para que funcione:
Guardar copia de spark-1.3: mv spark-1.3.1-bin-hadoop2.6/ spark-1.3.1-bin-hadoop2.6_old
Crear enlace a spark-1.6: ln -s spark-1.6.1-bin-hadoop2.6/ spark-1.3.1-bin-hadoop2.6
In [ ]:
In [ ]:
#nltk.download()
mycorpus = nltk.corpus.reuters
Para evitar problemas de sobrecarga de memoria, o de tiempo de procesado, puede reducir el tamaño el corpus, modificando el valor de la variable n_docs a continuación.
In [ ]:
n_docs = 500000
filenames = mycorpus.fileids()
fn_train = [f for f in filenames if f[0:5]=='train']
corpus_text = [mycorpus.raw(f) for f in fn_train]
# Reduced dataset:
n_docs = min(n_docs, len(corpus_text))
corpus_text = [corpus_text[n] for n in range(n_docs)]
print 'Loaded {0} files'.format(len(corpus_text))
A continuación cargaremos los datos en un RDD
In [ ]:
corpusRDD = sc.parallelize(corpus_text, 4)
print "\nRDD created with {0} elements".format(corpusRDD.count())
Prepare los datos para aplicar un algoritmo de modelado de tópicos en pyspark
. Para ello, aplique los pasos siguientes:
Guarde el resultado en la variable corpus_tokensRDD
In [ ]:
In [ ]:
En este punto cada documento del corpus es una lista de tokens.
Calcule un nuevo RDD que contenga, para cada documento, una lista de tuplas. La clave (key) de cada lista será un token y su valor el número de repeticiones del mismo en el documento.
Imprima una muestra de 20 tuplas uno de los documentos del corpus.
In [ ]:
Construya, a partir de corpus_wcRDD
, un nuevo diccionario con todos los tokens del corpus. El resultado será un diccionario python de nombre wcDict
, cuyas entradas serán los tokens y sus valores el número de repeticiones del token en todo el corpus.
wcDict = {token1: valor1, token2, valor2, ...}
Imprima el número de repeticiones del token interpret
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]:
Determine la lista de topicos de todo el corpus, y construya un dictionario inverso, invD
, cuyas entradas sean cada uno de los tokens, y sus salidas los números consecutivos de 0 al número total de tokens, es decir
invD = {token0: 0, token1: 1, token2: 2, ...}
In [ ]:
In [ ]:
# Compute RDD replacing tokens by token_ids
corpus_sparseRDD = corpus_wcRDD2.map(lambda x: [(invD[t[0]], t[1]) for t in x])
# Convert list of tuplas into Vectors.sparse object.
corpus_sparseRDD = corpus_sparseRDD.map(lambda x: Vectors.sparse(n_tokens, x))
corpus4lda = corpus_sparseRDD.zipWithIndex().map(lambda x: [x[1], x[0]]).cache()
Aplique el algoritmo LDA con 4 tópicos sobre el corpus obtenido en corpus4lda
, para un valor de topicConcentration = 2.0
y docConcentration = 3.0
. (Tenga en cuenta que estos parámetros de entrada deben de ser tipo float).
In [ ]:
In [ ]:
In [ ]:
In [ ]:
In [ ]: