# Eliza-Go

## Author: Gary Leeson based on the work of Matthew Shiel at https://github.com/mattshiel/eliza-go

## How to Run The Chatbot

*Assumes that Git and Go are installed along with the prerequisites.*
**If not, they can be found from https://golang.org/dl/ and https://git-scm.com/downloads**

**1. Clone the Repository**
```bash
> git clone https://git.riomhaire.com/gremlin/elizaservice.git
```
**2. Change Directory to the Folder**

```bash
Open the terminal/command line and navigate into the folder 
eg. > cd elizaservice
```

**2. Compile the Chatbot**

```bash
> make
```

**3. Run the Chatbot**

```bash
To run the chatbot enter './' followed by the executable produced
For Mac/Linux:
> ./eliza-server

Alternatively:
> go run server.go
```

**4. Open the localhost**
```bash
Go to your browser and type:
> 127.0.0.1:8080
```

## Design Components

The primary design components that went into this project were as follows, a web server to serve a HTML as the root, Javascript to get the user input with ajax and finally all functionality and responses are contained in the eliza package.


## Problems and Features

To give Eliza the impression she was thinking Matthew implemented a delay to her responses, adding to this the delay will also randomise between 0.6 and 4 seconds per response. 

Eliza crafts her responses by examining the user's text input for a keyword. When the keyword is found it goes through a pre-processing procedure. This includes things like transforming all letters to lower case and trimming unnecessary whitespace. After this the word is tested against keywords in the 'responses.go' file. If a regex group is matched, the program gets the first match, the matched group then makes up a fraction of the response for added realism.
If Eliza does not find a match then there are a number of fallback default response she will chose from. All responses are chosen randomly.

A problem Matthew encountered with this method is that selecting answers from the map of responses may be slightly non-deterministic, and the map will be out of order. In Weizenbaum's original design of Eliza he used a method of decomposition where all keywords held a certain value or 'precedence number'. This weighted approach is definitely another approach I could have taken when designing my program and something I might change in the future.


## References

This implementation of Eliza gave Matthew many ideas and provided Matthew with the main method of implementing Matthew Eliza functionality https://github.com/kennysong/goeliza

I consulted both the the Golang, Bootstrap and JQuery documentation frequently over the course of my assignment.