2016-08-04 74 views
0

我從數據庫中加載兩個字段和級別的json文件。例如,每個單詞都被分級爲true,而lie具有-1。然後我從文本提交輸入,我需要根據JSON文件的等級對它進行評分,然後通過總結評分來計算分數,但我似乎無法找到實現這一點的方法。沒有在文件中的單詞沒有被計算。多個單詞搜索和計算算法(Angular/Javascript)

我試過string.search匹配,但它很複雜,最終我無法按照我的想法得到結果。我嘗試數組搜索相同的東西。我在線搜索解決方案,但沒有人做過類似的事情,所以我不能複製它。

JSON

[ 
    {"word":"true","grade":1}, 
    {"word":"hate","grade":-1}, 
    {"word":"dog","grade":0.8}, 
    {"word":"cat","grade":-0.8}  
] 

字符串

「狗是美好的,但我更喜歡貓,貓,我不能說謊,雖然狗是真正的朋友」。

+0

所以可以u顯示有多遠你試過嗎?邏輯並不複雜。如果複雜性不是一個大問題,我不認爲有必要有**算法**。 – MMhunter

+0

您的JSON無效。檢查http://jsonlint.com/ –

+0

@IvanSivak是正確的。它應該用'[]'而不是'{}'包裝。 – FDavidov

回答

0

我做的第一件事就是把你的JSON數據成爲一種很容易被搜索地圖 - 關鍵是這個詞,和值等級:

var json = [ 
 
    {"word":"true","grade":1}, 
 
    {"word":"hate","grade":-1}, 
 
    {"word":"dog","grade":0.8}, 
 
    {"word":"cat","grade":-0.8}  
 
    ]; 
 

 
var map = json.reduce(function(p,c){ 
 
    p.set(c.word.toLowerCase(),c.grade); 
 
    return p; 
 
}, new Map()); 
 

 
console.log(...map);

然後,它只是區分你的字符串,同時也計算總成績的情況下 - 再次reduce可用於

var json = [ 
 
     {"word":"true","grade":1}, 
 
     {"word":"hate","grade":-1}, 
 
     {"word":"dog","grade":0.8}, 
 
     {"word":"cat","grade":-0.8}  
 
     ]; 
 

 
    var map = json.reduce(function(p,c){ 
 
     p.set(c.word.toLowerCase(),c.grade); 
 
     return p; 
 
    }, new Map()); 
 

 
var input = "Dogs are wonderful but i prefer cats cats i can not lie although dog is a true friend"; 
 

 
var score = input.split(' ').reduce(function(p,c){ 
 
    var wordScore = map.get(c.toLowerCase()) || 0; 
 
    return p + wordScore; 
 
},0); 
 

 
console.log(score);

請注意,我在上面的輸入中手動刪除了標點符號 - 我將其作爲練習留給您。

另請注意,"cats" != "cat"所以你的一些話不會被發現!

+0

你是天才,這是完美的,我從來沒有使用地圖,我不知道如何使用它們,所以th at是我必須做的第二個練習,看看它是如何工作的,並且刪除標點符號應該是我的工作!非常感謝......真的,我現在已經把這些事情弄糟了。 –

+0

如果我想找到貓,我需要添加什麼?只是好奇 –

+0

@AbsoluteBeginer - 你可以使用['startsWith'](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith),或者你可以改變使用正則表達式模式與其他答案類似。這一切都取決於你希望你的分數匹配工作!你會注意到我已經必須在單詞score圖和輸入處理中使用'toLowerCase()'來處理區分大小寫。 – Jamiec

0

我們先來想一想這個算法。有兩個選項:

  1. 搜索和計數輸入字符串多次字數在你的JSON或
  2. 檢查中對JSON內容的輸入字符串中的每個字。

由於JSON長度是已知的,(我相信)比可能的輸入字符串短,我會更願意選擇2

現在,選擇選項2之後,您需要拆分輸入字符串轉化爲單詞並創建一個包含數組中每個條目一個單詞的數組。

您可以使用mystring.split(" ")方法實現此目的。當然,這並沒有考慮到標點​​符號,但是您可以使用相同的方法處理此問題。

現在,您可以爲您的JSON中的每個條目添加一個字段來計算字符串內JSON中每個條目的出現次數。

最後,你總結了計數器和等級的乘積。

+0

標點符號可以在計算之前刪除,所以它會更容易。似乎好主意,我在想我自己,但我不知道如何在代碼中做到這一點:( –

+0

嗯,我沒有一個**準備好**的例子,不能寫代碼和測試它,但可以首先,用空白替換所有的標點符號;其次,用一個替換所有的空白符號;第三,將字符串拆分爲'var words_array = instring.split(「」);'。 ,從'0'到'words_arrray.length'的數組'words_array'的外部長度,而內部循環從'0'到'known_words.length',在內部循環內比較條目並添加一個 – FDavidov

+0

澄清一下:外循環的每個循環都需要向已知單詞的JSON添加一個元素,如:'known_words [k] .count = 0',其中'k'是索引 – FDavidov

0

console.log((function(rules, str) { 
 
    var sum = 0; 
 
    Array.prototype.forEach.call(rules, function(rule) { 
 
    var match = str.match(rule.regexp); 
 
    
 
    match && (sum += str.match(rule.regexp).length * rule.grade); 
 
    console.log([rule.regexp, match&&match.length, rule.grade, match&&match.length * rule.grade, sum]); 
 
    }); 
 
    return sum; 
 
})([{ 
 
    "regexp": /true/g, 
 
    "grade": 1 
 
}, { 
 
    "regexp": /hate/g, 
 
    "grade": -1 
 
}, { 
 
    "regexp": /dog/g, 
 
    "grade": 0.8 
 
}, { 
 
    "regexp": /cat/g, 
 
    "grade": -0.8 
 
}], "Dogs are wonderful but i prefer cats, cats, i can not lie although dog is a true friend"));

我使用正則表達式,而不是字符串,u可以使用串並轉換在運行時正則表達式,希望這將有助於