我需要模擬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之間進行比較,但我不確定是否可以使用我的解決方案。
我們在尋找這些尺寸的尺寸是多少?每個n-gram有多少個單詞?另外,你有沒有使用輔助內存,比如大的臨時內存?不要忘記,在調整大小時,hashmap可能是一個內存密集的結構! – corsiKa 2011-05-05 15:13:22
你想用這些n-gram做什麼?你有沒有看過使用n-gram-tokenfilter的lucene?也許你可以使用lucene索引來執行你需要執行的任務。然後,您可以將其保存在內存中或將其存儲到文件系統中。 – csupnig 2011-05-05 15:13:54
我有大約50,000篇新聞文章,我正在收集ngrams。在處理了6000篇文章後,Ngram中上下文Hashmap的平均大小約爲13。我沒有任何輔助內存,至少我不這麼認爲:) – Nikola 2011-05-05 15:23:53