Jump to content
DraKiNs

[Projeto] ChatterBot em PHP (Chat Bot)

Recommended Posts

DraKiNs

Então gente estou pensado em criar um Chat Bot em PHP.

Está tudo bem por enquanto porém preciso de dicas e algumas ajudas.

Tanto dica lógica,quanto dica a melhor o código ou até dicas para colocar no banco de dados.

O arquivo esta da seguinte forma:

Oi:Olá como vai:
Bem:Legal,eu estou bem:

O ':' separa a pergunta da resposta (o último : é para separar a próxima pergunta)

E o código

<?php

//ler dados
$sFile = "data.txt";
$bHandle = fopen($sFile, "r");
$sContents = fread($bHandle, filesize($sFile));
fclose($bHandle);

$sSplit = explode(':',$sContents);

// verificar

foreach($sSplit as $iValue => $sWord)
{
if(!($iValue % 2))
{
	if(strpos($sWord,$_GET['msg']) !== false)
	{
		echo $sSplit[ $iValue + 1] . "<br>";
		break;
	}
}
}
?>

Então usas:

http://127.0.0.1/bot.php?msg=Oi

Como podem ver está bem simples,é que no caso após terminado as perguntas e banco de dados e códigos php irei usar request em javascript para enviar as perguntas usando o query string atual,assim muito mais prático,sem precisar atualizar a página.

Por enquanto é isto galera,os créditos serão mantido a todos que me ajudarem.

Abraços

Atenciosamente DraKiNs

@EDIT

Fiz desta forma também

<?php

$respostas = array
(
//resposta => pergunta

'Oi como vai' => 'Oi',
'legume' => 'cenoura'
);

foreach($respostas as $word)
{
if(strpos($_GET['msg'],$word) !== false)
die(array_search($word,$respostas));
}


?>

[/php]

Share this post


Link to post
Share on other sites
Lfscoutinho

Boas,

Na verdade, não consegui perceber qual é a tua dúvida... Mas aqui vão umas sugestões:

No caso de usares ficheiros, sugiro o seguinte: que coloques só a pergunta no ficheiro, onde cada linha corresponde a uma pergunta. Depois, o código ficaria assim:

<?php

$id	= (int) $_GET['msg'];
$id	= ( $id > -1 ) ? $id : 0;

$file		= 'data.txt';		// Ficheiro
$resposta	= file( $file );	// Coloca todas as linhas num array
$resposta	= $resposta[ $id ];	// Linha com o id indicado

echo $resposta;

?>

Desta forma, não precisas de abrir e fechar ficheiros, percorreres um array até encontrares a linha que procuras, etc...

No caso de optares pelos arrays, eu aconselharia usares um número como chave, em vez de usares palavras. Assim, ficaria algo como o seguinte:

<?php

$respostas[] = 'Oi como vai?';
$respostas[] = 'Legal,eu estou bem?';

$id	= (int) $_GET['msg'];
$id	= ( $id > -1 ) ? $id : 0;

if( array_key_exists( $id, $respostas ) ) {

echo $respostas[ $id ];

}

?>

Em ambos os casos, o url passa a ser algo como: http://127.0.0.1/bot.php?msg=1

Espero que tenha conseguido ajudar de alguma forma :thumbsup:

Share this post


Link to post
Share on other sites
DraKiNs

@POST EDITADO

Ah deixa,terminei já praticamente tudo,inclusive se alguém quiser utilizar ele,contanto que tenha meus créditos,é bem simples

<?php
$sPerguntas[0] = "Olá como vai tudo bom";
$sRespostas[0] = "Vou bem muito obrigado e você";

$sPerguntas[1] = "O que é [iPs]";
$sRespostas[1] = "[iPs] é uma equipe de programadores qualificados e reconhecidos no mundo todo";

$sPerguntas[2] = "legal";
$sRespostas[2] = "É bem legal";

$sPerguntas[3] = "voce e inutil";
$sRespostas[3] = "Engano seu,os robos são muito úteis,meu amigo Ed me contou isto";


echo sWords($_GET['msg'],$sRespostas,$sPerguntas);


function sWords($sPergunta,$sResposta,$sPart)
{	
	$iAnterior = 		-1;
	sRemoveAcentos($sPergunta);
	foreach($sPart as $iValue => $sWord)
	{
		$iTemp = iLevenshteinWord($sPergunta,$sWord) ;	
		if($iTemp > $iAnterior) $iAnterior = $iValue;
	}
	return $sResposta[$iAnterior];

}

function iLevenshteinWord($sStr1,$sStr2)
{
	$iReturn 	= 	0;
	$sSplit = explode(' ',$sStr1);
	foreach($sSplit as $sWord)
	{
		if(strripos($sStr2, $sWord) !== false || strripos($sWord,$sStr2 ) !== false)
		{
			$iReturn++;
		}
	}
	return $iReturn;
}

function sRemoveAcentos($sString)
{
	$a = array
	(
		'/[ÂÀÁÄÃ]/'=>'A',
		'/[âãàáä]/'=>'a',
		'/[ÊÈÉË]/'=>'E',
		'/[êèéë]/'=>'e',
		'/[ÎÍÌÏ]/'=>'I',
		'/[îíìï]/'=>'i',
		'/[ÔÕÒÓÖ]/'=>'O',
		'/[ôõòóö]/'=>'o',
		'/[ÛÙÚÜ]/'=>'U',
		'/[ûúùü]/'=>'u',
		'/ç/'=>'c',
		'/Ç/'=> 'C'
	);	
	return preg_replace(array_keys($a), array_values($a), $sString);
}
?>


Se alguém ainda tiver alguma dica de como otimizar meu código,ou até para colocar frases,eu aceito

Abraços

~ [iPs]TeaM

Share this post


Link to post
Share on other sites
DraKiNs

Alguém teria a resposta?

Desculpa se estou fazendo Double Post,creio que já passou 24 Horas.

Share this post


Link to post
Share on other sites
Lfscoutinho

Boas,

Qual é a tua dúvida, concretamente?

Bem, dei uma olhada no código e então aqui vão algumas opiniões.

  • Variáveis, funções, etc.. ou tudo em português ou tudo em inglês!
  • O PHP tem uma função para remover os acentos: iconv
  • Na função iLevenshteinWord, em vez de teres o foreach, podes fazer também o explode da variável $sStr2, utilizas a função array_intersect e depois usas a função count()
  • Também tens de remover os acentos das perguntas que tens no teu array, não é só da pergunta que vem na variável msg

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.