2011-11-29 20 views
5

Estoy desarrollando un gerente financiero en mi tiempo libre con Java y Swing GUI. Cuando el usuario agrega una nueva entrada, se le pide que complete: Cantidad de dinero, fecha, comentario y sección (por ejemplo, automóvil, salario, computadora, alimentos, ...)Análisis de cadenas y clasificación

Las secciones se crean "sobre la marcha". Cuando el usuario ingresa una nueva sección, se agregará a la sección-jcombobox para una mayor selección. El otro punto es que los comentarios podrían estar en diferentes idiomas. Entonces, la lista de palabras codificadas y sinónimos sería enorme.

Entonces, mi pregunta es, ¿es posible analizar el comentario (por ejemplo, "Combustible", "Servicio de coche", "Almuerzo a **") y preseleccionar una Sección adecuada. Mi primer pensamiento fue hacerlo con una red neuronal y aprender de la entrada, si el usuario selecciona otra sección.

Pero mi problema es que no sé cómo comenzar en absoluto. Intenté "encog" con Eclipse e hice algunos tutoriales (XOR, ...). Pero todos ellos solo usan dobles como in/output.

¿Alguien podría darme una pista de cómo empezar o cualquier otra solución posible para esto?

Here es un JAR runable (estado de desarrollo actual, requiere Java7) y el Sourceforge Page

+0

+1 Nice Question. – gprathour

Respuesta

1

Olvídate de las redes neuronales. Este es un campo altamente técnico y especializado de inteligencia artificial, que probablemente no es adecuado para su problema y requiere una sólida experiencia. Además, hay muchas soluciones más simples y mejores para su problema.

Primera solución obvia, construya una lista de palabras y sinónimos para todas sus secciones y analice estos sinónimos. A continuación, puede recopilar comentarios en línea para el análisis de sinónimos, o utilizar comentarios/secciones de análisis proporcionados por los usuarios para detectar estadísticamente relaciones entre palabras, etc.

Hay un número infinito de soluciones posibles, que van desde las más simples hasta las más exageradas. Ahora necesita definir si esta característica de su sistema es crítica (¿prefilling ?, probablemente no, entonces) ... y lo que cualquier esfuerzo de desarrollo le brindará. Una hora de trabajo podría brindarle un 80% de satisfacción, mientras que un 90% le costaría una semana de trabajo. ¿Realmente vale la pena?

Vaya por la solución más simple y aborde el verdadero desafío de cualquier proyecto de desarrollo: la entrega. Una vez que se entrega su aplicación, siempre puede regresar y mejorar según sea necesario.

+0

Creo que la lista de palabras sería demasiado grande, debido a la creación de sección dinámica y posible Para una mejor comprensión, hay enlaces en la primera publicación. (Fuente + JAR) –

+0

Con nuestras máquinas modernas, diría que no existe una lista de palabras que sea demasiado grande ... Incluso un diccionario de sinónimos puede fácilmente encajar en la memoria. – solendil

+0

¿Sería posible almacenar todas las palabras usadas en comentarios excepto las palabras bloqueadas (en, y, el, ...) en un DB y luego asignarle la sección seleccionada y cuando el usuario agregue un comentario, pasar (el GRANDE DB) y seleccione la sección de acuerdo a las entradas para las palabras? Creo que el rendimiento sería bastante bajo, debido a la gran cantidad de datos. –

0
String myString = new String(paramInput); 

if(myString.contains("FUEL")){ 
//do the fuel functionality 
} 
+0

Ver comentario en la respuesta de GP Singh –

0

En una aplicación simple, si usted va a tener sólo algunas secciones específicas en su aplicación, entonces puede obtener cadena de comentarios y comprobar si contiene algunas palabras clave y luego de acuerdo con ello, cambie el valor de la Sección.

+0

