6

我需要对一组 n-gram(n 个单词的序列)及其上下文(出现在 n-gram 附近的单词及其频率)进行建模。我的想法是这样的:

public class Ngram {

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

然后,对于所有不同 n-gram 的计数,我使用另一个 Hashmap,例如

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

我在接收文本时添加它。问题是,当 n-gram 的数量超过 10,000 左右时,JVM 堆会填满(设置为最大 1.5GB),并且一切都变慢了。

有没有更好的方法来做到这一点,以避免这种内存消耗?此外,n-gram 之间的上下文应该很容易比较,我不确定我的解决方案是否可行。

4

2 回答 2

0

您可以将 HADOOP MapReducer 用于大型数据库(通常用于大数据)。使用 Mapper 将输入拆分为 Ngram,并使用组合器和映射器对这些 Ngram 做任何你想做的事情。

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

我猜它类似于分类。所以它很适合。但它需要集群。

如果可能,您最好从Hadoop The Definitive Guide(Orielly 出版物)开始。

于 2013-05-10T16:15:53.520 回答
0

也许您已经找到了问题的解决方案,但是本文有一个非常好的方法来处理大规模语言模型:

平滑的布隆过滤器语言模型:Tera-Scale LMs on the Cheap

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

于 2013-05-10T18:47:56.297 回答