2011-05-05 9 views
6

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.

+0

¿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

+2

¿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

+0

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

Respuesta

0

Puede utilizar HADOOP MapReducer para la base de datos enorme (normalmente para Bigdata). usa Mapper para dividir la entrada a Ngramos y combinador y mapeador para hacer lo que quieras con esos Ngramos.

HADOOP uses <Key,value> as like you wish to process with Hashmap. 

Supongo que es algo así como Clasificación. así que se adapta bien Pero requiere clúster.

si es posible, puede comenzar mejor con Hadoop La guía definitiva (publicaciones de Orielly).

0

Tal vez usted ya ha encontrado la solución a su problema, pero no es una muy buena aproximación a los modelos grandes de lenguaje escala en este documento:

modelos de lenguaje filtro de suavizado Bloom: LM teraescala en el barato

http://acl.ldc.upenn.edu/D/D07/D07-1049.pdf

+0

El enlace al documento está muerto, aquí hay un espejo: http://www.learningace.com/doc/1789441/13c59f831d31425f78311337bd7cb4fa/d07-1049 – Crashthatch