Gracias por todas sus respuestas. Pero el problema es que las secciones se crean "sobre la marcha". Cuando el usuario ingresa una nueva sección, se agregará a la sección-jcombobox para una mayor selección. Por lo tanto, no es tan fácil :(La otra cosa es que los comentarios podrían estar en diferentes idiomas. –

0

Si tiene muchas categorías, utilizaría algo como Apache Lucene, donde podría indexar todas las categorías con las palabras clave/frases de su nombre y posibles que podrían aparecer en la descripción de un usuario. Luego, simplemente podría ejecutar la descripción a través de Lucene y usar la categoría mejor coincidente como una "mejor estimación".

P.S. Las entradas y salidas de la red neuronal siempre serán dobles o flotantes con un valor entre 0 y 1. En cuanto a cómo implementar la coincidencia de cadenas, ni siquiera sabría por dónde empezar.

+0

Ver comentario en la respuesta de GP Singh –

0

Me parece que va a hacer siguiente:

  • estadísticas de palabras duras
  • tal vez una clase derivada (Inglés/Español) que reducen una palabra como "almuerzos" a "almuerzo".
  • una lista de no-palabras más frecuentes (el, a, a, a, ...)

El mejor ajuste es un problema lineal, ajuste de modo teórico para una red neuronal, pero por qué no tomar inmediatamente el mejor ajuste numérico.

0

Un algoritmo de aprendizaje automático como una red neuronal artificial no parece ser la mejor solución aquí. Las ANN se pueden utilizar para la clasificación de clases múltiples (es decir, "¿a cuál de las clases preformadas provistas representa la entrada?" No solo "¿la entrada representa una X?") Que se ajusta a su caso de uso. El problema es que son métodos de aprendizaje supervisados ​​y, como tal, es necesario que proporciones una lista de pares de palabras clave y clases (Secciones) que abarque todos los aportes posibles que tus usuarios proporcionarán. Esto es imposible y, en la práctica, las RNA se vuelven a capacitar cuando hay más datos disponibles para producir mejores resultados y crear una frontera/representación de decisión más precisa de la función que asigna las entradas a las salidas. Esto también asume que usted conoce todas las clases posibles antes de comenzar y cada una de esas clases tiene valores de entrada de capacitación que usted proporciona.

El problema es que la entrada a su ANN (una lista de caracteres o un hash numérico de la cadena) no proporciona ningún contexto para clasificar. No se proporciona información de nivel superior que describa el significado de la palabra. Esto significa que una palabra diferente que hash a un valor numéricamente cercano puede clasificarse erróneamente si no hubo datos de entrenamiento insuficientes.

(Como dijo maclema, la salida de una ANN siempre será flotadores con cada valor que representa la proximidad de una clase -. O una clase con un nivel de incertidumbre)

Una solución mejor sería emplear algún tipo de relación de palabras o gráfica de sinónimos. A Bag of words model podría ser útil aquí.

Editar: En vista de su comentario de que no conoce las Secciones antes, una solución fácil de programar sería proporcionar una lista de palabras clave en un archivo que se actualiza a medida que las personas usan el programa. El simple hecho de almacenar un mapeo de los comentarios proporcionados -> Secciones, que ya tendrá en su base de datos, le permitiría filtrar las palabras clave que no son palabras clave (y, o, las, ...). Una opción es encontrar una lista de cada sección a la que pertenezcan las palabras clave escritas y sugerir varias secciones y dejar que el usuario elija una. Los comentarios que reciba de las selecciones de los usuarios permitirán mejoras en las sugerencias en el futuro. Otro sería calcular un Bayesian probability - la probabilidad de que esta palabra pertenezca a la Sección X dada las asignaciones almacenadas anteriores - para todas las palabras clave y Secciones y tomar la Sección modal o normalizar sobre cada palabra clave única y tomar la media. Los cálculos de probabilidades deberán actualizarse a medida que recopile más información, por supuesto, quizás esto podría hacerse con cada nueva adición en un hilo de fondo.

Cuestiones relacionadas