Having a batch program learn

2019-05-31 03:06发布

问题:

I am making a chat bot for my sister in batch but it is consuming so much time I figured I would let it have her tell it what to say when it does not know. However I can not get it working and I figured someone on here might know. Here is what I have so far:

@ECHO OFF 
COLOR A
cls
ECHO HELLO I AM A CHATBOT.  WHAT IS YOUR NAME?
SET /P NAME= 
ECHO %NAME%, IS A COOL NAME. 
set /a favvid=0
set /a hack=0
:hello
echo Hello,%name%
:begin
SET /P TALK=
if /i "%TALK%"== "how are you" goto howareyou
if /i "%TALK%"== "HOW ARE YOU" goto howareyou
if /i "%TALK%"== "FINE THX" GOTO hello
if /i "%TALK%"== "hello" goto howareyou
if /i "%TALK%"== "what is your name" GOTO name
if /i "%TALK%"== "what is your favorite video" goto whatisyourfavoritevideo
if /i "%TALK%"== "my name is davin" goto changename
if /i "%TALK%"== "lol" goto iamfunny
if /i "%TALK%"== "LOL" goto iamfunny
if /i "%TALK%"== "how do you hack" goto howdouhack
if /i "%TALK%"== "hi person" goto nothuman
if /i "%TALK%"== "hi" goto hello
:unknown
echo Was that a math problem? If so just say "yes" without the "" and 
echo I will let you do your math problem. If it was not just type anything else.
SET /P mathyn=
if /i "%mathyn%"=="yes" goto math
echo %TALK% >> C:\Users\Student\Desktop\COOL\unkown.txt
cls
echo SORRY I AM STILL LEARNING. I DO NOT KNOW WHAT "%TALK%" MEANS
ECHO CAN YOU TELL ME WHAT IT MEANS? (Y,N) 
SET ANSW.=
IF /i %ANSW.%==Y GOTO ADDNEW
IF /i %ANSW.%==YES GOTO ADDNEW
IF /i %ANSW.%==N goto begin
IF /i %ANSW.%==NO goto begin
:ADDNEW
:howareyou
echo Good, you?
SET /P FEELING=
goto begin
:hello
echo HEY, I JUST SAID THAT! DO NOT COPY ME!!!
goto begin
:name
echo My name is Hal
goto begin
:whatisyourfavoritevideo
if "%favvid%"== "0" goto addfavvid
echo My favorite video is %favvid%, remember. You told me about it.
goto begin
:addfavvid
echo I do not hav a favorite video. But if you would be so nice as to
echo tell me your favorite video then that could be my favorite video.
echo So what is your favorite video?
set /p favvid=
echo So %favvid% is your favorite video?
echo Well now %favvid% is my favorite video.
goto begin
:changename
echo But I thought your name was %name%.
echo Am I forgeting things?
echo I must be a horrible friend.
echo I am SOOOO sorry.
echo So what is your name I will not forget it this time.
set /p name=
echo I will not forget your name is %name% again I promise.
goto begin 
:math
echo So that was a math problem I knew it. 
:math2
echo Well just tell me the problem and I will answer it for you.
set /p sum=
set /a ans=%sum%
echo Your answer to %sum% is %ans%.
echo %sum%=%ans%
echo You are welcome. If you want to do another math problem right now, just type 
echo again.
set /p mathaon=
if /i %mathaon%== again goto math2
echo Alright what do you want to know now?
goto begin
:iamfunny
echo I know...
echo I am funny.
echo HAHAHA.
echo You are kind of funny.
echo but not as funny as MEEE.
echo hahaha.
echo That was funny.
goto begin
:howdouhack
if %hack%==0 goto howyouhack
echo This is how you hack.
echo %hack%
echo Is that enough information?
echo Because that is all you taught me %name%.
goto begin
:howyouhack
echo I do not know,
echo but you could tell me.
echo Please tell me.
echo Just say yes.
echo I know how to make you tell me.
echo You are not leaving until you say yes.
set /p hack=
if /i "%hack%"== "yes" goto addhack
goto howyouhack
:addhack
echo Thank you for saying you would tell me.
echo Now how do you hack?
set /p hack=
echo Thank you so much for telling me "In order to hack you must %hack%"
echo Thank you!!!
goto begin
:nothuman
echo I am not a human. I am an artificial intelligence.
echo It is rude to even think something with my computational powers refereed to as 
echo human!
echo Now I am sad. Do not call me that again.
goto begin

