Skip to content

Commit

Permalink
Add Django management command to train chat bot
Browse files Browse the repository at this point in the history
  • Loading branch information
gunthercox committed Nov 11, 2016
1 parent bf1fd63 commit cc5d40e
Show file tree
Hide file tree
Showing 11 changed files with 100 additions and 4 deletions.
4 changes: 3 additions & 1 deletion chatterbot/chatterbot.py
Expand Up @@ -2,7 +2,6 @@
from .adapters.logic import LogicAdapter, MultiLogicAdapter
from .adapters.input import InputAdapter
from .adapters.output import OutputAdapter
from .conversation import Statement, Response
from .utils.queues import ResponseQueue
from .utils.module_loading import import_module
import logging
Expand Down Expand Up @@ -67,6 +66,7 @@ def __init__(self, name, **kwargs):
trainer = kwargs.get('trainer', 'chatterbot.trainers.Trainer')
TrainerClass = import_module(trainer)
self.trainer = TrainerClass(self.storage, **kwargs)
self.training_data = kwargs.get('training_data')

self.logger = kwargs.get('logger', logging.getLogger(__name__))

Expand Down Expand Up @@ -228,6 +228,8 @@ def learn_response(self, statement):
"""
Learn that the statement provided is a valid response.
"""
from .conversation import Response

previous_statement = self.get_last_response_statement()

if previous_statement:
Expand Down
Empty file.
Empty file.
23 changes: 23 additions & 0 deletions chatterbot/ext/django_chatterbot/management/commands/train.py
@@ -0,0 +1,23 @@
from django.core.management.base import BaseCommand


class Command(BaseCommand):
help = 'Trains the database used by the chat bot'
can_import_settings = True

def handle(self, *args, **options):
from chatterbot import ChatBot
from chatterbot.ext.django_chatterbot import settings

chatterbot = ChatBot(**settings.CHATTERBOT)

chatterbot.train(chatterbot.training_data)

# Django 1.8 does not define SUCCESS
if hasattr(self.style, 'SUCCESS'):
style = self.style.SUCCESS
else:
style = self.style.NOTICE

training_class = chatterbot.trainer.__class__.__name__
self.stdout.write(style('ChatterBot trained using "%s"' % training_class))
13 changes: 11 additions & 2 deletions chatterbot/trainers.py
@@ -1,13 +1,11 @@
from .conversation import Statement, Response
from .corpus import Corpus
import logging


class Trainer(object):

def __init__(self, storage, **kwargs):
self.storage = storage
self.corpus = Corpus()
self.logger = logging.getLogger(__name__)

def train(self, *args, **kwargs):
Expand Down Expand Up @@ -76,9 +74,20 @@ def train(self, conversation):

class ChatterBotCorpusTrainer(Trainer):

def __init__(self, storage, **kwargs):
super(ChatterBotCorpusTrainer, self).__init__(storage, **kwargs)
from .corpus import Corpus

self.corpus = Corpus()

def train(self, *corpora):
trainer = ListTrainer(self.storage)

# Allow a list of coupora to be passed instead of arguments
if len(corpora) == 1:
if isinstance(corpora[0], list):
corpora = corpora[0]

for corpus in corpora:
corpus_data = self.corpus.load_corpus(corpus)
for data in corpus_data:
Expand Down
1 change: 1 addition & 0 deletions docs/django/index.rst
Expand Up @@ -10,6 +10,7 @@ Django applications.
:maxdepth: 2

settings
training
views

Installation
Expand Down
4 changes: 4 additions & 0 deletions docs/django/settings.rst
Expand Up @@ -12,6 +12,10 @@ You can edit the ChatterBot configuration through your Django settings.py file.
'chatterbot.adapters.logic.MathematicalEvaluation',
'chatterbot.adapters.logic.TimeLogicAdapter',
'chatterbot.adapters.logic.ClosestMatchAdapter'
],
'trainer': 'chatterbot.trainers.ChatterBotCorpusTrainer',
'training_data': [
'chatterbot.corpus.english.greetings'
]
}
Expand Down
30 changes: 30 additions & 0 deletions docs/django/training.rst
@@ -0,0 +1,30 @@
========
Training
========

Management command
==================

When using ChatterBot with Django, the training process can be
executed by running the training management command.

.. code-block:: bash
python manage.py train
Training settings
=================

You can specify any data that you want to be passed to the chat bot
trainer in the :code:`training_data` parameter in your :code:`CHATTERBOT`
Django settings.

.. code-block:: python
CHATTERBOT = {
# ...
'trainer': 'chatterbot.trainers.ChatterBotCorpusTrainer',
'training_data': [
'chatterbot.corpus.english.greetings'
]
}
6 changes: 5 additions & 1 deletion examples/django_app/example_app/settings.py
Expand Up @@ -33,7 +33,11 @@
# ChatterBot settings

CHATTERBOT = {
'name': 'Django ChatterBot Example'
'name': 'Django ChatterBot Example',
'trainer': 'chatterbot.trainers.ChatterBotCorpusTrainer',
'training_data': [
'chatterbot.corpus.english.greetings'
]
}

MIDDLEWARE_CLASSES = (
Expand Down
21 changes: 21 additions & 0 deletions examples/django_app/tests/test_commands.py
@@ -0,0 +1,21 @@
from django.core.management import call_command
from django.test import TestCase
from django.utils.six import StringIO
from chatterbot.ext.django_chatterbot.models import Statement


class TrainCommandTestCase(TestCase):

def test_command_output(self):
out = StringIO()
call_command('train', stdout=out)
self.assertIn('ChatterBot trained', out.getvalue())

def test_command_data_argument(self):
out = StringIO()
statements_before = Statement.objects.exists()
call_command('train', stdout=out)
statements_after = Statement.objects.exists()

self.assertFalse(statements_before)
self.assertTrue(statements_after)
2 changes: 2 additions & 0 deletions setup.py
Expand Up @@ -33,6 +33,8 @@
'chatterbot.ext',
'chatterbot.ext.django_chatterbot',
'chatterbot.ext.django_chatterbot.migrations',
'chatterbot.ext.django_chatterbot.management',
'chatterbot.ext.django_chatterbot.management.commands',
'chatterbot.utils'
],
package_dir={'chatterbot': 'chatterbot'},
Expand Down

0 comments on commit cc5d40e

Please sign in to comment.