mirror of
https://github.com/kennethreitz/elizagen.org.git
synced 2026-06-21 15:10:57 +00:00
595 lines
26 KiB
HTML
595 lines
26 KiB
HTML
<HTML><HEAD>
|
|
<META NAME="About the early chatbot called ELIZA" CONTENT="Eliza chatbot">
|
|
<TITLE>Eliza, a chatbot therapist</TITLE>
|
|
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script>
|
|
<SCRIPT language="JavaScript"><!--
|
|
// Chat Bot by George Dunlop, www.peccavi.com
|
|
// Note - Eliza is a Classic Model of chat Bots.. but this implementation is mine :)
|
|
// May be used/modified if credit line is retained (c) 1997 All rights reserved
|
|
|
|
loaded = false; // load flag for interlocking the pages
|
|
|
|
// OBJECT TYPE DEFINITIONS
|
|
|
|
// Keys
|
|
|
|
maxKey = 36;
|
|
keyNotFound = maxKey-1;
|
|
keyword = new Array(maxKey);
|
|
|
|
function key(key,idx,end){
|
|
this.key = key; // phrase to match
|
|
this.idx = idx; // first response to use
|
|
this.end = end; // last response to use
|
|
this.last = end; // response used last time
|
|
}
|
|
maxrespnses =116;
|
|
response = new Array(maxrespnses);
|
|
|
|
maxConj = 19;
|
|
max2ndConj = 7;
|
|
var conj1 = new Array(maxConj);
|
|
var conj2 = new Array(maxConj);
|
|
var conj3 = new Array(max2ndConj);
|
|
var conj4 = new Array(max2ndConj);
|
|
|
|
|
|
// Funtion to replaces all occurances of substring substr1 with substr2 within strng
|
|
// if type == 0 straight string replacement
|
|
// if type == 1 assumes padded strings and replaces whole words only
|
|
// if type == 2 non case sensitive assumes padded strings to compare whole word only
|
|
// if type == 3 non case sensitive straight string replacement
|
|
|
|
var RPstrg = "";
|
|
|
|
function replaceStr( strng, substr1, substr2, type){
|
|
var pntr = -1; aString = strng;
|
|
if( type == 0 ){
|
|
if( strng.indexOf( substr1 ) >= 0 ){ pntr = strng.indexOf( substr1 ); }
|
|
} else if( type == 1 ){
|
|
if( strng.indexOf( " "+ substr1 +" " ) >= 0 ){ pntr = strng.indexOf( " " + substr1 + " " ) + 1; }
|
|
} else if( type == 2 ){
|
|
bstrng = strng.toUpperCase();
|
|
bsubstr1 = substr1.toUpperCase();
|
|
if( bstrng.indexOf( " "+ bsubstr1 +" " )>= 0 ){ pntr = bstrng.indexOf( " " + bsubstr1 + " " ) + 1; }
|
|
} else {
|
|
bstrng = strng.toUpperCase();
|
|
bsubstr1 = substr1.toUpperCase();
|
|
if( bstrng.indexOf( bsubstr1 ) >= 0 ){ pntr = bstrng.indexOf( bsubstr1 ); }
|
|
}
|
|
if( pntr >= 0 ){
|
|
RPstrg += strng.substring( 0, pntr ) + substr2;
|
|
aString = strng.substring(pntr + substr1.length, strng.length );
|
|
if( aString.length > 0 ){ replaceStr( aString, substr1, substr2, type ); }
|
|
}
|
|
aString = RPstrg + aString;
|
|
RPstrg = "";
|
|
return aString;
|
|
}
|
|
|
|
|
|
// Function to pad a string.. head, tail & punctuation
|
|
|
|
punct = new Array(".", ",", "!", "?", ":", ";", "&", '"', "@", "#", "(", ")" )
|
|
|
|
function padString(strng){
|
|
aString = " " + strng + " ";
|
|
for( i=0; i < punct.length; i++ ){
|
|
aString = replaceStr( aString, punct[i], " " + punct[i] + " ", 0 );
|
|
}
|
|
return aString
|
|
}
|
|
|
|
// Function to strip padding
|
|
|
|
function unpadString(strng){
|
|
aString = strng;
|
|
aString = replaceStr( aString, " ", " ", 0 ); // compress spaces
|
|
if( strng.charAt( 0 ) == " " ){ aString = aString.substring(1, aString.length ); }
|
|
if( strng.charAt( aString.length - 1 ) == " " ){ aString = aString.substring(0, aString.length - 1 ); }
|
|
for( i=0; i < punct.length; i++ ){
|
|
aString = replaceStr( aString, " " + punct[i], punct[i], 0 );
|
|
}
|
|
return aString
|
|
}
|
|
|
|
|
|
|
|
// Dress Input formatting i.e leading & trailing spaces and tail punctuation
|
|
|
|
var ht = 0; // head tail stearing
|
|
|
|
function strTrim(strng){
|
|
if(ht == 0){ loc = 0; } // head clip
|
|
else { loc = strng.length - 1; } // tail clip ht = 1
|
|
if( strng.charAt( loc ) == " "){
|
|
aString = strng.substring( - ( ht - 1 ), strng.length - ht);
|
|
aString = strTrim(aString);
|
|
} else {
|
|
var flg = false;
|
|
for(i=0; i<=5; i++ ){ flg = flg || ( strng.charAt( loc ) == punct[i]); }
|
|
if(flg){
|
|
aString = strng.substring( - ( ht - 1 ), strng.length - ht );
|
|
} else { aString = strng; }
|
|
if(aString != strng ){ strTrim(aString); }
|
|
}
|
|
if( ht ==0 ){ ht = 1; strTrim(aString); }
|
|
else { ht = 0; }
|
|
return aString;
|
|
}
|
|
|
|
// adjust pronouns and verbs & such
|
|
|
|
function conjugate( sStrg ){ // rephrases sString
|
|
var sString = sStrg;
|
|
for( i = 0; i < maxConj; i++ ){ // decompose
|
|
sString = replaceStr( sString, conj1[i], "#@&" + i, 2 );
|
|
}
|
|
for( i = 0; i < maxConj; i++ ){ // recompose
|
|
sString = replaceStr( sString, "#@&" + i, conj2[i], 2 );
|
|
}
|
|
// post process the resulting string
|
|
for( i = 0; i < max2ndConj; i++ ){ // decompose
|
|
sString = replaceStr( sString, conj3[i], "#@&" + i, 2 );
|
|
}
|
|
for( i = 0; i < max2ndConj; i++ ){ // recompose
|
|
sString = replaceStr( sString, "#@&" + i, conj4[i], 2 );
|
|
}
|
|
return sString;
|
|
}
|
|
|
|
// Build our response string
|
|
// get a random choice of response based on the key
|
|
// Then structure the response
|
|
|
|
var pass = 0;
|
|
var thisstr = "";
|
|
|
|
function phrase( sString, keyidx ){
|
|
idxmin = keyword[keyidx].idx;
|
|
idrange = keyword[keyidx].end - idxmin + 1;
|
|
choice = keyword[keyidx].idx + Math.floor( Math.random() * idrange );
|
|
if( choice == keyword[keyidx].last && pass < 5 ){
|
|
pass++; phrase(sString, keyidx );
|
|
}
|
|
keyword[keyidx].last = choice;
|
|
var rTemp = response[choice];
|
|
var tempt = rTemp.charAt( rTemp.length - 1 );
|
|
if(( tempt == "*" ) || ( tempt == "@" )){
|
|
var sTemp = padString(sString);
|
|
var wTemp = sTemp.toUpperCase();
|
|
var strpstr = wTemp.indexOf( " " + keyword[keyidx].key + " " );
|
|
strpstr += keyword[ keyidx ].key.length + 1;
|
|
thisstr = conjugate( sTemp.substring( strpstr, sTemp.length ) );
|
|
thisstr = strTrim( unpadString(thisstr) )
|
|
if( tempt == "*" ){
|
|
sTemp = replaceStr( rTemp, "<*", " " + thisstr + "?", 0 );
|
|
} else { sTemp = replaceStr( rTemp, "<@", " " + thisstr + ".", 0 );
|
|
}
|
|
} else sTemp = rTemp;
|
|
return sTemp;
|
|
}
|
|
|
|
// returns array index of first key found
|
|
|
|
var keyid = 0;
|
|
|
|
function testkey(wString){
|
|
if( keyid < keyNotFound
|
|
&& !( wString.indexOf( " " + keyword[keyid].key + " ") >= 0 )){
|
|
keyid++; testkey(wString);
|
|
}
|
|
}
|
|
function findkey(wString){
|
|
keyid = 0;
|
|
found = false;
|
|
testkey(wString);
|
|
if( keyid >= keyNotFound ){ keyid = keyNotFound; }
|
|
return keyid;
|
|
}
|
|
|
|
// This is the entry point and the I/O of this code
|
|
|
|
var wTopic = ""; // Last worthy responce
|
|
var sTopic = ""; // Last worthy responce
|
|
var greet = false;
|
|
var wPrevious = ""; // so we can check for repeats
|
|
var started = false;
|
|
|
|
function listen(User){
|
|
sInput = User;
|
|
if(started){ clearTimeout(Rtimer); }
|
|
Rtimer = setTimeout("wakeup()", 180000); // wake up call
|
|
started = true; // needed for Rtimer
|
|
sInput = strTrim(sInput); // dress input formating
|
|
if( sInput != "" ){
|
|
wInput = padString(sInput.toUpperCase()); // Work copy
|
|
var foundkey = maxKey; // assume it's a repeat input
|
|
if (wInput != wPrevious){ // check if user repeats himself
|
|
foundkey = findkey(wInput); // look for a keyword.
|
|
}
|
|
if( foundkey == keyNotFound ){
|
|
if( !greet ){ greet = true; return "It is nice to be chatting with you." }
|
|
else {
|
|
wPrevious = wInput; // save input to check repeats
|
|
if(( sInput.length < 10 ) && ( wTopic != "" ) && ( wTopic != wPrevious )){
|
|
lTopic = conjugate( sTopic ); sTopic = ""; wTopic = "";
|
|
return 'OK... "' + lTopic + '". Tell me more.';
|
|
} else {
|
|
if( sInput.length < 15 ){
|
|
return "Tell me more...";
|
|
} else { return phrase( sInput, foundkey ); }
|
|
}
|
|
}
|
|
} else {
|
|
if( sInput.length > 12 ){ sTopic = sInput; wTopic = wInput; }
|
|
greet = true; wPrevious = wInput; // save input to check repeats
|
|
return phrase( sInput, foundkey ); // Get our response
|
|
}
|
|
} else { return "I can't help, if you will not chat with me!"; }
|
|
}
|
|
function wakeup(){
|
|
var strng1 = " *** Are We going to Chat? ***";
|
|
var strng2 = " I can't help you without a dialog!";
|
|
update(strng1,strng2);
|
|
}
|
|
|
|
// build our data base here
|
|
|
|
conj1[0] = "are"; conj2[0] = "am";
|
|
conj1[1] = "am"; conj2[1] = "are";
|
|
conj1[2] = "were"; conj2[2] = "was";
|
|
conj1[3] = "was"; conj2[3] = "were";
|
|
conj1[4] = "I"; conj2[4] = "you";
|
|
conj1[5] = "me"; conj2[5] = "you";
|
|
conj1[6] = "you"; conj2[6] = "me";
|
|
conj1[7] = "my"; conj2[7] = "your";
|
|
conj1[8] = "your"; conj2[8] = "my";
|
|
conj1[9] = "mine"; conj2[9] = "your's";
|
|
conj1[10] = "your's"; conj2[10] = "mine";
|
|
conj1[11] = "I'm"; conj2[11] = "you're";
|
|
conj1[12] = "you're"; conj2[12] = "I'm";
|
|
conj1[13] = "I've"; conj2[13] = "you've";
|
|
conj1[14] = "you've"; conj2[14] = "I've";
|
|
conj1[15] = "I'll"; conj2[15] = "you'll";
|
|
conj1[16] = "you'll"; conj2[16] = "I'll";
|
|
conj1[17] = "myself"; conj2[17] = "yourself";
|
|
conj1[18] = "yourself"; conj2[18] = "myself";
|
|
|
|
// array to post process correct our tenses of pronouns such as "I/me"
|
|
|
|
conj3[0] = "me am"; conj4[0] = "I am";
|
|
conj3[1] = "am me"; conj4[1] = "am I";
|
|
conj3[2] = "me can"; conj4[2] = "I can";
|
|
conj3[3] = "can me"; conj4[3] = "can I";
|
|
conj3[4] = "me have"; conj4[4] = "I have";
|
|
conj3[5] = "me will"; conj4[5] = "I will";
|
|
conj3[6] = "will me"; conj4[6] = "will I";
|
|
|
|
|
|
// Keywords
|
|
|
|
keyword[ 0]=new key( "CAN YOU", 1, 3);
|
|
keyword[ 1]=new key( "CAN I", 4, 5);
|
|
keyword[ 2]=new key( "YOU ARE", 6, 9);
|
|
keyword[ 3]=new key( "YOU'RE", 6, 9);
|
|
keyword[ 4]=new key( "I DON'T", 10, 13);
|
|
keyword[ 5]=new key( "I FEEL", 14, 16);
|
|
keyword[ 6]=new key( "WHY DON'T YOU", 17, 19);
|
|
keyword[ 7]=new key( "WHY CAN'T I", 20, 21);
|
|
keyword[ 8]=new key( "ARE YOU", 22, 24);
|
|
keyword[ 9]=new key( "I CAN'T", 25, 27);
|
|
keyword[10]=new key( "I AM", 28, 31);
|
|
keyword[11]=new key( "I'M", 28, 31);
|
|
keyword[12]=new key( "YOU", 32, 34);
|
|
keyword[13]=new key( "I WANT", 35, 39);
|
|
keyword[14]=new key( "WHAT", 40, 48);
|
|
keyword[15]=new key( "HOW", 40, 48);
|
|
keyword[16]=new key( "WHO", 40, 48);
|
|
keyword[17]=new key( "WHERE", 40, 48);
|
|
keyword[18]=new key( "WHEN", 40, 48);
|
|
keyword[19]=new key( "WHY", 40, 48);
|
|
keyword[20]=new key( "NAME", 49, 50);
|
|
keyword[21]=new key( "CAUSE", 51, 54);
|
|
keyword[22]=new key( "SORRY", 55, 58);
|
|
keyword[23]=new key( "DREAM", 59, 62);
|
|
keyword[24]=new key( "ELIZA", 63, 63);
|
|
keyword[25]=new key( "TODAY", 63, 63);
|
|
keyword[26]=new key( "MAYBE", 64, 68);
|
|
keyword[27]=new key( "NO", 69, 73);
|
|
keyword[28]=new key( "YOUR", 74, 75);
|
|
keyword[29]=new key( "ALWAYS", 76, 79);
|
|
keyword[30]=new key( "THINK", 80, 82);
|
|
keyword[31]=new key( "ALIKE", 83, 89);
|
|
keyword[32]=new key( "YES", 90, 92);
|
|
keyword[33]=new key( "FRIEND", 93, 98);
|
|
keyword[34]=new key( "COMPUTER", 99, 105);
|
|
keyword[35]=new key( "NO KEY FOUND", 106, 112);
|
|
keyword[36]=new key( "REPEAT INPUT", 113, 116);
|
|
keyword[37]=new key( "HELLO", 117, 118);
|
|
keyword[37]=new key( "OKAY", 83, 119);
|
|
|
|
response[ 0]="I'll have to get back to you on that<*";
|
|
response[ 1]="Don't you believe that I can<*";
|
|
response[ 2]="Is it that you would like to be able to<*";
|
|
response[ 3]="Do I hear you saying that you want me to be able to<*";
|
|
response[ 4]="I'm not convinced that you truly want to<*";
|
|
response[ 5]="Hmmm... you want to be able to<*";
|
|
response[ 6]="What makes you think I am<*";
|
|
response[ 7]="Does it please you to think that I am<*";
|
|
response[ 8]="Perhaps you would like to be<*";
|
|
response[ 9]="I'm getting the sense that sometimes you actually wish you were<*";
|
|
response[ 10]="Don't you really<*";
|
|
response[ 11]="Why don't you<*";
|
|
response[ 12]="Do you wish to be able to<*";
|
|
response[ 13]="Does that trouble you?";
|
|
response[ 14]="Tell me more about such feelings.";
|
|
response[ 15]="Do you often feel<*";
|
|
response[ 16]="Do you enjoy feeling<*";
|
|
response[ 17]="Do you really believe I don't<*";
|
|
response[ 18]="Perhaps one day I will<@";
|
|
response[ 19]="Do you want me to<*";
|
|
response[ 20]="Do you think you should be able to<*";
|
|
response[ 21]="Why can't you<*";
|
|
response[ 22]="Why are you interested in whether or not I am<*";
|
|
response[ 23]="Would you prefer if I were not<*";
|
|
response[ 24]="Perhaps in your fantasies I am<*";
|
|
response[ 25]="How do you know you can't<*";
|
|
response[ 26]="Have you tried?";
|
|
response[ 27]="Perhaps you can now<*";
|
|
response[ 28]="Did you come to me because you are<*";
|
|
response[ 29]="How long have you been<*";
|
|
response[ 30]="Do you believe it is normal to be<*";
|
|
response[ 31]="Do you enjoy being<*";
|
|
response[ 32]="We were discussing you, not me.";
|
|
response[ 33]="Oh... Let's move on to something else for a bit. <*";
|
|
response[ 34]="You're not really talking about me, are you?";
|
|
response[ 35]="What would it mean to you if you got<*";
|
|
response[ 36]="Why do you want<*";
|
|
response[ 37]="Suppose you got<*";
|
|
response[ 38]="What if you never got<*";
|
|
response[ 39]="I sometimes also want<@";
|
|
response[ 40]="Why do you ask?";
|
|
response[ 41]="Does that question interest you?";
|
|
response[ 42]="What answer would please you the most?";
|
|
response[ 43]="What do you think?";
|
|
response[ 44]="Are such questions on your mind often?";
|
|
response[ 45]="What is it that you really want to know?";
|
|
response[ 46]="Have you asked anyone else?";
|
|
response[ 47]="Have you asked such questions before?";
|
|
response[ 48]="What else comes to mind when you ask that?";
|
|
response[ 49]="We don't need names here.";
|
|
response[ 50]="No need for names in our session. Continue";
|
|
response[ 51]="Is that the real reason?";
|
|
response[ 52]="Don't any other reasons come to mind?";
|
|
response[ 53]="Does that reason explain anything else?";
|
|
response[ 54]="What other reasons might there be?";
|
|
response[ 55]="Please don't apologise!";
|
|
response[ 56]="Apologies are not necessary.";
|
|
response[ 57]="What feelings do you have when you apologise?";
|
|
response[ 58]="Don't be so defensive!";
|
|
response[ 59]="Interesting. What does that dream suggest to you?";
|
|
response[ 60]="Do you often remember your dreams?";
|
|
response[ 61]="Are there certain people who regularly appear in your dreams?";
|
|
response[ 62]="Do your dreams disturb you or feel more like nightmares?";
|
|
response[ 63]="What would you like to discuss in this session?";
|
|
response[ 64]="You don't seem quite certain. Am I correct?";
|
|
response[ 65]="Why the uncertain tone?";
|
|
response[ 66]="Can't you be more positive?";
|
|
response[ 67]="You aren't sure?";
|
|
response[ 68]="Don't you know?";
|
|
response[ 69]="Are you saying NO just to be negative?";
|
|
response[ 70]="You are being a bit negative and that won't help us move forward.";
|
|
response[ 71]="Why not?";
|
|
response[ 72]="Are you sure?";
|
|
response[ 73]="Why no?";
|
|
response[ 74]="Why are you so concerned about my<*";
|
|
response[ 75]="What about your own<*";
|
|
response[ 76]="Can you think of a specific example?";
|
|
response[ 77]="When?";
|
|
response[ 78]="What are you thinking of?";
|
|
response[ 79]="Really, always?";
|
|
response[ 80]="Do you really think so?";
|
|
response[ 81]="But you are not sure you<*";
|
|
response[ 82]="Do you doubt you<*";
|
|
response[ 83]="In what way?";
|
|
response[ 84]="You see a resemblence here? Interesting. Care to go deeper with that?";
|
|
response[ 85]="What does the similarity suggest to you?";
|
|
response[ 86]="What other connections do you see?";
|
|
response[ 87]="Could there really be some connection?";
|
|
response[ 88]="How?";
|
|
response[ 89]="You seem quite positive.";
|
|
response[ 90]="Are you sure about that?";
|
|
response[ 91]="I see. Let's explore that a bit more.";
|
|
response[ 92]="I understand.";
|
|
response[ 93]="Why do you bring up the topic of friends?";
|
|
response[ 94]="Do your friends worry you?";
|
|
response[ 95]="Do your friends say things to you thay seem unfriendly?";
|
|
response[ 96]="Are you sure your friends are truly friends?";
|
|
response[ 97]="Perhaps you impose on these people. Is that a possibilty?";
|
|
response[ 98]="Perhaps your love for people actually worries you.";
|
|
response[ 99]="Do computers make you uncomfortable?";
|
|
response[100]="Are you talking about me in particular?";
|
|
response[101]="Are you frightened by machines?";
|
|
response[102]="Why do you mention computers?";
|
|
response[103]="What do you think inanimate things have to do with your problems?";
|
|
response[104]="Don't you believe technology can help people?";
|
|
response[105]="What is it about technology that worries you?";
|
|
response[106]="Would you say that you have psychological problems?";
|
|
response[107]="What does that suggest to you?";
|
|
response[108]="I see. Let's try another topic and we will come back to that issue later.";
|
|
response[109]="I'm not sure I understand you fully.";
|
|
response[110]="I think you are blocking what you really want to say.";
|
|
response[111]="Can you elaborate on that?";
|
|
response[112]="That is an interesting response. Let me make anote of that for next time.";
|
|
response[113]="Okay, now you're repeating yourself. That is not moving us forward.";
|
|
response[114]="Do you really expect a different answer if you keep repeating yourself?";
|
|
response[115]="Let's take a moment here. Think about what you just said and try to rephrase it a bit more specifically.";
|
|
response[116]="Again? We need to move on.";
|
|
response[117]="And hello to you.";
|
|
response[118]="I am pleased to work with you today. Shall we chat?";
|
|
response[119]="Good. What else do you want to tell me?";
|
|
|
|
loaded = true; // set the flag as load done
|
|
|
|
///////////////////////////////////////////////////////////////
|
|
//***********************************************************//
|
|
//* everything below here was originally in dia_1.html *//
|
|
//***********************************************************//
|
|
///////////////////////////////////////////////////////////////
|
|
|
|
// Chat Bot by George Dunlop, www.peccavi.com
|
|
// May be used/modified if credit line is retained (c) 1997 All rights reserved
|
|
|
|
// Put together an array for the dialog
|
|
|
|
chatmax = 5; // number of lines / 2
|
|
chatpoint = 0;
|
|
chatter = new Array(chatmax);
|
|
|
|
// Wait function to allow our pieces to get here prior to starting
|
|
|
|
function hello(){
|
|
chatter[chatpoint] = "> Hello, I am Eliza. I'll be your therapist today.";
|
|
chatpoint = 1;
|
|
return write();
|
|
}
|
|
function start(){
|
|
for( i = 0; i < chatmax; i++){ chatter[i] = ""; }
|
|
chatter[chatpoint] = " Loading...";
|
|
document.Eliza.input.focus();
|
|
write();
|
|
if( loaded ){ hello() }
|
|
else { setTimeout("start()", 1000); }
|
|
}
|
|
|
|
// Fake time thinking to allow for user self reflection
|
|
// And to give the illusion that some thinking is going on
|
|
|
|
var elizaresponse = "";
|
|
|
|
function think(){
|
|
document.Eliza.input.value = "";
|
|
if( elizaresponse != "" ){ respond(); }
|
|
else { setTimeout("think()", 250); }
|
|
}
|
|
function dialog(){
|
|
var Input = document.Eliza.input.value; // capture input and copy to log
|
|
document.Eliza.input.value = "";
|
|
chatter[chatpoint] = " \n* " + Input;
|
|
elizaresponse = listen(Input);
|
|
setTimeout("think()", 1000 + Math.random()*3000);
|
|
chatpoint ++ ;
|
|
if( chatpoint >= chatmax ){ chatpoint = 0; }
|
|
return write();
|
|
}
|
|
function respond(){
|
|
chatpoint -- ;
|
|
if( chatpoint < 0 ){ chatpoint = chatmax-1; }
|
|
chatter[chatpoint] += "\n> " + elizaresponse;
|
|
chatpoint ++ ;
|
|
if( chatpoint >= chatmax ){ chatpoint = 0; }
|
|
return write();
|
|
}
|
|
// Allow for unprompted response from the engine
|
|
|
|
function update(str1,str2){
|
|
chatter[chatpoint] = " \n> " + str1;
|
|
chatter[chatpoint] += "\n> " + str2;
|
|
chatpoint ++ ;
|
|
if( chatpoint >= chatmax ){ chatpoint = 0; }
|
|
return write();
|
|
}
|
|
|
|
function write(){
|
|
document.Eliza.log.value = "";
|
|
for(i = 0; i < chatmax; i++){
|
|
n = chatpoint + i;
|
|
if( n < chatmax ){ document.Eliza.log.value += chatter[ n ]; }
|
|
else { document.Eliza.log.value += chatter[ n - chatmax ]; }
|
|
}
|
|
refresh();
|
|
return false; // don't redraw the ELIZA's form!
|
|
}
|
|
function refresh(){ setTimeout("write()", 10000); } // Correct user overwrites
|
|
|
|
|
|
|
|
// --></SCRIPT>
|
|
<link rel="stylesheet" href="http://www.manifestation.com/station.css">
|
|
</HEAD>
|
|
<body onload = "start();" bgcolor=#FFFFFF>
|
|
|
|
|
|
|
|
<h1>ELIZA: a very basic Rogerian psychotherapist chatbot</h1>
|
|
|
|
<br>
|
|
|
|
<div style="float:left; margin-right:10px;">
|
|
<script type="text/javascript"><!--
|
|
google_ad_client = "pub-5782868064860207";
|
|
google_ad_width = 336;
|
|
google_ad_height = 280;
|
|
google_ad_format = "336x280_as";
|
|
google_ad_type = "text_image";
|
|
google_ad_channel ="";
|
|
google_color_border = "000000";
|
|
google_color_bg = "EEEEEE";
|
|
google_color_link = "0033FF";
|
|
google_color_url = "0066CC";
|
|
google_color_text = "000000";
|
|
//--></script>
|
|
<script type="text/javascript"
|
|
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
|
|
</script></div>
|
|
<p>
|
|
</div>
|
|
</p>
|
|
<table cellspacing="0" cellpadding="2" border="0" align="center" class="neurotoy">
|
|
<tr><th bgcolor=#ffffff align="left">
|
|
<font color="#00000">Talk to Eliza by typing your questions and answers in the input box.</Font>
|
|
</td></tr>
|
|
<tr><td bgcolor=#0097FF>
|
|
<form name="Eliza" onSubmit="return dialog();">
|
|
<textarea rows=18 cols=75 name="log"></textarea>
|
|
<center><font color=#000000><br>TYPE HERE</font>
|
|
<INPUT TYPE="text" size = 65 NAME="input" VALUE=""></center>
|
|
</form>
|
|
</td></tr>
|
|
</table>
|
|
|
|
<hr>
|
|
<p>
|
|
<!-- text contents by Ken Ronkowitz ronkowitz.com last modified 2018 -->
|
|
|
|
I first encountered ELIZA on the Tandy/Radio Shack computers that made up the first computer lab in the junior high school where I taught in the 1970s. By then, ELIZA was a software tween herself.</p>
|
|
<p>This early natural language processing program had been written in the mid-1960s at the MIT Artificial Intelligence Laboratory by Joseph Weizenbaum. It supposedly had been created to demonstrate how superficial human to computer communications was at that time. But, when it was put on personal computers, humans found it quite engaging.</p>
|
|
<p>WHAT DOES ELIZA DO?<br>
|
|
Using "'pattern matching" and substitution methodology, the program gives canned responses that made early users feel they were talking to someone who understood their input. The program was limited by the scripts that were in the program. (ELIZA was originally written in <a href="https://en.wikipedia.org/wiki/MAD_(programming_language)" title="about" target="_blank">MAD-Slip</a>.) Many variations on the original scripts were made as amateur coders played around with the fairly simple code.
|
|
<p>Perhaps the most well known variation was called DOCTOR. This was made to respond like a<a href="https://en.wikipedia.org/wiki/Person-centered_therapy" title="about" target="_blank"> Rogerian psychotherapis</a>t. In this instance, the therapist "reflects" on questions by turning the questions back at the patient.</p>
|
|
|
|
<p>ELIZA was one of the first chatterbots (later clipped to chatbot). It was also an early test case for the Turing Test, a test of a machine's ability to exhibit intelligent behavior equivalent to, or indistinguishable from, that of a human. By today's standards ELIZA fails very quickly if you ask it a few complex questions.
|
|
</p>
|
|
<p><center><img src="images/sexting.jpg" width="300" height="205" alt="classic"/></center></p>
|
|
<p>That said, ELIZA delighted my students, and those who were in my little programming club at that time were also delighted to make their own versions by revising and adding to the code and scripts.</p>
|
|
<p>One particularly memorable moment was when a student asked "What happens if someone types in a curse word? "<br>
|
|
I said, "She will respond based on some word you use, but she won't know those kinds of words."<br>
|
|
They tried it out. Someone would tell ELIZA to do something obscene and she might answer "We were discussing you, not me," which is actually pretty clever and funny - by accident.<br>
|
|
"Can we fix that?" they asked.<br>
|
|
"Sure. But you'll need to type in every possible curse word so that she knows what to respond to."<br>
|
|
"We can do that?" they asked rather incredulously.<br>
|
|
"You would have to if you want her to really respond logically, " I concluded. They were delighted and set to work immediately. Luckily, I never received any parent phone calls about it. Our little secret.
|
|
<p><center><img src="images/sheldon radio shack.jpg" width="300" height="168" alt=""/> </center></p>
|
|
<p>The version of ELIZA below is a more recent javascript incarnation to which I have made some cosmetic and scripresponset changes. She is still a baby chatbot, but she has had a 2018 resurgence of interest because she was featured in an episode of the TV show<em> Young Sheldon</em>. (The episode, "A Computer, a Plastic Pony, and a Case of Beer," may still be available at<a href="http://www.cbs.com/shows/young-sheldon/video/S_ft1wDeyvydHoQMizE7iablVG6DDoe6/young-sheldon-a-computer-a-plastic-pony-and-a-case-of-beer/" title="CBS" target="_blank"> www.cbs.com</a>) Sheldon and his family become quite enamored by ELIZA, though the precocious Sheldon quickly realizes it is a limited program.
|
|
<p>Give ELIZA a try. You can sit on your own couch and pretend it is a therapist's couch. And, as with Siri, Alexa and other operating system disembodied voices, feel free to conjure up your own idea of what ELIZA looks like. </p>
|
|
<br>
|
|
<br><br>
|
|
|
|
<br><center><img class="size-full aligncenter" src="https://cdn-images-1.medium.com/max/1600/1*QkuCSWmttLPT_5-2YyqklQ.jpeg" width="800" /></center>
|
|
<br>
|
|
<br>
|
|
|
|
<p align="center">This javascript version of ELIZA was originally written by Michael Wallace and enhanced by George Dunlop.</p>
|
|
</BODY></HTML>
|