Texto semelhante comparando string com array para retornar o item mais compatível


Um exemplo a seguir de um objeto para que os usuários pesquisem texto semelhante comparando string com array para retornar o item mais compatível

//string a ser comparada com o array
let str = "uma frase qualquer aqui";
let strArr = str.split(" ");
//ao comparar com o array deve retornar o segundo item, pois tem mais palavras compativeis
let arr = ["frase qualquer", "uma qualquer aqui", "nada compatível"];

function maisCompativel(){
  //Vetor de contagens com tamanho de arr e preenchido com zeros
  const contagens = new Array(arr.length).fill(0); 
  
  for(let i = 0; i < strArr.length; i++){
  
    //loop para percorrer as frases 
    for (let j = 0; j < arr.length; j++){ 
      if (arr[j].includes(strArr[i])){
        contagens[j]++; //contabilizar a palavra já que existe
      }
    }
  }
  
  let maiorContagem = Math.max(...contagens);
  let posicaoMaior = contagens.indexOf(maiorContagem);
  return arr[posicaoMaior];
}

alert(maisCompativel());


 

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
Outro exemplo, que mostra com * qual tem palavras com perguntas mais relevântes para resposta
<pre>
items.push({pergunta:' oi bom dia tarde noite ola ', resposta: "olá tudo bem. Vamos conversar."}); 
items.push({pergunta:' bem voce, esta, como , diga ', resposta: "Hoje estou de bem com a vida, me diga mais sobre você."});
items.push({pergunta:' filme serie desenho novela ', resposta: "Vamos falar de filme? Eu gosto do filme eu robô. Qual filme você gosta?"});
items.push({pergunta:' oi bem e voce ', resposta: "Legal. Eu estou bem. O que gosta de fazer?"});
items.push({pergunta:' oi, cade, meu carro oi  oi oi ', resposta: "nada haver"});
</pre>

<input type="text" id="palavra"><input type="button" value="ok" onClick="conversar();"> 
<div id="result"></div>
<script>
var items = [];
items.push({pergunta:' oi bom dia tarde noite ola ', resposta: "olá tudo bem. Vamos conversar."}); 
items.push({pergunta:' bem voce, esta, como , diga ', resposta: "Hoje estou de bem com a vida, me diga mais sobre você."});
items.push({pergunta:' filme serie desenho novela ', resposta: "Vamos falar de filme? Eu gosto do filme eu robô. Qual filme você gosta?"});
items.push({pergunta:' oi bem e voce ', resposta: "Legal. Eu estou bem. O que gosta de fazer?"});
items.push({pergunta:' oi, cade, meu carro oi  oi oi ', resposta: "nada haver"});

function find(items, text) {
text = text.split(' ');
return items.filter(function(event) { 
return event.pergunta.indexOf(text[0]) > -1 || event.pergunta.indexOf(text[1]) > -1  || event.pergunta.indexOf(text[2]) > -1  || event.pergunta.indexOf(text[3]) > -1  || event.pergunta.indexOf(text[4]) > -1   || event.pergunta.indexOf(text[5]) > -1})
}

function conversar()
{
pl = document.getElementById('palavra').value.toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, ""); //retira acento e deixa minuscula
var x = (find(items,pl)); //chama a funcao
var re =  pl.split(' ');
var count;
document.getElementById('result').innerHTML = x.length+'<br>';
ii = 0;
while(ii < x.length){
//mais relevante
for(let iq = 0; iq < re.length; iq++){
if(x[ii].pergunta.includes(re[iq])){ count+="<font color=red> * </font>"; }}

document.getElementById('result').innerHTML+= x[ii].pergunta +" -> "+ x[ii].resposta + " - relevante " + count + " <hr> "; 
count = '';
ii++;
}
}


</script>


 

Veja outra versão

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<input type="text" id="palavra"><input type="button" value="ok" onClick="conversar();"> 
<div id="result"></div>
<script>
var items = [];
items.push({pergunta:' oi bom dia tarde noite ola ', resposta: "olá tudo bem. Vamos conversar."}); 
items.push({pergunta:' bem voce, esta, como , diga ', resposta: "Hoje estou de bem com a vida, me diga mais sobre você."});
items.push({pergunta:' filme serie desenho novela ', resposta: "Vamos falar de filme? Eu gosto do filme eu robô. Qual filme você gosta?"});
items.push({pergunta:' oi bem e voce ', resposta: "Legal. Eu estou bem. O que gosta de fazer?"});
items.push({pergunta:' oi, cade, meu carro oi  oi oi ', resposta: "nada haver"});

