Necesito modelar una colección de n-grams (secuencias de n palabras) y sus contextos (palabras que aparecen cerca del n-gram junto con su frecuencia). Mi idea de esta era:n-gra modeling with java hashmap
public class Ngram {
private String[] words;
private HashMap<String, Integer> contextCount = new HashMap<String, Integer>();
}
Entonces, para el recuento de todos los diferentes n-gramas, uso otro Hashmap, como
HashMap<String, Ngram> ngrams = new HashMap<String, Ngram>();
y añadir a ella durante la recepción de texto. El problema es que cuando la cantidad de n-grams supera los 10,000, el JVM Heap se llena (está configurado a un máximo de 1.5GB) y todo se ralentiza mucho.
¿Hay una mejor manera de hacerlo, para evitar dicho consumo de memoria? Además, los contextos deben ser fácilmente comparables entre los n-grams, lo que no estoy seguro es posible con mi solución.
¿Qué tamaño estamos buscando para estos? ¿Aproximadamente cuántas palabras por n-gramo? Además, ¿tiene memoria auxiliar que se utiliza, como una gran memoria temporal? ¡No olvide que un hashmap puede ser una estructura intensiva de memoria mientras cambia de tamaño! – corsiKa
¿Qué quieres hacer exactamente con esos n-grams? ¿Has echado un vistazo a lucene usando un n-gram-tokenfilter? Tal vez pueda usar un índice de lucene para realizar las tareas que necesita realizar. Luego puede mantenerlo en su memoria o almacenarlo en el sistema de archivos. – csupnig
Tengo alrededor de 50,000 artículos de noticias de los que estoy recogiendo los ngrams. Después de procesar 6000 artículos, el tamaño promedio de un Hashmap de contexto en Ngram es alrededor de 13. No tengo ninguna memoria auxiliar, al menos no lo creo :) – Nikola