5

Estoy tratando de implementar la predicción mediante el análisis de oraciones. Tenga en cuenta los siguientes [más] aburridas frasesEstructura de datos para almacenar asociaciones de palabras

Call ABC 
Call ABC again 
Call DEF 

Me gustaría tener una estructura de datos para las oraciones anteriores de la siguiente manera:

Call: (ABC, 2), (again, 1), (DEF, 1) 
ABC: (Call, 2), (again, 1) 
again: (Call, 1), (ABC, 1) 
DEF: (Call, 1) 

En general, Word: (Word_it_appears_with, Frequency), ....

Tenga en cuenta la inherente redundancia en este tipo de datos. Por supuesto, si la frecuencia de ABC es 2 en Call, la frecuencia de Call es 2 en ABC. ¿Cómo optimizo esto?

La idea es utilizar esta información cuando se escribe una nueva oración. Por ejemplo, si se ha tipeado Call, de los datos, es fácil decir que ABC es más probable que esté presente en la oración, y lo ofrece como primera sugerencia, seguido de nuevo y DEF.

Me doy cuenta de que esta es una de un millón de formas posibles de implementar la predicción, y espero con impaciencia las sugerencias de otras formas de hacerlo.

Gracias

+0

Estoy bastante seguro de que no hay una respuesta bien establecida porque su objetivo no es lo suficientemente tangible. Básicamente, este es un problema de IA, y las soluciones de IA generalmente tienen sus propios caprichos con los que la gente puede vivir; sin embargo, sin conocer su contexto exacto, es difícil decir qué caprichos serían aceptables. Por este motivo, votaré para cerrar su pregunta. (Es una muy interesante, que no es adecuada para Stack Overflow en mi opinión.) – zneak

+0

Dicho esto, podría usar una representación en árbol para sus palabras, y hacer que cada rama del árbol tenga una probabilidad. Esto podría funcionar bien si la entrada es repetitiva y la sintaxis relativamente fija, pero tendrá problemas para emparejar un lenguaje natural como ese. – zneak

+0

Podría usar un árbol, sí, pero me gustaría eliminar la redundancia en los datos: la frecuencia de word1 que ocurre con word2 obviamente será la misma que con word2 que ocurre con word1. Además, la entrada es continua, por lo que las probabilidades están fuera de discusión. – WeNeigh

Respuesta

1

Quizás usando un gráfico bidireccional. Puede almacenar las palabras como nodos, con bordes como frecuencias.

0

Puede utilizar la siguiente estructura de datos también:

Map<String, Map<String, Long>> 
+0

Guava ha implementado esto en la clase Table. http://docs.guava-libraries.googlecode.com/git-history/v10.0.1/javadoc/com/google/common/collect/Table.html –

+0

@JohnB, eso es bueno saberlo. Gracias por la info. –

0

yo consideraría una de dos opciones:

Opción 1:

class Freq { 
    String otherWord; 
    int freq; 
} 

Multimap<String, Freq> mymap; 

o tal vez una mesa

Table<String, String, int> 

Teniendo en cuenta lo anterior Frec: es posible que desee hacer el mapeo bidireccional:

class Freq{ 
    String thisWord; 
    int otherFreq; 
    Freq otherWord; 
} 

Esto permitiría una actualización muy rápida de pares de datos.

Cuestiones relacionadas