2016-11-23 32 views
0

我已經在Javascript中構建了一個ngram模型實現,它工作正常。不過,我期待改變我的數據結構,以便每次觀察到新的單詞/字符時都不必遍歷所有歷史記錄。ngrams的數據結構

在這裏,我採取seedtext,並用它來與一個以建立的n-gram 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"]); 
 

我期待有保存每個觀測模式的一個記錄的數據結構(對於給定的訂單,每個觀察到的模式應該有一個下一個可能的觀測及其計數

例如,如果您運行下面的代碼,輸出suc H作爲此可以看出:

[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,as

我想組字母,這樣ngrams["ad"]回報是這樣的:

{a: 5 
w: 2 
s :1} 

注意,他們是爲了使最頻繁出現的字母是在頂部,其計數。

我希望能夠訪問數據,像這樣(例如):

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

,並取回5a,2 w和1 s

我也希望能夠增加值,因爲先前看到的模式再次被觀察到......我也希望能夠刪除模式。

任何想法?

回答

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