多字搜索和计算算法(Angular / Javascript)

时间:2016-08-04 08:42:01

标签: javascript angularjs json algorithm

我正在从数据库加载json文件,其中包含两个字段和等级。每个单词都被评分为例如,真有1,而谎有-1。然后我从文本提交输入,我需要根据JSON文件的成绩对其进行评分,然后通过总结成绩来计算得分,但我似乎无法找到这样做的方法。未计算文件中的单词。

我尝试过string.search匹配,但这很复杂,最终我无法按照我想要的方式得到结果。我试过数组搜索同样的事情。我搜索了在线解决方案,但没有人做过类似的事情,所以我无法复制它。

JSON

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

字符串

“狗很棒,但我更喜欢猫,猫,我不能说谎,虽然狗是真正的朋友”。

3 个答案:

答案 0 :(得分:0)

让我们首先想一想这个算法。两个选项:

  1. 搜索输入字符串并将其计数为JSON中的字数或
  2. 根据JSON内容检查输入字符串中的每个单词。
  3. 由于JSON长度已知并且(我推测)比可能的输入字符串短,我倾向于选择选项2.

    现在,在选择选项2之后,您需要将输入字符串拆分为单词并创建一个数组,其中包含数组的每个条目一个单词。

    您可以使用mystring.split(" ")方法实现此目的。当然,这并未考虑标点符号,但您可以使用相同的方法处理此问题。

    现在,您可以在JSON中为每个条目添加一个字段,以计算字符串中JSON中每个条目的出现次数。

    最后,您将计数器和等级的乘积相加。

答案 1 :(得分: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"所以你的一些话语不会被发现!

答案 2 :(得分: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"));

我使用regexp而不是字符串,你可以在运行时使用字符串并转换为正则表达式,希望这会有所帮助