function find(items, text) {
text = text.split(' ');
return items.filter(function(event) { 
return event.pergunta.indexOf(text[0]) > -1 || event.pergunta.indexOf(text[1]) > -1  || event.pergunta.indexOf(text[2]) > -1  || event.pergunta.indexOf(text[3]) > -1  || event.pergunta.indexOf(text[4]) > -1   || event.pergunta.indexOf(text[5]) > -1})
}

function conversar()
{
pl = document.getElementById('palavra').value.toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, ""); //retira acento e deixa minuscula
var x = (find(items,pl)); //chama a funcao
var re =  pl.split(' ');
var count;
var contar = 0;
var countmaior = 0;
document.getElementById('result').innerHTML = x.length+'<br>';
ii = 0;
while(ii < x.length){
//mais relevante
for(let iq = 0; iq < re.length; iq++){
if(x[ii].pergunta.includes(re[iq])){ count+="<font color=red> * </font>"; contar++; }}
if(contar > countmaior){ countmaior = contar; arrayrelevante = x[ii].pergunta+" - "+x[ii].resposta;}

document.getElementById('result').innerHTML+= x[ii].pergunta +" -> "+ x[ii].resposta + " - relevante " + count + " <hr> "; 
count = '';
contar = 0;
ii++;
}
document.getElementById('result').innerHTML+="<br><b>mais relevânte: "+countmaior+" palavra(s): " + arrayrelevante+"</b>";
}


</script>



<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<input type="text" id="palavra"><input type="button" value="ok" onClick="pesquisar();"> 
<div id="result"></div>
<script>
//array com perguntas e respostas, vou comparar as perguntas mais relevantes, que tem mais palavras parecidas do input palavra
var items = [
{pergunta:"oi bom dia tarde noite ola", resposta: "olá tudo bem. Vamos conversar."},
{pergunta:"filme serie desenho novela", resposta: "Vamos falar de filme? Eu gosto do filme eu robô. Qual filme você gosta?"},
{pergunta:"oi como e seu nome", resposta: "oi meu nome é robota"},
{pergunta:"carro fusca oi", resposta: "Vamos falar de carros? o que quer saber?"}
]; 

//funcao que filtra o array
function find(items, text) {
text = text.split(' '); //separo as palavras, e comparo 1 por 1 abaixo limitei para 6, pode colocar mais...
return items.filter(function(event) {return event.pergunta.indexOf(text[0]) > -1 || event.pergunta.indexOf(text[1]) > -1  || event.pergunta.indexOf(text[2]) > -1  || event.pergunta.indexOf(text[3]) > -1  || event.pergunta.indexOf(text[4]) > -1   || event.pergunta.indexOf(text[5]) > -1})
}

//funcao que trava as palavras e chama a funcao find
function pesquisar()
{
pl = document.getElementById('palavra').value.toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, ""); //retira acento e deixa minuscula
var x = (find(items,pl)); //chama a funcao de cima
var re =  pl.split(' '); // separa a string e abaixo seta as variaveis
var todos; 
var arrayrelevante;
var contar = 0;
var countmaior = 0; 
var ii = 0;
document.getElementById('result').innerHTML ="0 resultados"; //inicia com 0 resultados

//enquanto tiver arrays filtrados acima, faça...
while(ii < x.length){

//aqui comparo as palavras que mais se repetem, conto
for(let iq = 0; iq < re.length; iq++){
if(x[ii].pergunta.includes(re[iq])){ contar++; }}

//quando contar++ for maior que countmaior, quer dizer que tem mais palavras relevantes, entao coloco em arrayrelevante
if(contar > countmaior){ countmaior = contar; arrayrelevante = x[ii].pergunta + " - " + x[ii].resposta;}
todos+= x[ii].pergunta +" -> "+ x[ii].resposta + " <hr>";  //adiciono para mostrar no final
contar = 0; //zero para continuar comparando acima no laço
ii++; //adiciono 1 enquanto for menor que os resultados
}
//mostro na tela
document.getElementById('result').innerHTML = x.length+' resultados<br>'+ todos.replace("undefined", "") + "<br><b>mais relevânte: "+countmaior+" palavra(s): " + arrayrelevante+"</b>";
}
</script>


Categoria: javascript | Tags: , , , | Postado por joemaster em 28/jul/2020

<< Anterior

Próximo >>

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *