java - science - spark libraries
Apache spark MLLib: ¿cómo construir puntos etiquetados para las características de la cuerda? (2)
Encontré este buen ejemplo de un clasificador de texto Naive Bayes . Contiene exactamente lo que necesitas.
Estoy intentando construir un clasificador NaiveBayes con Spark''s MLLib que toma como entrada un conjunto de documentos.
Me gustaría poner algunas cosas como características (es decir, autores, etiquetas explícitas, palabras clave implícitas, categoría), pero mirando la documentación parece que un LabeledPoint
solo contiene dobles, es decir, se parece a LabeledPoint[Double, List[Pair[Double,Double]]
.
En cambio, lo que tengo como salida del resto de mi código sería algo como LabeledPoint[Double, List[Pair[String,Double]]
.
Podría inventar mi propia conversión, pero parece extraño. ¿Cómo se supone que debo manejar esto usando MLLib?
Creo que la respuesta está en la clase HashingTF
(es decir, funciones hash) pero no entiendo cómo funciona, parece que se necesita algún tipo de valor de capacidad, pero mi lista de palabras clave y temas es efectivamente ilimitada (o mejor, desconocida) al principio).
HashingTF
usa el truco de hash para asignar un número de características potencialmente ilimitado a un vector de tamaño limitado. Existe la posibilidad de colisiones de características, pero esto se puede reducir al elegir un mayor número de características en el constructor.
Para poder crear características basadas no solo en el contenido de una característica sino también en algunos metadatos (por ejemplo, tener una etiqueta de ''gatos'' en lugar de tener la palabra ''gatos'' en el documento), podrías alimentar a la clase HashingTF
algo como ''etiqueta : gatos ''para que una etiqueta con una palabra se vendrá en una ranura diferente a la palabra.
Si ha creado vectores de recuento de características utilizando HashingTF
, puede usarlos para crear características de la bolsa de palabras estableciendo los recuentos por encima de cero a 1. También puede crear vectores TF-IDF utilizando la clase IDF
manera:
val tfIdf = new IDF().fit(featureCounts).transform(featureCounts)
En su caso, parece que ya ha calculado los recuentos de palabras por documento. Esto no funcionará con la clase HashingTF
ya que está diseñado para hacer el conteo por usted.
Este documento tiene algunos argumentos sobre por qué las colisiones de funciones no son un gran problema en las aplicaciones de lenguaje. Las razones esenciales son que la mayoría de las palabras son poco comunes (debido a las propiedades de los lenguajes) y que las colisiones son independientes de las frecuencias de las palabras (debido a las propiedades de hashing) por lo que es poco probable que las palabras que son lo suficientemente comunes como para ayudar con los modelos mismo espacio