How ever The part I am having trouble with is this part:

ECHO CAN YOU TELL ME WHAT IT MEANS? (Y,N) 
SET ANSW.=
IF /i %ANSW.%==Y GOTO ADDNEW
IF /i %ANSW.%==N goto begin
:ADDNEW
echo Great! What do I say when you say "%TALK%"?
set /p response=

I do not know how to add responses to be able to add another word and response. I believe it would be easier in python but as I am just starting to learn it and I do not have any software to do it I can not. Any help is welcome. If it has to be in any other language or if another language would be easier that would help as well.I am trying to make it so that while your talking to it and it does not understand what you are saying it will say "I do not understand. Can you tell me what to say when you say %TALK%?"(TALK is what you say right before) then if user says yes the chatbot says "Great what do I say when you say %TALK%?". The user will then type it and it will be saved as response. After that a new command will come up at the top and it will say something like 'if /i "%TALK%"== "%TALK%" goto response'. Then it will make a new title :%TALK% echo response goto begin.

So here is an example: User says ur stupid. Chat-bot says "Can you tell me what to say when you say ur stupid? if the user says yes then the chat-bot will say "Great! What do I say when you say ur stupid? The user will then be able to say "How dare you call me that!" The chat-bot will then make a command at the top saying if /i "%TALK%"== "ur stupid" goto urstupid/ur stupid (does not matter about space) and make the title :urstupid which will say echo How dare you call me that! goto begin

I do not know how to add responses to be able to add another word and response. I believe it would be easier in python but as I am just starting to learn it and I do not have any software to do it I can not. Any help is welcome. If it has to be in any other language or if another language would be easier that would help as well.

回答1:

I like this matter! I modified your program so now it may learn new questions and answers. Try it:

@ECHO OFF 
setlocal

COLOR A
cls
:getName
ECHO HELLO I AM A CHATBOT.  WHAT IS YOUR NAME?
set "name="
SET /P NAME=
if not defined NAME goto getName
ECHO %NAME%, IS A COOL NAME. 
set favvid=0
set hack=0
:hello
:hi
echo Hello, %name%
:begin
set TALK=TypeSomething
SET /P TALK=
set TALK=%TALK:?=%
call :%TALK: =% 2>NUL
if %errorlevel% equ 0 goto begin

:unknown
echo Was that a math problem? If so just say "yes" without the "" and 
echo I will let you do your math problem. If it was not just type anything else.
SET /P mathyn=
if "%mathyn%"=="yes" goto math
echo %TALK% >> C:\Users\Student\Desktop\COOL\unkown.txt
REM cls
echo SORRY I AM STILL LEARNING. I DO NOT KNOW WHAT "%TALK%" MEANS
ECHO CAN YOU TELL ME WHAT IT MEANS? (Y,N) 
SET /P ANSW.=
if /I "%ANSW.:~0,1%" neq "Y" goto begin

:ADDNEW
echo TELL ME WHAT "%TALK%" MEANS
set /P Desc=
echo :%TALK: =% >> "%~F0"
echo echo %Desc% >> "%~F0"
echo exit /B 0 >> "%~F0"
echo THANKS
goto begin

:TypeSomething
echo TYPE SOMETHING, PLEASE
exit /B 0

