|
|
|
from __future__ import unicode_literals
|
|
|
|
|
|
|
|
from datetime import datetime
|
|
|
|
|
|
|
|
from chatter.chatterbot.logic import LogicAdapter
|
|
|
|
|
|
|
|
|
|
|
|
class TimeLogicAdapter(LogicAdapter):
|
|
|
|
"""
|
|
|
|
The TimeLogicAdapter returns the current time.
|
|
|
|
|
|
|
|
:kwargs:
|
|
|
|
* *positive* (``list``) --
|
|
|
|
The time-related questions used to identify time questions.
|
|
|
|
Defaults to a list of English sentences.
|
|
|
|
* *negative* (``list``) --
|
|
|
|
The non-time-related questions used to identify time questions.
|
|
|
|
Defaults to a list of English sentences.
|
|
|
|
"""
|
|
|
|
|
|
|
|
def __init__(self, **kwargs):
|
|
|
|
super(TimeLogicAdapter, self).__init__(**kwargs)
|
|
|
|
from nltk import NaiveBayesClassifier
|
|
|
|
|
|
|
|
self.positive = kwargs.get('positive', [
|
|
|
|
'what time is it',
|
|
|
|
'hey what time is it',
|
|
|
|
'do you have the time',
|
|
|
|
'do you know the time',
|
|
|
|
'do you know what time it is',
|
|
|
|
'what is the time'
|
|
|
|
])
|
|
|
|
|
|
|
|
self.negative = kwargs.get('negative', [
|
|
|
|
'it is time to go to sleep',
|
|
|
|
'what is your favorite color',
|
|
|
|
'i had a great time',
|
|
|
|
'thyme is my favorite herb',
|
|
|
|
'do you have time to look at my essay',
|
|
|
|
'how do you have the time to do all this'
|
|
|
|
'what is it'
|
|
|
|
])
|
|
|
|
|
|
|
|
labeled_data = (
|
|
|
|
[(name, 0) for name in self.negative] +
|
|
|
|
[(name, 1) for name in self.positive]
|
|
|
|
)
|
|
|
|
|
|
|
|
train_set = [
|
|
|
|
(self.time_question_features(text), n) for (text, n) in labeled_data
|
|
|
|
]
|
|
|
|
|
|
|
|
self.classifier = NaiveBayesClassifier.train(train_set)
|
|
|
|
|
|
|
|
def time_question_features(self, text):
|
|
|
|
"""
|
|
|
|
Provide an analysis of significant features in the string.
|
|
|
|
"""
|
|
|
|
features = {}
|
|
|
|
|
|
|
|
# A list of all words from the known sentences
|
|
|
|
all_words = " ".join(self.positive + self.negative).split()
|
|
|
|
|
|
|
|
# A list of the first word in each of the known sentence
|
|
|
|
all_first_words = []
|
|
|
|
for sentence in self.positive + self.negative:
|
|
|
|
all_first_words.append(
|
|
|
|
sentence.split(' ', 1)[0]
|
|
|
|
)
|
|
|
|
|
|
|
|
for word in text.split():
|
|
|
|
features['first_word({})'.format(word)] = (word in all_first_words)
|
|
|
|
|
|
|
|
for word in text.split():
|
|
|
|
features['contains({})'.format(word)] = (word in all_words)
|
|
|
|
|
|
|
|
for letter in 'abcdefghijklmnopqrstuvwxyz':
|
|
|
|
features['count({})'.format(letter)] = text.lower().count(letter)
|
|
|
|
features['has({})'.format(letter)] = (letter in text.lower())
|
|
|
|
|
|
|
|
return features
|
|
|
|
|
|
|
|
def process(self, statement):
|
|
|
|
from chatter.chatterbot.conversation import Statement
|
|
|
|
|
|
|
|
now = datetime.now()
|
|
|
|
|
|
|
|
time_features = self.time_question_features(statement.text.lower())
|
|
|
|
confidence = self.classifier.classify(time_features)
|
|
|
|
response = Statement('The current time is ' + now.strftime('%I:%M %p'))
|
|
|
|
|
|
|
|
response.confidence = confidence
|
|
|
|
return response
|