Tengo un archivo CSV con el formato siguiente :

product_id1,product_title1
product_id2,product_title2
product_id3,product_title3
product_id4,product_title4
product_id5,product_title5
[...]

La product_idX es un entero y el product_titleX es una Cadena, por ejemplo :

453478692, Apple iPhone 4 8Go

Estoy tratando de crear la TF-IDF de mi archivo, así que la voy a usar para un Clasificador Naive Bayes en MLlib.

Estoy usando Chispa para Scala, hasta ahora y el uso de los tutoriales que he encontrado en la página oficial y Berkley AmpCamp Tres y Cuatro.

Así que me estoy leyendo el archivo :

val file = sc.textFile("offers.csv")

Entonces yo soy la asignación en tuplas RDD[Array[String]]

val tuples = file.map(line => line.split(",")).cache

y después de que me estoy transformando las tuplas en parejas RDD[(Int, String)]

val pairs = tuples.(line => (line(0),line(1)))

Pero estoy atascado aquí y no sé cómo crear el Vector de ella para convertirla en TFIDF.

Gracias

Si entiendo tu problema, cada producto puede estar presente en múltiples ocasiones. Este número de ocurrencia de cada producto, siendo su frecuencia (TF), no entiendo cuál sería la FDI en su caso. Podría por favor elaborar en que ?
tf–idf, a corto plazo de la frecuencia inversa de documento de la frecuencia, es una cifra estadística que tiene la intención de reflejar lo importante que es una palabra es un documento en una colección o de un corpus. Se utiliza a menudo como un factor de ponderación en la recuperación de información y minería de texto.
Lo que no entiendo es que en tu ejemplo, no veo ninguna mención de colección o corpus.
Mi último comentario fue la definición de una tf-idf, una colección o de un corpus es un grupo de documentos en el que desea utilizar la técnica de extracción de datos. En mi caso, consideramos que una línea CSV como un documento, y la recopilación o el corpus es el archivo CSV que contiene estos documentos.
Lo siento, pero yo todavía no lo entiendo. Aquí es lo que yo entiendo : desea que el TF-IDF de cada producto. Usted tiene un producto por línea. Usted puede tener el mismo producto varias veces. A sabiendas de que, y de acuerdo con tu último comentario, el de las FDI de un producto será el inverso del número de líneas que contienen este producto. En ese caso, ¿cuál será el TF ?

OriginalEl autor eliasah | 2014-07-03

1 Comentario

  1. 7

    A hacer esto por mí mismo (usando pyspark), empecé por la creación de dos estructuras de datos de los corpus. La primera es una clave, estructura de valor de

    document_id, [token_ids]

    El segundo es un índice invertido como

    token_id, [document_ids]

    Voy a llamar a los corpus y inv_index respectivamente.

    Para obtener tf tenemos que contar el número de ocurrencias de cada token en cada documento. Así

    from collections import Counter
    def wc_per_row(row):
        cnt = Counter()
        for word in row:
            cnt[word] += 1
        return cnt.items() 
    
    tf = corpus.map(lambda (x, y): (x, wc_per_row(y)))

    El df es simplemente la longitud de cada término del índice invertido. A partir de ahí se puede calcular de las fdi.

    df = inv_index.map(lambda (x, y): (x, len(y)))
    num_documnents = tf.count()
    
    # At this step you can also apply some filters to make sure to keep
    # only terms within a 'good' range of df. 
    import math.log10
    idf = df.map(lambda (k, v): (k, 1. + log10(num_documents/v))).collect()

    Ahora solo tenemos que hacer una combinación en la term_id:

    def calc_tfidf(tf_tuples, idf_tuples):
        return [(k1, v1 * v2) for (k1, v1) in tf_tuples for
            (k2, v2) in idf_tuples if k1 == k2]
    
    tfidf = tf.map(lambda (k, v): (k, calc_tfidf(v, idf)))

    No se trata de una particular solución eficiente, sin embargo. Llamar a recoger a traer de las fdi en el programa del controlador por lo que está disponible para la combinación, parece que la cosa incorrecta a hacer.

    Y, por supuesto, se requiere en primer encadenamiento y la creación de un mapeo de cada uniq token en el vocabulario para algunos token_id.

    Si alguien puede mejorar en esto, estoy muy interesado.

    OriginalEl autor Metropolis

Dejar respuesta

Please enter your comment!
Please enter your name here