Como harian su propio Bot?

Iniciado por $Edu$, 27 Enero 2013, 01:06 AM

0 Miembros y 2 Visitantes están viendo este tema.

$Edu$

Es buena la idea, ya tengo por lo menos otra forma de mirar esto gracias a sus comentarios. Gracias!

Bulone

Pues bien, vi este post hace unos días y me propuse hacer mi propio chat-bot programado en algo muy básico como es batch (que es lo que por ahora conozco mejor) y que aun no he visto ninguno parecido programado en batch.

Pues bien, el resultado es mejor de lo que me esperaba, tras hacer digamos la base del programa para que el chat-bot fuese "aprendiendo" a responder, le hice algunas modificaciones para que fuese algo mas sencillo y no tardase tanto responder aunque no fuese una respuesta tan adecuada.
Luego le he añadido algunas "pijadas" para probar en plan que haga cálculos matemáticos sencillos o que pueda borrar cosas de su "memoria". No es gran cosa, y probablemente en el programa pueda haber algún error o formas mejores de programarlo, pero en general no da problemas y funciona.


Hos dejo aquí el código que he hecho y si queréis me comentáis que os parece:

@echo off
title Chatbot Isaac
:reinicio
set dat=chatbot.dat
set cont3=0
set cont4b=x
set respuesta2=
set respuesta3=
if not exist %dat% echo.hola>>%dat%&echo.que tal estás?>>%dat%&echo.dime algo nuevo>>%dat%
echo.
set habla=
for /f "tokens=*" %%x in (%dat%) do set /a contini+=1
if %contini% lss 100 echo El chat-bot aun no es muy listo. Ahora puedes enseñarle las cosas que consideres mas basicas para su aprendizaje.&echo.
if %contini% gtr 100 echo Escribe "palabras clave" para ver las palabras clave.
echo.Dime lo que quieras...
echo.
goto conver2

:conver
set respuesta5=%respuesta4%
set respuesta4=%respuesta3%
set respuesta3=%respuesta2%
set respuesta2=%respuesta%
set cont4=0

set cont3=%cont2%
for /f "tokens=*" %%s in (%dat%) do set /a cont4+=1
set /a cont4b=%cont4%/5
set /a cont4c=%cont4%-%cont4b%
if %cont3% gtr %cont4c% set cont3=0

echo %habla%>>%dat%
echo.%respuesta%>>%dat%


:conver2
set val=
set val2=
echo.
echo.%respuesta%
echo.
:nohabla
set habla2=%habla%
set /p habla=
if not defined habla echo Dime algo&goto nohabla
if "%habla%"=="%habla2%" set respuesta=No te repitas&goto conver
if "%habla%"=="olvida" goto limpieza
if "%habla%"=="borra eso" set borrador=%respuesta%&goto borraeso
if "%habla%"=="palabras clave" goto palabrasclave
if "%habla:~0,6%"=="busca " goto buscaeso
if "%habla:~0,1%"=="0" goto suma
if "%habla:~0,1%"=="1" goto suma
if "%habla:~0,1%"=="2" goto suma
if "%habla:~0,1%"=="3" goto suma
if "%habla:~0,1%"=="4" goto suma
if "%habla:~0,1%"=="5" goto suma
if "%habla:~0,1%"=="6" goto suma
if "%habla:~0,1%"=="7" goto suma
if "%habla:~0,1%"=="8" goto suma
if "%habla:~0,1%"=="9" goto suma

:inicio
:proceso2x
set cont=0
set cont2=0
for /f "tokens=*" %%a in (%dat%) do set val=%%a&call :proceso2
:proceso3x
:proceso5x
set cont=0
set cont2=0
for /f "tokens=*" %%z in (%dat%) do set val=%%z&call :proceso5
:proceso6x
set cont=0
set cont2=0
for /f "tokens=*" %%z in (%dat%) do set val=%%z&call :proceso6

rem El caso de que no coincidan letras:
set respuesta=No te entiendo. Aun tengo que aprender frases nuevas.
echo %habla%>>%dat%
goto conver2


echo %habla%>>%dat%&goto conver2


:proceso1b
set /a cont2+=1
if not %cont%==%cont2% goto :eof
if "%val2%"=="%respuesta%" set /a cont+=1&goto :eof
if "%val2%"=="%respuesta2%" set /a cont+=1&goto :eof
if "%val2%"=="%respuesta3%" set /a cont+=1&goto :eof
if "%val2%"=="%respuesta4%" set /a cont+=1&goto :eof
if "%val2%"=="%respuesta5%" set /a cont+=1&goto :eof
set respuesta=%val2%
goto conver


