n-граммное моделирование с помощью Java hashmap - PullRequest
6 голосов
/ 05 мая 2011

Мне нужно смоделировать коллекцию n-граммов (последовательности из n слов) и их контексты (слова, которые появляются рядом с n-граммами вместе с их частотой). Моя идея была такой:

public class Ngram {

    private String[] words;
    private HashMap<String, Integer> contextCount = new HashMap<String, Integer>();
}

Затем, для подсчета всех разных n-грамм, я использую другой Hashmap, например

HashMap<String, Ngram> ngrams = new HashMap<String, Ngram>();

и добавляю к нему при получении текста. Проблема в том, что когда число n-грамм превышает 10 000 или около того, заполняется куча JVM (она установлена ​​на максимум 1,5 ГБ), и все очень сильно замедляется.

Есть ли лучший способ сделать это, чтобы избежать такого потребления памяти? Кроме того, контексты должны быть легко сопоставимы между n-граммами, что, я не уверен, возможно с моим решением.

Ответы [ 2 ]

0 голосов
/ 10 мая 2013

Возможно, вы уже нашли решение своей проблемы, но в этой статье есть очень хороший подход к крупномасштабным языковым моделям:

Языковые модели сглаженного фильтра Блума: ЛМ Tera-Scale на Дешевом

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

0 голосов
/ 10 мая 2013

Вы можете использовать HADOOP MapReducer для базы данных Huge (обычно для Bigdata). используйте Mapper, чтобы разделить входные данные на Ngrams, и сумматор и mapper, чтобы делать то, что вы хотите сделать с этими Ngrams.

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

Я думаю, это что-то вроде классификации. так что это хорошо устраивает. Но для этого нужен кластер.

если возможно, лучше начать с Hadoop The Definitive Guide (публикации Orielly) .

...