6

n グラム (n 単語のシーケンス) とそのコンテキスト (頻度と共に n グラムの近くに現れる単語) のコレクションをモデル化する必要があります。私の考えはこれでした:

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 を使用できます。マッパーを使用して入力を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

すでに問題の解決策を見つけているかもしれませんが、この論文には大規模な言語モデルへの非常に優れたアプローチがあります。

平滑化ブルーム フィルター言語モデル: 安価なテラスケール LM

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

于 2013-05-10T18:47:56.297 に答える