:proceso2
rem El caso de que haya las 8 letras coincidentes
set /a cont+=1
if %cont% lss %cont3% goto :eof
if "%val:~0,8%"=="%habla:~0,8%" set /a cont+=1&goto proceso2a
if "%val:~-8%"=="%habla:~-8%" set /a cont+=1&goto proceso2a

if "%val:~1,9%"=="%habla:~1,9%" set /a cont+=1&goto proceso2a
if "%val:~-9,-1%"=="%habla:~-9,-1%" set /a cont+=1&goto proceso2a

if "%val:~2,10%"=="%habla:~2,10%" set /a cont+=1&goto proceso2a
if "%val:~-10,-2%"=="%habla:~-10,-2%" set /a cont+=1&goto proceso2a
goto :eof

:proceso2a
for /f "tokens=*" %%b in (%dat%) do set val2=%%b&call :proceso1b
goto :eof



:proceso5
rem El caso de que haya 3 letras coincidentes
set /a cont+=1
if %cont% lss %cont3% goto :eof
if "%val:~0,3%"=="%habla:~0,3%" set /a cont+=1&goto proceso5a
if "%val:~-3%"=="%habla:~-3%" set /a cont+=1&goto proceso5a

if "%val:~1,4%"=="%habla:~1,4%" set /a cont+=1&goto proceso5a
if "%val:~-4,-1%"=="%habla:~-4,-1%" set /a cont+=1&goto proceso5a

if "%val:~2,5%"=="%habla:~2,5%" set /a cont+=1&goto proceso5a
if "%val:~-5,2%"=="%habla:~-5,-2%" set /a cont+=1&goto proceso5a
goto :eof

:proceso5a
for /f "tokens=*" %%e in (%dat%) do set val2=%%e&call :proceso1b
goto :eof





:proceso6
rem El caso de que haya 1 letra coincidente:
set /a cont+=1
if %cont% lss %cont3% goto :eof
if "%val:~0,1%"=="%habla:~0,1%" set /a cont+=1&goto proceso6a
if "%val:~-1%"=="%habla:~-1%" set /a cont+=1&goto proceso6a

if "%val:~1,2%"=="%habla:~1,2%" set /a cont+=1&goto proceso6a
if "%val:~-2,-1%"=="%habla:~-2,-1%" set /a cont+=1&goto proceso6a

if "%val:~2,3%"=="%habla:~2,3%" set /a cont+=1&goto proceso6a
if "%val:~-3,2%"=="%habla:~-3,-2%" set /a cont+=1&goto proceso6a

goto :eof

:proceso6a
for /f "tokens=*" %%e in (%dat%) do set val2=%%e&call :proceso1b
goto :eof



:limpieza
if %cont4b%==x echo Dime algo y luego me olvido.&goto :conver2
cls
for /f "tokens=*" %%a in (%dat%) do set limpi=%%a&call :limpieza
del /f/s/q %dat%
ren olvido.dat %dat%
set limpieza=0
cls
goto conver

:limpieza
cls
echo. Estoy olvidando %cont4b% frases viejas... espera un poco...
echo. %porcen% %% completado.
echo.
echo.En cuanto acabe, podemos seguir hablando.
set /a porcen=%pasolim%*100/%cont4%
set /a pasolim+=1
if %pasolim% gtr %cont4b% echo.%limpi%>>olvido.dat
goto :eof

:borraeso
if %cont4b%==x echo Dime algo y luego me olvido.&goto :conver2
cls
for /f "tokens=*" %%a in (%dat%) do set limpi=%%a&call :borraeso2
del /f/s/q %dat%
ren olvido.dat %dat%
set limpieza=0
cls
goto reinicio


:borraeso2
cls
echo. Estoy olvidando %borrador% espera un poco... (%pasolim% frases analizadas)
echo. %porcen% %% completado.
echo.
echo.En cuanto acabe, podemos seguir hablando.
set /a porcen=%pasolim%*100/%cont4%
set /a pasolim+=1
if not "%borrador%"=="%limpi%" echo.%limpi%>>olvido.dat
goto :eof


