|
1 <?php |
|
2 |
|
3 /** |
|
4 * Implementation of ELIZA in PHP. Ported from Javascript by Dan Fuhry |
|
5 * Chat Bot by George Dunlop, www.peccavi.com |
|
6 * May be used/modified if credit line is retained |
|
7 * @author George Dunlop <http://www.peccavi.com/> |
|
8 * @author Dan Fuhry <dan@enanocms.org> |
|
9 * @copyright (c) 1997-2008 George Dunlop. All rights reserved, portions copyright (C) 2008 Dan Fuhry. |
|
10 */ |
|
11 |
|
12 class Psychotherapist |
|
13 { |
|
14 private $maxKey = 36; |
|
15 private $keyNotFound = 0; |
|
16 private $keyword = array(); |
|
17 private $maxresponses = 116; |
|
18 private $response = array(); |
|
19 |
|
20 private $maxConj = 19; |
|
21 private $max2ndConj = 7; |
|
22 |
|
23 private $conj1 = Array(); |
|
24 private $conj2 = Array(); |
|
25 private $conj3 = Array(); |
|
26 private $conj4 = Array(); |
|
27 |
|
28 private $punct = Array(".", ",", "!", "?", ":", ";", "&", '"', "@", "#", "(", ")" ); |
|
29 |
|
30 /** |
|
31 * Constructor. |
|
32 */ |
|
33 |
|
34 public function __construct() |
|
35 { |
|
36 $this->keyNotFound = $this->maxKey - 1; |
|
37 $this->keyword = $this->create_array($this->maxKey); |
|
38 $this->response = $this->create_array($this->maxresponses); |
|
39 $this->conj1 = $this->create_array($this->maxConj); |
|
40 $this->conj2 = $this->create_array($this->maxConj); |
|
41 $this->conj3 = $this->create_array($this->max2ndConj); |
|
42 $this->conj4 = $this->create_array($this->max2ndConj); |
|
43 |
|
44 $this->table_setup(); |
|
45 } |
|
46 |
|
47 /** |
|
48 * Replacement for str_replace that provides more options. |
|
49 * if type == 0 straight string replacement |
|
50 * if type == 1 assumes padded strings and replaces whole words only |
|
51 * if type == 2 non case sensitive assumes padded strings to compare whole word only |
|
52 * if type == 3 non case sensitive straight string replacement |
|
53 * @param string Haystack |
|
54 * @param string Needle |
|
55 * @param string Replacement |
|
56 * @param int Mode - defaults to 0 |
|
57 */ |
|
58 |
|
59 private function replaceStr($strng, $substr1, $substr2, $type = 0) |
|
60 { |
|
61 if ( $type == 0 ) |
|
62 { |
|
63 return str_replace($substr1, $substr2, $strng); |
|
64 } |
|
65 else if ( $type == 1 ) |
|
66 { |
|
67 return str_replace(" $substr1 ", " $substr2 ", $strng); |
|
68 } |
|
69 else if ( $type == 2 || $type == 3 ) |
|
70 { |
|
71 if ( $type == 2 ) |
|
72 { |
|
73 $substr1 = " $substr1 "; |
|
74 $substr2 = " $substr2 "; |
|
75 } |
|
76 return preg_replace('/' . preg_quote($substr1) . '/i', $substr2, $strng); |
|
77 } |
|
78 else |
|
79 { |
|
80 throw new Exception("Invalid parameter"); |
|
81 } |
|
82 } |
|
83 |
|
84 /** |
|
85 * Function to pad a string. head, tail & punctuation |
|
86 * @param string |
|
87 * @return string |
|
88 */ |
|
89 |
|
90 private function padString($strng) |
|
91 { |
|
92 $punct =& $this->punct; |
|
93 |
|
94 $aString = " " . $strng . " "; |
|
95 for ( $i = 0; $i < count($punct); $i++ ) |
|
96 { |
|
97 $aString = $this->replaceStr( $aString, $punct[$i], " " . $punct[$i] . " ", 0 ); |
|
98 } |
|
99 return $aString; |
|
100 } |
|
101 |
|
102 /** |
|
103 * Function to strip padding |
|
104 */ |
|
105 |
|
106 private function unpadString($strng) |
|
107 { |
|
108 $punct =& $this->punct; |
|
109 |
|
110 $aString = $strng; |
|
111 $aString = $this->replaceStr( $aString, " ", " ", 0 ); // compress spaces |
|
112 |
|
113 $aString = trim($aString, ' '); |
|
114 |
|
115 for ( $i = 0; $i < count($punct); $i++ ) |
|
116 { |
|
117 $aString = $this->replaceStr( $aString, " " . $punct[$i], $punct[$i], 0 ); |
|
118 } |
|
119 return $aString; |
|
120 } |
|
121 |
|
122 /** |
|
123 * Dress Input formatting i.e leading & trailing spaces and tail punctuation |
|
124 * @param string |
|
125 * @return string |
|
126 */ |
|
127 |
|
128 function strTrim($strng) |
|
129 { |
|
130 static $ht = 0; |
|
131 |
|
132 if ( $ht == 0 ) |
|
133 { |
|
134 $loc = 0; |
|
135 } // head clip |
|
136 else |
|
137 { |
|
138 $loc = strlen($strng) - 1; |
|
139 } // tail clip ht = 1 |
|
140 if ( substr($strng, $loc, 1) == " " ) |
|
141 { |
|
142 $aString = substr($strng, - ( $ht - 1 ), strlen($strng) - $ht); |
|
143 $aString = $this->strTrim($aString); |
|
144 } |
|
145 else |
|
146 { |
|
147 $flg = false; |
|
148 for ( $i = 0; $i <= 5; $i++ ) |
|
149 { |
|
150 $flg = $flg || ( substr($strng, $loc, 1) == $this->punct[$i]); |
|
151 } |
|
152 if ( $flg ) |
|
153 { |
|
154 $aString = substr($strng, - ( $ht - 1 ), strlen($strng) - $ht); |
|
155 } |
|
156 else |
|
157 { |
|
158 $aString = $strng; |
|
159 } |
|
160 if ( $aString != $strng ) |
|
161 { |
|
162 $aString = $this->strTrim($aString); |
|
163 } |
|
164 } |
|
165 if ( $ht == 0 ) |
|
166 { |
|
167 $ht = 1; |
|
168 $aString = $this->strTrim($aString); |
|
169 } |
|
170 else |
|
171 { |
|
172 $ht = 0; |
|
173 } |
|
174 return $aString; |
|
175 } |
|
176 |
|
177 /** |
|
178 * adjust pronouns and verbs & such |
|
179 * @param string |
|
180 * @return string |
|
181 */ |
|
182 |
|
183 private function conjugate($sStrg) |
|
184 { |
|
185 $sString = $sStrg; |
|
186 for ( $i = 0; $i < $this->maxConj; $i++ ) |
|
187 { // decompose |
|
188 $sString = $this->replaceStr( $sString, $this->conj1[$i], "#@&" . $i, 2 ); |
|
189 } |
|
190 for( $i = 0; $i < $this->maxConj; $i++ ) |
|
191 { // recompose |
|
192 $sString = $this->replaceStr( $sString, "#@&" . $i, $this->conj2[$i], 2 ); |
|
193 } |
|
194 // post process the resulting string |
|
195 for( $i = 0; $i < $this->max2ndConj; $i++ ) |
|
196 { // decompose |
|
197 $sString = $this->replaceStr( $sString, $this->conj3[$i], "#@&" . $i, 2 ); |
|
198 } |
|
199 for( $i = 0; $i < $this->max2ndConj; $i++ ) |
|
200 { // recompose |
|
201 $sString = $this->replaceStr( $sString, "#@&" . $i, $this->conj4[$i], 2 ); |
|
202 } |
|
203 return $sString; |
|
204 } |
|
205 |
|
206 /** |
|
207 * Build our response string |
|
208 * get a random choice of response based on the key |
|
209 * Then structure the response |
|
210 * @param string |
|
211 * @param int Key index |
|
212 * @return string |
|
213 */ |
|
214 |
|
215 function phrase( $sString, $keyidx ) |
|
216 { |
|
217 $idxmin = $this->keyword[$keyidx]->idx; |
|
218 $idrange = $this->keyword[$keyidx]->end - $idxmin + 1; |
|
219 while ( $pass < 5 ) |
|
220 { |
|
221 $choice = $this->keyword[$keyidx]->idx + mt_rand(0, $idrange); |
|
222 if ( $choice == $this->keyword[$keyidx]->last ) |
|
223 { |
|
224 $pass++; |
|
225 continue; |
|
226 } |
|
227 break; |
|
228 } |
|
229 $this->keyword[$keyidx]->last = $choice; |
|
230 $rTemp = $this->response[$choice]; |
|
231 $tempt = substr($rTemp, strlen($rTemp) - 1, 1); |
|
232 if ( ( $tempt == "*" ) || ( $tempt == "@" ) ) |
|
233 { |
|
234 $sTemp = $this->padString($sString); |
|
235 $wTemp = strtoupper($sTemp); |
|
236 $strpstr = intval(strpos($wTemp, " {$this->keyword[$keyidx]->key} ")); |
|
237 |
|
238 $strpstr += strlen($this->keyword[$keyidx]->key) + 1; |
|
239 $thisstr = $this->conjugate( substr($sTemp, $strpstr, strlen($sTemp)) ); |
|
240 $thisstr = $this->strTrim( $this->unpadString($thisstr) ); |
|
241 if( $tempt == "*" ) |
|
242 { |
|
243 $sTemp = $this->replaceStr( $rTemp, "<*", " " . $thisstr . "?", 0 ); |
|
244 } |
|
245 else |
|
246 { |
|
247 $sTemp = $this->replaceStr( $rTemp, "<@", " " . $thisstr . ".", 0 ); |
|
248 } |
|
249 } |
|
250 else |
|
251 { |
|
252 $sTemp = $rTemp; |
|
253 } |
|
254 return $sTemp; |
|
255 } |
|
256 |
|
257 /** |
|
258 * returns array index of first key found |
|
259 * @param string |
|
260 */ |
|
261 |
|
262 private function testkey($wString) |
|
263 { |
|
264 for ( $keyid = 0; $keyid < count($this->keyword); $keyid++ ) |
|
265 { |
|
266 if ( strpos($wString, " {$this->keyword[$keyid]->key} ") !== false ) |
|
267 { |
|
268 return $keyid; |
|
269 } |
|
270 } |
|
271 return false; |
|
272 } |
|
273 |
|
274 /** |
|
275 * |
|
276 */ |
|
277 |
|
278 private function findkey($wString) |
|
279 { |
|
280 $keyid = $this->testkey($wString); |
|
281 if( !$keyid ) |
|
282 { |
|
283 $keyid = $this->keyNotFound; |
|
284 } |
|
285 return $keyid; |
|
286 } |
|
287 |
|
288 /** |
|
289 * Process a line from the user. |
|
290 * @param string User input |
|
291 * @return string AI output |
|
292 */ |
|
293 |
|
294 function listen($User) |
|
295 { |
|
296 static $wTopic = ""; // Last worthy responce |
|
297 static $sTopic = ""; // Last worthy responce |
|
298 static $greet = false; |
|
299 static $wPrevious = ""; // so we can check for repeats |
|
300 |
|
301 $sInput = $User; |
|
302 $sInput = $this->strTrim($sInput); // dress input formating |
|
303 |
|
304 if ( $sInput != "" ) |
|
305 { |
|
306 $wInput = $this->padString(strtoupper($sInput)); // Work copy |
|
307 $foundkey = $this->maxKey; // assume it's a repeat input |
|
308 if ( $wInput != $wPrevious ) |
|
309 { // check if user repeats himself |
|
310 $foundkey = $this->findkey($wInput); // look for a keyword. |
|
311 } |
|
312 if( $foundkey == $this->keyNotFound ) |
|
313 { |
|
314 if( !$greet ) |
|
315 { |
|
316 $greet = true; |
|
317 return "Don't you ever say Hello?"; |
|
318 } |
|
319 else |
|
320 { |
|
321 $wPrevious = $wInput; // save input to check repeats |
|
322 if (( strlen($sInput) < 10 ) && ( $wTopic != "" ) && ( $wTopic != $wPrevious )) |
|
323 { |
|
324 $lTopic = $this->conjugate( $sTopic ); |
|
325 $sTopic = ""; |
|
326 $wTopic = ""; |
|
327 return 'OK... "' + $lTopic + '". Tell me more.'; |
|
328 } |
|
329 else |
|
330 { |
|
331 if ( strlen($sInput) < 15 ) |
|
332 { |
|
333 return "Tell me more..."; |
|
334 } |
|
335 else |
|
336 { |
|
337 return $this->phrase( $sInput, $foundkey ); |
|
338 } |
|
339 } |
|
340 } |
|
341 } |
|
342 else |
|
343 { |
|
344 if ( strlen($sInput) > 12 ) |
|
345 { |
|
346 $sTopic = $sInput; |
|
347 $wTopic = $wInput; |
|
348 } |
|
349 $greet = true; |
|
350 $wPrevious = $wInput; // save input to check repeats |
|
351 return $this->phrase( $sInput, $foundkey ); // Get our response |
|
352 } |
|
353 } |
|
354 else |
|
355 { |
|
356 return "I can't help if you will not chat with me!"; |
|
357 } |
|
358 } |
|
359 |
|
360 /** |
|
361 * Creates an array of the specified length, and fills it with null values. |
|
362 * @param int Array size |
|
363 * @return array |
|
364 */ |
|
365 |
|
366 function create_array($len) |
|
367 { |
|
368 $ret = array(); |
|
369 for ( $i = 0; $i < $len; $i++ ) |
|
370 { |
|
371 $ret[] = null; |
|
372 } |
|
373 return $ret; |
|
374 } |
|
375 |
|
376 /** |
|
377 * Sets up the tables of phrases, etc. |
|
378 */ |
|
379 |
|
380 private function table_setup() |
|
381 { |
|
382 // build our data base here |
|
383 |
|
384 $this->conj1[0] = "are"; $this->conj2[0] = "am"; |
|
385 $this->conj1[1] = "am"; $this->conj2[1] = "are"; |
|
386 $this->conj1[2] = "were"; $this->conj2[2] = "was"; |
|
387 $this->conj1[3] = "was"; $this->conj2[3] = "were"; |
|
388 $this->conj1[4] = "I"; $this->conj2[4] = "you"; |
|
389 $this->conj1[5] = "me"; $this->conj2[5] = "you"; |
|
390 $this->conj1[6] = "you"; $this->conj2[6] = "me"; |
|
391 $this->conj1[7] = "my"; $this->conj2[7] = "your"; |
|
392 $this->conj1[8] = "your"; $this->conj2[8] = "my"; |
|
393 $this->conj1[9] = "mine"; $this->conj2[9] = "your's"; |
|
394 $this->conj1[10] = "your's"; $this->conj2[10] = "mine"; |
|
395 $this->conj1[11] = "I'm"; $this->conj2[11] = "you're"; |
|
396 $this->conj1[12] = "you're"; $this->conj2[12] = "I'm"; |
|
397 $this->conj1[13] = "I've"; $this->conj2[13] = "you've"; |
|
398 $this->conj1[14] = "you've"; $this->conj2[14] = "I've"; |
|
399 $this->conj1[15] = "I'll"; $this->conj2[15] = "you'll"; |
|
400 $this->conj1[16] = "you'll"; $this->conj2[16] = "I'll"; |
|
401 $this->conj1[17] = "myself"; $this->conj2[17] = "yourself"; |
|
402 $this->conj1[18] = "yourself"; $this->conj2[18] = "myself"; |
|
403 |
|
404 // array to post process correct our tenses of pronouns such as "I/me" |
|
405 |
|
406 $this->conj3[0] = "me am"; $this->conj4[0] = "I am"; |
|
407 $this->conj3[1] = "am me"; $this->conj4[1] = "am I"; |
|
408 $this->conj3[2] = "me can"; $this->conj4[2] = "I can"; |
|
409 $this->conj3[3] = "can me"; $this->conj4[3] = "can I"; |
|
410 $this->conj3[4] = "me have"; $this->conj4[4] = "I have"; |
|
411 $this->conj3[5] = "me will"; $this->conj4[5] = "I will"; |
|
412 $this->conj3[6] = "will me"; $this->conj4[6] = "will I"; |
|
413 |
|
414 |
|
415 // Keywords |
|
416 |
|
417 $this->keyword[ 0]=new Psychotherapist_Key( "CAN YOU", 1, 3); |
|
418 $this->keyword[ 1]=new Psychotherapist_Key( "CAN I", 4, 5); |
|
419 $this->keyword[ 2]=new Psychotherapist_Key( "YOU ARE", 6, 9); |
|
420 $this->keyword[ 3]=new Psychotherapist_Key( "YOU'RE", 6, 9); |
|
421 $this->keyword[ 4]=new Psychotherapist_Key( "I DON'T", 10, 13); |
|
422 $this->keyword[ 5]=new Psychotherapist_Key( "I FEEL", 14, 16); |
|
423 $this->keyword[ 6]=new Psychotherapist_Key( "WHY DON'T YOU", 17, 19); |
|
424 $this->keyword[ 7]=new Psychotherapist_Key( "WHY CAN'T I", 20, 21); |
|
425 $this->keyword[ 8]=new Psychotherapist_Key( "ARE YOU", 22, 24); |
|
426 $this->keyword[ 9]=new Psychotherapist_Key( "I CAN'T", 25, 27); |
|
427 $this->keyword[10]=new Psychotherapist_Key( "I AM", 28, 31); |
|
428 $this->keyword[11]=new Psychotherapist_Key( "I'M", 28, 31); |
|
429 $this->keyword[12]=new Psychotherapist_Key( "YOU", 32, 34); |
|
430 $this->keyword[13]=new Psychotherapist_Key( "I WANT", 35, 39); |
|
431 $this->keyword[14]=new Psychotherapist_Key( "WHAT", 40, 48); |
|
432 $this->keyword[15]=new Psychotherapist_Key( "HOW", 40, 48); |
|
433 $this->keyword[16]=new Psychotherapist_Key( "WHO", 40, 48); |
|
434 $this->keyword[17]=new Psychotherapist_Key( "WHERE", 40, 48); |
|
435 $this->keyword[18]=new Psychotherapist_Key( "WHEN", 40, 48); |
|
436 $this->keyword[19]=new Psychotherapist_Key( "WHY", 40, 48); |
|
437 $this->keyword[20]=new Psychotherapist_Key( "NAME", 49, 50); |
|
438 $this->keyword[21]=new Psychotherapist_Key( "CAUSE", 51, 54); |
|
439 $this->keyword[22]=new Psychotherapist_Key( "SORRY", 55, 58); |
|
440 $this->keyword[23]=new Psychotherapist_Key( "DREAM", 59, 62); |
|
441 $this->keyword[24]=new Psychotherapist_Key( "HELLO", 63, 63); |
|
442 $this->keyword[25]=new Psychotherapist_Key( "HI", 63, 63); |
|
443 $this->keyword[26]=new Psychotherapist_Key( "MAYBE", 64, 68); |
|
444 $this->keyword[27]=new Psychotherapist_Key( "NO", 69, 73); |
|
445 $this->keyword[28]=new Psychotherapist_Key( "YOUR", 74, 75); |
|
446 $this->keyword[29]=new Psychotherapist_Key( "ALWAYS", 76, 79); |
|
447 $this->keyword[30]=new Psychotherapist_Key( "THINK", 80, 82); |
|
448 $this->keyword[31]=new Psychotherapist_Key( "ALIKE", 83, 89); |
|
449 $this->keyword[32]=new Psychotherapist_Key( "YES", 90, 92); |
|
450 $this->keyword[33]=new Psychotherapist_Key( "FRIEND", 93, 98); |
|
451 $this->keyword[34]=new Psychotherapist_Key( "COMPUTER", 99, 105); |
|
452 $this->keyword[35]=new Psychotherapist_Key( "NO KEY FOUND", 106, 112); |
|
453 $this->keyword[36]=new Psychotherapist_Key( "REPEAT INPUT", 113, 116); |
|
454 |
|
455 |
|
456 $this->response[ 0]="ELIZA - PHP version ported from Javascript (George Dunlop) code by Dan Fuhry"; |
|
457 $this->response[ 1]="Don't you believe that I can<*"; |
|
458 $this->response[ 2]="Perhaps you would like to be able to<*"; |
|
459 $this->response[ 3]="You want me to be able to<*"; |
|
460 $this->response[ 4]="Perhaps you don't want to<*"; |
|
461 $this->response[ 5]="Do you want to be able to<*"; |
|
462 $this->response[ 6]="What makes you think I am<*"; |
|
463 $this->response[ 7]="Does it please you to believe I am<*"; |
|
464 $this->response[ 8]="Perhaps you would like to be<*"; |
|
465 $this->response[ 9]="Do you sometimes wish you were<*"; |
|
466 $this->response[ 10]="Don't you really<*"; |
|
467 $this->response[ 11]="Why don't you<*"; |
|
468 $this->response[ 12]="Do you wish to be able to<*"; |
|
469 $this->response[ 13]="Does that trouble you?"; |
|
470 $this->response[ 14]="Tell me more about such feelings."; |
|
471 $this->response[ 15]="Do you often feel<*"; |
|
472 $this->response[ 16]="Do you enjoy feeling<*"; |
|
473 $this->response[ 17]="Do you really believe I don't<*"; |
|
474 $this->response[ 18]="Perhaps in good time I will<@"; |
|
475 $this->response[ 19]="Do you want me to<*"; |
|
476 $this->response[ 20]="Do you think you should be able to<*"; |
|
477 $this->response[ 21]="Why can't you<*"; |
|
478 $this->response[ 22]="Why are you interested in whether or not I am<*"; |
|
479 $this->response[ 23]="Would you prefer if I were not<*"; |
|
480 $this->response[ 24]="Perhaps in your fantasies I am<*"; |
|
481 $this->response[ 25]="How do you know you can't<*"; |
|
482 $this->response[ 26]="Have you tried?"; |
|
483 $this->response[ 27]="Perhaps you can now<*"; |
|
484 $this->response[ 28]="Did you come to me because you are<*"; |
|
485 $this->response[ 29]="How long have you been<*"; |
|
486 $this->response[ 30]="Do you believe it is normal to be<*"; |
|
487 $this->response[ 31]="Do you enjoy being<*"; |
|
488 $this->response[ 32]="We were discussing you, not me."; |
|
489 $this->response[ 33]="Oh... <*"; |
|
490 $this->response[ 34]="You're not really talking about me, are you?"; |
|
491 $this->response[ 35]="What would it mean to you if you got<*"; |
|
492 $this->response[ 36]="Why do you want<*"; |
|
493 $this->response[ 37]="Suppose you got<*"; |
|
494 $this->response[ 38]="What if you never got<*"; |
|
495 $this->response[ 39]="I sometimes also want<@"; |
|
496 $this->response[ 40]="Why do you ask?"; |
|
497 $this->response[ 41]="Does that question interest you?"; |
|
498 $this->response[ 42]="What answer would please you the most?"; |
|
499 $this->response[ 43]="What do you think?"; |
|
500 $this->response[ 44]="Are such questions on your mind often?"; |
|
501 $this->response[ 45]="What is it that you really want to know?"; |
|
502 $this->response[ 46]="Have you asked anyone else?"; |
|
503 $this->response[ 47]="Have you asked such questions before?"; |
|
504 $this->response[ 48]="What else comes to mind when you ask that?"; |
|
505 $this->response[ 49]="Names don't interest me."; |
|
506 $this->response[ 50]="I don't care about names, please go on."; |
|
507 $this->response[ 51]="Is that the real reason?"; |
|
508 $this->response[ 52]="Don't any other reasons come to mind?"; |
|
509 $this->response[ 53]="Does that reason explain anything else?"; |
|
510 $this->response[ 54]="What other reasons might there be?"; |
|
511 $this->response[ 55]="Please don't apologise!"; |
|
512 $this->response[ 56]="Apologies are not necessary."; |
|
513 $this->response[ 57]="What feelings do you have when you apologise?"; |
|
514 $this->response[ 58]="Don't be so defensive!"; |
|
515 $this->response[ 59]="What does that dream suggest to you?"; |
|
516 $this->response[ 60]="Do you dream often?"; |
|
517 $this->response[ 61]="What persons appear in your dreams?"; |
|
518 $this->response[ 62]="Are you disturbed by your dreams?"; |
|
519 $this->response[ 63]="How are you today.. What would you like to discuss?"; |
|
520 $this->response[ 64]="You don't seem quite certain."; |
|
521 $this->response[ 65]="Why the uncertain tone?"; |
|
522 $this->response[ 66]="Can't you be more positive?"; |
|
523 $this->response[ 67]="You aren't sure?"; |
|
524 $this->response[ 68]="Don't you know?"; |
|
525 $this->response[ 69]="Are you saying no just to be negative?"; |
|
526 $this->response[ 70]="You are being a bit negative."; |
|
527 $this->response[ 71]="Why not?"; |
|
528 $this->response[ 72]="Are you sure?"; |
|
529 $this->response[ 73]="Why no?"; |
|
530 $this->response[ 74]="Why are you concerned about my<*"; |
|
531 $this->response[ 75]="What about your own<*"; |
|
532 $this->response[ 76]="Can you think of a specific example?"; |
|
533 $this->response[ 77]="When?"; |
|
534 $this->response[ 78]="What are you thinking of?"; |
|
535 $this->response[ 79]="Really, always?"; |
|
536 $this->response[ 80]="Do you really think so?"; |
|
537 $this->response[ 81]="But you are not sure you<*"; |
|
538 $this->response[ 82]="Do you doubt you<*"; |
|
539 $this->response[ 83]="In what way?"; |
|
540 $this->response[ 84]="What resemblence do you see?"; |
|
541 $this->response[ 85]="What does the similarity suggest to you?"; |
|
542 $this->response[ 86]="What other connections do you see?"; |
|
543 $this->response[ 87]="Could there really be some connection?"; |
|
544 $this->response[ 88]="How?"; |
|
545 $this->response[ 89]="You seem quite positive."; |
|
546 $this->response[ 90]="Are you Sure?"; |
|
547 $this->response[ 91]="I see."; |
|
548 $this->response[ 92]="I understand."; |
|
549 $this->response[ 93]="Why do you bring up the topic of friends?"; |
|
550 $this->response[ 94]="Do your friends worry you?"; |
|
551 $this->response[ 95]="Do your friends pick on you?"; |
|
552 $this->response[ 96]="Are you sure you have any friends?"; |
|
553 $this->response[ 97]="Do you impose on your friends?"; |
|
554 $this->response[ 98]="Perhaps your love for friends worries you."; |
|
555 $this->response[ 99]="Do computers worry you?"; |
|
556 $this->response[100]="Are you talking about me in particular?"; |
|
557 $this->response[101]="Are you frightened by machines?"; |
|
558 $this->response[102]="Why do you mention computers?"; |
|
559 $this->response[103]="What do you think machines have to do with your problems?"; |
|
560 $this->response[104]="Don't you think computers can help people?"; |
|
561 $this->response[105]="What is it about machines that worries you?"; |
|
562 $this->response[106]="Say, do you have any psychological problems?"; |
|
563 $this->response[107]="What does that suggest to you?"; |
|
564 $this->response[108]="I see."; |
|
565 $this->response[109]="I'm not sure I understand you fully."; |
|
566 $this->response[110]="Come, come, elucidate your thoughts."; |
|
567 $this->response[111]="Can you elaborate on that?"; |
|
568 $this->response[112]="That is quite interesting."; |
|
569 $this->response[113]="Why did you repeat yourself?"; |
|
570 $this->response[114]="Do you expect a different answer by repeating yourself?"; |
|
571 $this->response[115]="Come, come, elucidate your thoughts."; |
|
572 $this->response[116]="Please don't repeat yourself!"; |
|
573 } |
|
574 |
|
575 } |
|
576 |
|
577 /** |
|
578 * Keyword class |
|
579 */ |
|
580 |
|
581 class Psychotherapist_Key |
|
582 { |
|
583 /** |
|
584 * Phrase to match |
|
585 * @var string |
|
586 */ |
|
587 |
|
588 public $key = ''; |
|
589 |
|
590 /** |
|
591 * First response to use |
|
592 * @var int |
|
593 */ |
|
594 |
|
595 public $idx = 0; |
|
596 |
|
597 /** |
|
598 * Last response to use |
|
599 * @var int |
|
600 */ |
|
601 |
|
602 public $end = 0; |
|
603 |
|
604 /** |
|
605 * Response last used time |
|
606 * @var int |
|
607 */ |
|
608 |
|
609 public $last = 0; |
|
610 |
|
611 /** |
|
612 * Constructor. |
|
613 * @param string Key |
|
614 * @param int Index |
|
615 * @param int End |
|
616 */ |
|
617 |
|
618 public function __construct($key, $idx, $end) |
|
619 { |
|
620 $this->key = $key; |
|
621 $this->idx = $idx; |
|
622 $this->end = $end; |
|
623 } |
|
624 } |
|
625 |
|
626 |