2011-05-05 9 views
6

我需要模擬n-gram(n個單詞的序列)及其上下文(出現在n-gram附近的單詞以及它們的頻率)的集合。我的想法是這樣的:使用java hashmap的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 Heap會填滿(最多設置爲1.5GB),而且一切都會非常糟糕。

有沒有更好的方法來做到這一點,所以要避免這種內存消耗?此外,上下文應該很容易在n-gram之間進行比較,但我不確定是否可以使用我的解決方案。

+0

我們在尋找這些尺寸的尺寸是多少?每個n-gram有多少個單詞?另外,你有沒有使用輔助內存,比如大的臨時內存?不要忘記,在調整大小時,hashmap可能是一個內存密集的結構! – corsiKa 2011-05-05 15:13:22

+2

你想用這些n-gram做什麼?你有沒有看過使用n-gram-tokenfilter的lucene?也許你可以使用lucene索引來執行你需要執行的任務。然後,您可以將其保存在內存中或將其存儲到文件系統中。 – csupnig 2011-05-05 15:13:54

+0

我有大約50,000篇新聞文章,我正在收集ngrams。在處理了6000篇文章後,Ngram中上下文Hashmap的平均大小約爲13。我沒有任何輔助內存,至少我不這麼認爲:) – Nikola 2011-05-05 15:23:53

回答

0

您可以使用HADOOP MapReducer作爲巨大的數據庫(通常用於Bigdata)。使用Mapper將輸入拆分爲Ngrams和組合器和映射器,以完成您想要對這些Ngrams執行的任何操作。

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

我想它的東西就像分類。所以很適合。但它需要集羣。

如果可能,最好從開始Hadoop權威指南(Orielly出版物)

0

也許你已經找到了解決你的問題,但有一個非常好的做法,以大規模的語言模型對本文:

平滑布隆過濾器語言模型:在便宜

萬億級的LM

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

+0

鏈接到論文已經死了,下面是一個鏡子:http://www.learningace.com/doc/1789441/13c59f831d31425f78311337bd7cb4fa/d07-1049 – Crashthatch 2014-05-23 11:26:51