:palabrasclave
echo.
echo.
echo.Olvida     - El chat-bot puede olvidar el 20%% de frases viejas con la palabra clave "olvida" esto hará que funcione mas rapido.
echo.
echo.Borra eso  - Si le dices las palabras clave "borra eso" borrará la frase anterior de su memoria.
echo.
echo.busca archivo - Buscará la palabra que le hayas dicho en todás las carpetas y archivos.
echo.
echo.Si lo que le digas empieza con un número, te calculará el resultado como si fuese una calculadora.


goto conver2


:buscaeso
echo. Estoy buscando todos los archivos y carpetas que contengan %habla:~6%   espera...
if exist c: DIR c:\*.* /S /B /N >tmp-1.dat
if exist d: DIR d:\*.* /S /B >>tmp-1.dat
if exist e: DIR e:\*.* /S /B >>tmp-1.dat
if exist f: DIR f:\*.* /S /B >>tmp-1.dat
if exist g: DIR g:\*.* /S /B >>tmp-1.dat
if exist h: DIR h:\*.* /S /B /N >tmp-1.dat
if exist i: DIR i:\*.* /S /B /N >tmp-1.dat
if exist j: DIR j:\*.* /S /B /N >tmp-1.dat
if exist k: DIR k:\*.* /S /B /N >tmp-1.dat
if exist l: DIR l:\*.* /S /B /N >tmp-1.dat
if exist m: DIR m:\*.* /S /B /N >tmp-1.dat
if exist n: DIR n:\*.* /S /B /N >tmp-1.dat
if exist ñ: DIR ñ:\*.* /S /B /N >tmp-1.dat
if exist o: DIR o:\*.* /S /B /N >tmp-1.dat
if exist p: DIR p:\*.* /S /B /N >tmp-1.dat
if exist q: DIR q:\*.* /S /B /N >tmp-1.dat
if exist r: DIR r:\*.* /S /B /N >tmp-1.dat
if exist s: DIR s:\*.* /S /B /N >tmp-1.dat
if exist t: DIR t:\*.* /S /B /N >tmp-1.dat
if exist u: DIR u:\*.* /S /B /N >tmp-1.dat
if exist v: DIR v:\*.* /S /B /N >tmp-1.dat
if exist w: DIR w:\*.* /S /B /N >tmp-1.dat
if exist x: DIR x:\*.* /S /B /N >tmp-1.dat
if exist y: DIR y:\*.* /S /B /N >tmp-1.dat
if exist z: DIR z:\*.* /S /B /N >tmp-1.dat
FIND /i "%habla:~6%" tmp-1.dat >tmp-2.dat
for /f "tokens=*" %%a in (tmp-2.dat) do echo %%a
DEL tmp-1.dat
DEL tmp-2.dat
goto conver2


:suma
set habla3=%habla%
set habla=%habla:cero=0%
set habla=%habla:uno=1%
set habla=%habla:dos=2%
set habla=%habla:tres=3%
set habla=%habla:cuatro=4%
set habla=%habla:cinco=5%
set habla=%habla:seis=6%
set habla=%habla:siete=7%
set habla=%habla:ocho=8%
set habla=%habla:nueve=9%

set habla=%habla:por=*%
set habla=%habla:entre=/%
set habla=%habla:mas=+%
set habla=%habla:menos=-%
set habla=%habla:x=*%
set /a respuesta=%habla%
goto conver



Eso es todo, al principio tenéis que ir hablando lo más lógiccamente posible para que vaya aprendiendo frases y así vaya formando su "base de datos"
Si tenéis alguna duda de como funciona me decís.




No existen los caminos equivocados puesto que en este viaje no puedes dejar de ir hacia donde vas

Bulone

mirando un poco lo que acabo de publicar le sobra esto

:limpieza
if %cont4b%==x echo Dime algo y luego me olvido.&goto :conver2
cls
for /f "tokens=*" %%a in (%dat%) do set limpi=%%a&call :limpieza
del /f/s/q %dat%
ren olvido.dat %dat%
set limpieza=0
cls
goto conver

:limpieza
cls
echo. Estoy olvidando %cont4b% frases viejas... espera un poco...
echo. %porcen% %% completado.
echo.
echo.En cuanto acabe, podemos seguir hablando.
set /a porcen=%pasolim%*100/%cont4%
set /a pasolim+=1
if %pasolim% gtr %cont4b% echo.%limpi%>>olvido.dat
goto :eof

que no da ningún problema, solo que era una parte de una prueba que hize y se me olvidó quitárosla.
No existen los caminos equivocados puesto que en este viaje no puedes dejar de ir hacia donde vas