【问题标题】:How do I filter a string through multiple arrays and choose the one with the most resemblance如何通过多个数组过滤字符串并选择最相似的一个
【发布时间】:2017-11-09 00:55:07
【问题描述】:

我不是要代码示例,只是要尽可能最好的方法

因此,我目前正在创建一个机器人回答服务台,当它识别特定单词时(例如,如果用户输入“stuur mail”,它会说“Als je een mailtje wil sturen kan dit naar help@wordquest.nl')

它适用于数组,所以有一个数组

mailText['stuur', 'mail', 'verzend'];

还有一个函数 (checkMail()) 可以检查数组中有多少给定文本(来自输入字段)。因此,如果用户输入“hoe stuur ik een mail”,它会识别“stuur”和“mail”,并知道使用了 mailText 数组中 66% 的单词。我目前有两个这样的数组。它可以使用 4 个 if 语句来检查哪一个最适合用户输入,但我真的不想编写数百个 if 语句来比较数组并为每个数组创建一个函数。

当前的JS是

window.onkeydown = function (event) {
    if (event.keyCode == 13) {
        checkQuestions(document.getElementsByClassName('inputField')[0].value);

        document.getElementsByClassName('inputField')[0].value = '';

        if (event.preventDefault) event.preventDefault(); // This should fix it
            return false; // Just a workaround for old browsers
    }
}

var mail = ['stuur', 'mail', 'verzend'];
var verzenden = ['kost', 'verzend', 'pakket'];

var errorText = '<h1>An error has occured...</h1><br>There are no answers with the current search query...';

var mailText = 'Als je een mailtje wil sturen kan dit naar <a 
href="mailto:help@wordquest.nl">help@wordquest.nl</a>';
var sendText = 'Verzendkosten verschillen per pakket';

var answers = [];

function checkQuestions(quest) {
    console.log('');
    answer = 0;
    finalText = errorText;
    answers = [];

    mailNum = checkMail(quest);
    sendNum = checkSend(quest);

    if (mailNum > sendNum) {
        answers.push(mailText);
    } else if (sendNum > mailNum) {
        answers.push(sendText);
    } else if (sendNum == mailNum && sendNum != 0) {
        answers.push(mailText);
        answers.push(sendText);
    } else {
        answers.push(errorText);
    }

    setAnswer();
}

function checkMail(question) {
    chance = 0;
    indent = 100 / mail.length;
    for (i = 0; i < mail.length; i++) {
        if (question.includes(mail[i])) {
            chance = chance + indent;
        }
    }
    console.log('mail is ' + chance + '%');
    return chance;
}

function checkSend(question) {
    chance = 0;
    indent = 100 / verzenden.length;
    for (i = 0; i < verzenden.length; i++) {
        if (question.includes(verzenden[i])) {
            chance = chance + indent;
        }
    }
    console.log('verzenden is ' + chance + '%');
    return chance;
}

var finalAns = [];

function setAnswer() {
    finalAns = [];

    if (answers[0] != errorText) {
        finalAns.push('<b>Er zijn ' + answers.length + ' antwoorden gevonden!</b>');
    }

    for (i = 0; i < answers.length; i++) {
        finalAns.push('<p>' + answers[i] + '</p>');
    }

    document.getElementsByClassName('answers')[0].innerHTML = finalAns.join('');
}

当前页面(带有 HTML):https://codepen.io/timyboy12345/pen/YEpmZz

我知道这可能不是最好的方法,但这只是一个爱好项目......

那么有没有人知道如何制作一个函数来比较用户输入与所有数组的答案组合(最终可能+50)而不为每个数组创建一个函数,并给用户一个正确的文本(我目前正在使用预定义的变量)以及他们问题的答案。

【问题讨论】:

    标签: javascript arrays for-loop artificial-intelligence


    【解决方案1】:

    您可以使用嵌套数组并使用计数器来跟踪匹配的单词数。然后你计算准确率并使用最终数组来知道哪个数组被正确回答。

    循环的伪代码:

    for i = 0; i < arraysToMatch; i++
        nbMatched = 0
        foreach answer in answerArray[i]
            if answer is in arraysToMatch[i] then
                ++nbMatched
            end if
        end foreach
    
        // Here calculate the accuracy and if good use i       
    
    end for
    

    这样你就不需要每个数组都有一个函数。但是,您需要将匹配数组与答案数组配对。

    【讨论】:

      【解决方案2】:

      谢谢,我在嵌套数组中找到了解决方案:

      最终版本使用带有嵌套数组的数组(名称为 antwoordenMogelijk)。所以 antwoordenMogelijk[0] 包含选项 1 的所有可能查询,anttwoordenMogelijk[1] 包含选项 2 的查询,依此类推。

      window.onkeydown = function (event) {
      if (event.keyCode == 13) {
             // console.log("test");
             checkQuestions(document.getElementsByClassName('inputField')[0].value);
      
             document.getElementsByClassName('inputField')[0].value = '';
      
             if (event.preventDefault) event.preventDefault();
             return false;
         }
      }
      
      var mail = new Array();
      var verzenden = new Array();
      
      var antwoordenMogelijk = new Array();
      var antwoorden = new Array();
      var perc = new Array();
      
      //0 Mail
      //1 Verzenden
      
      antwoordenMogelijk[0] = new Array('stuur', 'mail', 'verzend', 'help', 'vraag');
      antwoorden[0] = 'Als je een mailtje wil sturen kan dit naar <a href="mailto:help@wordquest.nl">help@wordquest.nl</a>.';
      
      antwoordenMogelijk[1] = ['log', 'inloggen', 'in'];
      antwoorden[1] = 'Inloggen gaat via <a href="http://wordquest.nl/login">registreren</a>.';
      
      antwoordenMogelijk[2] = ['nieuw', 'account', 'aanmaken', 'registreer', 'maak'];
      antwoorden[2] = 'Nieuwe accounts kan je aanmaken via <a href="http://wordquest.nl/registreer">registreren</a>.';
      
      antwoordenMogelijk[3] = ['suggestie', 'sturen', 'contact'];
      antwoorden[3] = 'Suggesties kan je sturen via <a href="mailto:help@wordquest.nl">deze link</a>.';
      
      antwoordenMogelijk[4] = ['veranderen', 'character', 'avatar'];
      antwoorden[4] = 'Je character kan je makkelijk veranderen op <a    href="http://wordquest.nl/avatar">deze pagina</a>';
      
      var errorText = '<b>An error has occured...</b><br>Er zijn geen antwoorden gevonden met de huidige zoekterm(en)...';
      
      var answers = [];
      var final = [];
      var finalP;
      
      function checkQuestions(quest) {
          console.log('');
          answer = 0;
          finalP = 0;
          final = [];
          answers = [];
      
          checkAnswer(quest);
      
          for (i = 0; i < perc.length; i++) {
              if (perc[i] > 5) {
                  if (perc[i] == finalP) {
                      finalP = perc[i];
                      final.push(antwoorden[i]);
                  } else if (perc[i] > finalP) {
                      finalP = perc[i];
                      final = [];
                      final.push(antwoorden[i]);
                  }
              }
          }
      
         if (final[0] == null) {
             final.push(errorText);
         }
      
         setAnswer();
       }
      
       var amount = 0;
      
       function checkAnswer(question) {
          for (i = 0; i < antwoordenMogelijk.length; i++) {
              perc[i] = 0;
              for (x = 0; x < antwoordenMogelijk[i].length; x++) {
                  amount = 100 / antwoordenMogelijk[i].length;
                  if (question.includes(antwoordenMogelijk[i][x])) {
                      perc[i] = perc[i] + amount;
                      console.log('Antwoord: ' + antwoordenMogelijk[i][x] + ' - +' + amount);   
                  }
              }
              if (perc[i] > 0) {
                  console.log('Uiteindelijk: ' + perc[i]);
              }
          }
      }
      
      var finalAns = [];
      
      function setAnswer() {
      
          finalAns = [];
      
          for (i = 0; i < final.length; i++) {
              finalAns.push('<p>' + final[i] + '</p>');
         }
      
          if (final != 'error') {
              document.getElementsByClassName('answers')[0].innerHTML =    finalAns.join('');
              // document.getElementsByClassName('answers')[0].innerHTML = '<p>' + antwoorden[final] + '</p>';
          } else {
              document.getElementsByClassName('answers')[0].innerHTML = '<p>' + errorText + '</p>';
          }
      }
      
      function start() {
          console.log("Gestart");
          // answers.push('Voorbeelden van vragen zijn:<br><ul><li>Hoe stuur ik een mailtje</li><li>Wat kost een pakketje verzenden</li></ul>');
         }
      

      【讨论】:

        猜你喜欢
        • 2014-11-20
        • 2018-08-09
        • 1970-01-01
        • 2017-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-17
        • 2022-07-04
        相关资源
        最近更新 更多