2016-11-23 5 views
0

Javascriptでngramモデルの実装を構築しました。これはうまくいきます。しかし、私は自分のデータ構造を変更して、新しい単語/文字が観察されるたびにすべての履歴を繰り返す必要がないようにしたいと考えています。ここでngramsのデータ構造

、私は、各観察されたパターンの記録を保持するデータ構造を持って探していますseedtextを取り、順番2

var ngrams = {}; 
 
    var order = 2; 
 
    var seedtext = "adadwsdawdsadawdsadadasdwdadaaasdsadsdadwdasdasd"; 
 
    
 
build(); 
 
    
 
    function build(){ 
 
    
 
     for (var i = 0; i < seedtext.length - order; i++) { 
 
     var gram = seedtext.substring(i, i + order); 
 
     var next = seedtext.charAt(i + order); 
 

 
     if (!ngrams.hasOwnProperty(gram)) { 
 
      ngrams[gram] = []; 
 
     } 
 
     
 
     ngrams[gram].push(next); 
 
     } 
 
    } 
 
    
 
    console.log(ngrams); 
 
    console.log(ngrams["wd"]); 
 

でngramsを構築するためにそれを使用します各観測パターンは、次のような観測結果がとなるはずです

たとえば、次のコードを実行すると、出力が表示されますこのように時間を見ることができます。

[object Object] { 
    aa: ["a", "s"], 
    ad: ["a", "w", "a", "a", "a", "a", "s", "w"], 
    as: ["d", "d", "d", "d"], 
    aw: ["d", "d"], 
    da: ["d", "w", "w", "d", "s", "d", "a", "d", "s", "s"], 
    ds: ["a", "a", "a", "d"], 
    dw: ["s", "d", "d"], 
    sa: ["d", "d", "d"], 
    sd: ["a", "w", "s", "a", "a"], 
    wd: ["s", "s", "a", "a"], 
    ws: ["d"] 
} 

["s", "s", "a", "a"] 

を今、私たちは例えば、「広告」を取る場合:ngrams["ad"]は、我々は戻って["a", "w", "a", "a", "a", "a", "s", "w"]得ます。

明らかに、adの後に、w,aまたはsのいずれかを得ることができます。

ようngrams["ad"]リターンは何かように、私はグループの手紙をしたいと思います:最も頻繁に発生する文字は、そのカウントして、一番上にあるように、彼らは順番になっていることを

{a: 5 
w: 2 
s :1} 

注意。

私は(例えば)ので、のようなデータにアクセスできるようにしたいと思います:wsための1のために

ngrams["ad"].a; 
ngrams["ad"].w; 
ngrams["ad"].s; 

とバックaため5を取得し、2。

また、以前に見たパターンが再び観察されたときに、値を増やしたいと思っています...パターンを削除したいこともあります。

アイデア?

答えて

1

実用的なバージョンです。配列の代わりに、次の文字の数を格納する別のオブジェクトを追加します。

 var ngrams = {}; 
 
    var order = 2; 
 
    var seedtext = "adadwsdawdsadawdsadadasdwdadaaasdsadsdadwdasdasd"; 
 
    
 
build(); 
 
    
 
    function build(){ 
 
    
 
     for (var i = 0; i < seedtext.length - order; i++) { 
 
     var gram = seedtext.substring(i, i + order); 
 
     var next = seedtext.charAt(i + order); 
 

 
     if (!ngrams.hasOwnProperty(gram)) { 
 
      ngrams[gram] = {}; 
 
     } 
 
     
 
     if (!ngrams[gram].hasOwnProperty(next)) { 
 
      ngrams[gram][next] = 0; 
 
     } 
 

 
     ngrams[gram][next] += 1; 
 
     } 
 
    } 
 
    
 
    console.log(ngrams); 
 
    console.log(ngrams["wd"]); 
 

+0

ブリリアント。ありがとうございました! – pookie