Hola, estoy trabajando en un clasificador de anuncios. Nunca había probado weka y me he puesto a ello pero me han surgido problemas. Explico lo que hago y los problemas que tengo a ver si alguien me puede dar alguna sugerencia.
Tengo 100.000 ofertas ya clasificadas en una tabla (campo 1 -> texto de la oferta, campo 2 -> categoría de la oferta).
Lo que hago es:
Aplico el filtro al campo 1 de NominalToString.
Aplico al mismo campo el filtro de StringToWordVector (con stopwords y stemmer (el stemmer snowball no hace nada (1er problema))
Quito los atributos que no me dicen nada.
Aplico NaiveBayesMultinomial en training set.
Problema principal -> error de que no tengo memoria cuando esta evaluando el conjunto de entrenamiento (ya he puesto la opción -Xmx4086m (con varios valores)
Bueno en realidad no sroy empezando.. luego actualizare mi perfil.
La historia es que estoy desarrollando una aplicación web que consiste en q el usuario rellena un campo donde escribe una demanda (quiero un coche de segunda mano x ej) la aplicación la categoriza automáticamente (categoría motor segunda mano) y le envía la demanda a todas las empresas dadas de alta en esa categoría. Hasta ahora lo estaba haciendo con sphinx realizando búsquedas sobre las demandas ya categorizadas buscando una parecida.
Quería probar con algoritmos de clasificación para ver como respondian , pero sigo en ello.
Ya OS contare los resultados.
Gracias x los enlaces, echare un vistazo
El problema que veo es que confundas que quieres hacer con como deberías hacerlo.
Con todo el respeto te recuerdo que Machine Learning sería por ejemplo:
1. Descubrir como dividir en categorias de las 100.000 ofertas que ya tienes (Clutering).
2. Clasificar nuevas ofertas en categorías, bien definidas por ti o por clustering (Clasificación).
No le veo mucho sentido a esto, ya que debería ser el usuario que publica el anuncio quien lo clasifique, salvo que estés haciendo un agregador de anuncios y quieras mostrar TODAS las ofertas de un tipo en concreto cuando entre el usuario.
Por otra parte está Information Retrieval, que sería, que llega un usuario pone los terminos de búsqueda y devuelves solo las ofertas que mejor hagan match de esos terminos. Esto es lo que yo entiendo que quieres hacer.
Si es eso, podrías usar los TF.IDF para hacerlo tu mismo, pero ya que usas WEKA imagino que prefieres usar soluciones de la industria y para eso tienes Solr - http://lucene.apache.org/solr/
Aunque sigo sin entender porque tienes 100.000 ofertas y quieres enviar la petición a las empresas....
lo que hago es una página donde tú pones lo que quieres y yo se lo envío a las empresas que mejor cuadren con tu petición, la idea es que el usuario no tenga que poner nada más).
Hasta ahora el sistema está montado con sphinx, haciendo búsquedas con relevancia sobre la base de datos (que ya está categorizada) y si encuentro ofertas ya categorizadas que se parezcan, doy por hecho que pertenece a la misma categoría (esto no funciona mal del todo pero al final es un poco lioso, además de que cargo mucho la base de datos y pierdo mucho tiempo refinando las búsquedas .
El usuario no ve el resto de ofertas, solo las utilizo para predecir la categoría.
Entonces me acordé de weka, que lo había visto por encima hace tiempo, y hablando con un chico de pentaho me dijo que lo podía clasificar mediante el algoritmo de Naive Bayes Multinomial Updateable (ya que podía entrenarlo con mi base de datos y además pensé en entrenarlo con anuncios de ebay de manera automatizada ya que este algoritmo se puede entrenar de manera incremental).
En realidad no es que piense que sea mejor o peor, solo quería ver los resultados que daba, había leído que ese algoritmo era bueno para la clasificación de texto, ya que el filtro de StringToWordVector aplica TF IDF en sus atributos y la teroría de separarlo en palabras, aplicar stopwords y stemmer para quedarme con la raíz de las palabras "con significado" y sacar las probabilidades de que una frase con ciertos atributos pertenezca a una clase u otra según las probabilidades que tenga cada atributo de hacerlo y de una forma más inteligente a como lo hace Sphinx me parecía digna de tener en cuenta.
Echaré un vistazo a Solr, que creo que es como Sphinx.
Ahora me queda mucho más claro pero me surjen algunas dudas. El problema que yo preveo es que los anuncios tendrán pocas palabras en sí: 80-350 en su gran mayoría ¿no? Y además muchas de ellas se repetirán y el TFIDF las descartara pero evidentemente serán significativas (Vendo vs Compro).
Y con 100.000 ejemplos lo más probable es que estés overfitting el modelo. ¿Cuantas características estás usando en los vectores? ¿has probado con otros modelos que no sean el de Bayes? ¿Puedes aplicarlos solo con TF sin el IDF? TF es muy fácil de calcular por ti mismo...
Y una vez "clasificaras" un anuncio, ¿tendrías una lista de empresas que han tenido al menos un anuncio en esa categoría para enviarles a ellas el email?
Podrías probar con LSH a ver si por casualidad con el texto de los anuncios (una vez eliminadas las stopwords y en forma de raíces semánticas) te los clasifica precisamente en esos grupos que tu ya tienes. Seguramente en Lucene ya venga implementado y puede que en Sphinx.
Por otra parte el problema que veo conociendo a los usuarios es que escriban muy poco texto en la búsqueda, así que deberías pensar en poner para que se auto sugieran términos para las queries (como hace Google ahora). Ya no solo por el algoritmo sino por las empresas a las que les van a llegar las peticiones porque si les llegan muchas de coche segunda mano, acabarán hartándose del sistema porque tendrán que hacer mucho trabajo para responder peticiones irrelevantes.
Espero que estés intentando resolver el gran problema de encontrar repuestos de desguaces ;))
Ah, Solr es una aplicación construida sobre Lucene. Si pudieras tener anuncios actualizados, quizá te interesaría añadir al envío de esas peticiones que se pudieran ver y filtrar esos anuncios, y para eso Solr es muy bueno.
De los 100.000 ejemplos me quedo con unos 7000 atributos.
Probé con J48 (creo que se llama así) y me dio el mismo error de memoria.
Puedo aplicarlo solo con TF, aunque he leído como funciona, he leído pero tampoco mucho (tengo que leer más que todo esto es nuevo para mi ;-) )
No tendría una lista de empresas con anuncios iguales, lo que tengo es listas de empresas en esas categorías (ya las tengo comprobadas a mano) y les enviaría el mail a todas las empresas de dicha categoría.
Con respecto a pedir más datos ya lo hago, cuando metes una oferta de coches, si detecto la categoría, muestro un formulario con campos específicos para esa categoría y los relleno (si puedo) a traves de expresiones regulares que sacan el precio si has puesto € o kilometraje...
En realidad como dije el sistema actual no funciona del todo mal, pero me interesa el tema de machine learning y quería aprovechar.
Me puedes recomendar enlaces, parece que sabes mucho del tema
Tengo 100.000 ofertas ya clasificadas en una tabla (campo 1 -> texto de la oferta, campo 2 -> categoría de la oferta).
Lo que hago es:
Aplico el filtro al campo 1 de NominalToString.
Aplico al mismo campo el filtro de StringToWordVector (con stopwords y stemmer (el stemmer snowball no hace nada (1er problema))
Quito los atributos que no me dicen nada.
Aplico NaiveBayesMultinomial en training set.
Problema principal -> error de que no tengo memoria cuando esta evaluando el conjunto de entrenamiento (ya he puesto la opción -Xmx4086m (con varios valores)
¿Alguna sugerencia, documentación, enlaces?
Gracias de antemano
21/09/2013 12:49
no conocía weka hasta que lo has comentado tu, si te sirve de algo mira estos enlaces:
falta de memoría en weka
http://stackoverflow.com/search?q=%5Bweka%5D+enough+memory
preguntas taggueadas con weka
http://stackoverflow.com/questions/tagged/weka
documentación
http://weka.sourceforge.net/doc.dev/
p.d. ¿por cierto como es lo que te ha decidido hacerlo con weka si estás empezando en el desarrollo web?
saludos
21/09/2013 13:43
La historia es que estoy desarrollando una aplicación web que consiste en q el usuario rellena un campo donde escribe una demanda (quiero un coche de segunda mano x ej) la aplicación la categoriza automáticamente (categoría motor segunda mano) y le envía la demanda a todas las empresas dadas de alta en esa categoría. Hasta ahora lo estaba haciendo con sphinx realizando búsquedas sobre las demandas ya categorizadas buscando una parecida.
Quería probar con algoritmos de clasificación para ver como respondian , pero sigo en ello.
Ya OS contare los resultados.
Gracias x los enlaces, echare un vistazo
24/09/2013 11:19
El problema que veo es que confundas que quieres hacer con como deberías hacerlo.
Con todo el respeto te recuerdo que Machine Learning sería por ejemplo:
1. Descubrir como dividir en categorias de las 100.000 ofertas que ya tienes (Clutering).
2. Clasificar nuevas ofertas en categorías, bien definidas por ti o por clustering (Clasificación).
No le veo mucho sentido a esto, ya que debería ser el usuario que publica el anuncio quien lo clasifique, salvo que estés haciendo un agregador de anuncios y quieras mostrar TODAS las ofertas de un tipo en concreto cuando entre el usuario.
Por otra parte está Information Retrieval, que sería, que llega un usuario pone los terminos de búsqueda y devuelves solo las ofertas que mejor hagan match de esos terminos. Esto es lo que yo entiendo que quieres hacer.
Si es eso, podrías usar los TF.IDF para hacerlo tu mismo, pero ya que usas WEKA imagino que prefieres usar soluciones de la industria y para eso tienes Solr - http://lucene.apache.org/solr/
Aunque sigo sin entender porque tienes 100.000 ofertas y quieres enviar la petición a las empresas....
24/09/2013 21:09
lo que hago es una página donde tú pones lo que quieres y yo se lo envío a las empresas que mejor cuadren con tu petición, la idea es que el usuario no tenga que poner nada más).
Hasta ahora el sistema está montado con sphinx, haciendo búsquedas con relevancia sobre la base de datos (que ya está categorizada) y si encuentro ofertas ya categorizadas que se parezcan, doy por hecho que pertenece a la misma categoría (esto no funciona mal del todo pero al final es un poco lioso, además de que cargo mucho la base de datos y pierdo mucho tiempo refinando las búsquedas .
El usuario no ve el resto de ofertas, solo las utilizo para predecir la categoría.
Entonces me acordé de weka, que lo había visto por encima hace tiempo, y hablando con un chico de pentaho me dijo que lo podía clasificar mediante el algoritmo de Naive Bayes Multinomial Updateable (ya que podía entrenarlo con mi base de datos y además pensé en entrenarlo con anuncios de ebay de manera automatizada ya que este algoritmo se puede entrenar de manera incremental).
En realidad no es que piense que sea mejor o peor, solo quería ver los resultados que daba, había leído que ese algoritmo era bueno para la clasificación de texto, ya que el filtro de StringToWordVector aplica TF IDF en sus atributos y la teroría de separarlo en palabras, aplicar stopwords y stemmer para quedarme con la raíz de las palabras "con significado" y sacar las probabilidades de que una frase con ciertos atributos pertenezca a una clase u otra según las probabilidades que tenga cada atributo de hacerlo y de una forma más inteligente a como lo hace Sphinx me parecía digna de tener en cuenta.
Echaré un vistazo a Solr, que creo que es como Sphinx.
Gracias
25/09/2013 09:26
Y con 100.000 ejemplos lo más probable es que estés overfitting el modelo. ¿Cuantas características estás usando en los vectores? ¿has probado con otros modelos que no sean el de Bayes? ¿Puedes aplicarlos solo con TF sin el IDF? TF es muy fácil de calcular por ti mismo...
Y una vez "clasificaras" un anuncio, ¿tendrías una lista de empresas que han tenido al menos un anuncio en esa categoría para enviarles a ellas el email?
Podrías probar con LSH a ver si por casualidad con el texto de los anuncios (una vez eliminadas las stopwords y en forma de raíces semánticas) te los clasifica precisamente en esos grupos que tu ya tienes. Seguramente en Lucene ya venga implementado y puede que en Sphinx.
Por otra parte el problema que veo conociendo a los usuarios es que escriban muy poco texto en la búsqueda, así que deberías pensar en poner para que se auto sugieran términos para las queries (como hace Google ahora). Ya no solo por el algoritmo sino por las empresas a las que les van a llegar las peticiones porque si les llegan muchas de coche segunda mano, acabarán hartándose del sistema porque tendrán que hacer mucho trabajo para responder peticiones irrelevantes.
Espero que estés intentando resolver el gran problema de encontrar repuestos de desguaces ;))
Ah, Solr es una aplicación construida sobre Lucene. Si pudieras tener anuncios actualizados, quizá te interesaría añadir al envío de esas peticiones que se pudieran ver y filtrar esos anuncios, y para eso Solr es muy bueno.
25/09/2013 20:39
De los 100.000 ejemplos me quedo con unos 7000 atributos.
Probé con J48 (creo que se llama así) y me dio el mismo error de memoria.
Puedo aplicarlo solo con TF, aunque he leído como funciona, he leído pero tampoco mucho (tengo que leer más que todo esto es nuevo para mi ;-) )
No tendría una lista de empresas con anuncios iguales, lo que tengo es listas de empresas en esas categorías (ya las tengo comprobadas a mano) y les enviaría el mail a todas las empresas de dicha categoría.
Con respecto a pedir más datos ya lo hago, cuando metes una oferta de coches, si detecto la categoría, muestro un formulario con campos específicos para esa categoría y los relleno (si puedo) a traves de expresiones regulares que sacan el precio si has puesto € o kilometraje...
En realidad como dije el sistema actual no funciona del todo mal, pero me interesa el tema de machine learning y quería aprovechar.
Me puedes recomendar enlaces, parece que sabes mucho del tema