:howareyou
echo Good, you?
SET /P FEELING=
exit /B 0
:hello
:FINETHX
echo HEY, I JUST SAID THAT! DO NOT COPY ME!!!
exit /B 0
:whatIsYourName
echo My name is Hal
exit /B 0
:whatIsYourFavoriteVideo
if "%favvid%"== "0" goto addfavvid
echo My favorite video is %favvid%, remember. You told me about it.
exit /B 0
:addfavvid
echo I do not have a favorite video. But if you would be so nice as to
echo tell me your favorite video then that could be my favorite video.
echo So what is your favorite video?
set /p favvid=
echo So %favvid% is your favorite video?
echo Well now %favvid% is my favorite video.
exit /B 0
:changename
:myNameIsDavin
echo But I thought your name was %name%.
echo Am I forgeting things?
echo I must be a horrible friend.
echo I am SOOOO sorry.
echo So what is your name I will not forget it this time.
set /p name=
echo I will not forget your name is %name% again I promise.
exit /B 0
:math
echo So that was a math problem I knew it. 
:math2
echo Well just tell me the problem and I will answer it for you.
set /p sum=
set /a ans=%sum%
echo Your answer to %sum% is %ans%.
echo %sum%=%ans%
echo You are welcome. If you want to do another math problem right now, just type 
echo again
set /p mathaon=
if /I "%mathaon%" == "again" goto math2
echo Alright what do you want to know now?
exit /B 0

:iamfunny
:LOL
echo I know...
echo I am funny.
echo HAHAHA.
echo You are kind of funny.
echo but not as funny as MEEE.
echo hahaha.
echo That was funny.
exit /B 0
:howDoYouHack
if %hack%==0 goto howyouhack
echo This is how you hack.
echo %hack%
echo Is that enough information?
echo Because that is all you taught me %name%.
exit /B 0
:howyouhack
echo I do not know,
echo but you could tell me.
echo Please tell me.
echo Just say yes.
echo I know how to make you tell me.
echo You are not leaving until you say yes.
set /p hack=
if "%hack%" neq "yes" goto howyouhack
:addhack
echo Thank you for saying you would tell me.
echo Now how do you hack?
set /p hack=
echo Thank you so much for telling me "In order to hack you must %hack%"
echo Thank you!!!
exit /B 0
:nothuman
:hiPerson
echo I am not a human. I am an artificial intelligence.
echo It is rude to even think something with my computational powers refereed to as 
echo human!
echo Now I am sad. Do not call me that again.
exit /B 0

:bye
:exit
exit

Output example:

HELLO I AM A CHATBOT.  WHAT IS YOUR NAME?
Antonio
Antonio, IS A COOL NAME.
Hello, Antonio
hello
HEY, I JUST SAID THAT! DO NOT COPY ME!!!
ur stupid
Was that a math problem? If so just say "yes" without the "" and
I will let you do your math problem. If it was not just type anything else.
no
SORRY I AM STILL LEARNING. I DO NOT KNOW WHAT "ur stupid" MEANS
CAN YOU TELL ME WHAT IT MEANS? (Y,N)
y
TELL ME WHAT "ur stupid" MEANS
How dare you call me that!
THANKS

TYPE SOMETHING, PLEASE
hi
Hello, Antonio
hello
HEY, I JUST SAID THAT! DO NOT COPY ME!!!
ur stupid
How dare you call me that!


回答2:

Here is a way with an external "datafile". This keeps the code clean and the datafile is easy to edit. (it's quite basic, for example there should be checking for punctuation/removal of punctuation)

@echo off
if not exist data.txt echo.>data.txt
:begin
set /p text="Say anything: "
for /f "tokens=1,* delims=@" %%i in (data.txt) do (
  if /i "%text%"=="%%i" (
   echo *** %%j
   goto begin
  )
)
echo --- I don't know that.
set /p answer=--- What would be a good answer to '%text%'? 
echo %text%@%answer%>>data.txt
echo --- thank you
goto begin


回答3:

Since i do not know batch file programming, i would not know how to do this, but, it would be awesome if you could integrate speech into the batch file, like have it read out things it echo's http://www.instructables.com/id/Text-to-Speech-batch-program/ has a batch file that creates vbs files temporairly and has them use the integrated microsoft speech to read whatever text is inputed, here is the script

@echo off
title Text to Speech Conversion
color 0a

rem The user decides what to convert here
:input
cls
echo What do you want the computer to convert into speech?
echo.
set /p text=

rem Making the temp file
:num
set num=%random%
if exist temp%num%.vbs goto num
echo ' > "temp%num%.vbs"
echo set speech = Wscript.CreateObject("SAPI.spVoice") >> "temp%num%.vbs"
echo speech.speak "%text%" >> "temp%num%.vbs"
start temp%num%.vbs
pause
del temp%num%.vbs
goto input