ChatterBot uses Statement objects to hold information
about things that can be said. An important part of how a chat bot
selects a response is based on its ability to compare two statements
to each other. There are a number of ways to do this, and ChatterBot
comes with a handful of methods built in for you to use.

Calculates the similarity of two statements based on the Jaccard index.

The Jaccard index is composed of a numerator and denominator.
In the numerator, we count the number of items that are shared between the sets.
In the denominator, we count the total number of items across both sets.
Let’s say we define sentences to be equivalent if 50% or more of their tokens are equivalent.
Here are two sample sentences:

The young cat is hungry.
The cat is very hungry.

When we parse these sentences to remove stopwords, we end up with the following two sets:

{young, cat, hungry}
{cat, very, hungry}

In our example above, our intersection is {cat, hungry}, which has count of two.
The union of the sets is {young, cat, very, hungry}, which has a count of four.
Therefore, our Jaccard similarity index is two divided by four, or 50%.
Given our similarity threshold above, we would consider this to be a match.

Calculate the similarity of two statements.
This is based on the total maximum synset similarity between each word in each sentence.

This algorithm uses the wordnet functionality of NLTK to determine the similarity
of two statements based on the path similarity between each token of each statement.
This is essentially an evaluation of the closeness of synonyms.

You can create your own comparison function and use it as long as the function takes two statements
as parameters and returns a numeric value between 0 and 1. A 0 should represent the lowest possible
similarity and a 1 should represent the highest possible similarity.