diff --git a/README.md b/README.md index facbe715..7d93b376 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Bothub NLP - Natural Language Processing services -![version 2.1.1](https://img.shields.io/badge/version-2.1.1-blue.svg) [![python 3.6](https://img.shields.io/badge/python-3.6-green.svg)](https://docs.python.org/3.6/whatsnew/changelog.html) [![license AGPL-3.0](https://img.shields.io/badge/license-AGPL--3.0-red.svg)](https://github.com/udomobi/bothub-nlp/blob/master/LICENSE) +![version 2.2.0](https://img.shields.io/badge/version-2.2.0-blue.svg) [![python 3.6](https://img.shields.io/badge/python-3.6-green.svg)](https://docs.python.org/3.6/whatsnew/changelog.html) [![license AGPL-3.0](https://img.shields.io/badge/license-AGPL--3.0-red.svg)](https://github.com/udomobi/bothub-nlp/blob/master/LICENSE) Check the [main Bothub project repository](https://github.com/Ilhasoft/bothub). diff --git a/bothub-nlp-api/Pipfile b/bothub-nlp-api/Pipfile index 461fc88f..716374d5 100644 --- a/bothub-nlp-api/Pipfile +++ b/bothub-nlp-api/Pipfile @@ -10,7 +10,7 @@ lint = "flake8" [packages] tornado = "==5.1.1" raven = "*" -bothub-engine = {ref = "1.19.1", git = "https://github.com/Ilhasoft/bothub-engine"} +bothub-engine = {ref = "1.21.0", git = "https://github.com/Ilhasoft/bothub-engine"} bothub-nlp-celery = {path = "./../bothub-nlp-celery"} python-decouple = "*" bothub-nlp = {path = "./../bothub-nlp"} diff --git a/bothub-nlp-api/Pipfile.lock b/bothub-nlp-api/Pipfile.lock index 911ac0cc..f90d0ac9 100644 --- a/bothub-nlp-api/Pipfile.lock +++ b/bothub-nlp-api/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "0f6877c58f6cbf823bb2d9a3ba8900d085f4b7e7fc010b9bda0c7a1fb85833f4" + "sha256": "c55b973b27f87b7e210ff575190d2e80b38c40ae09105dd068030736558cfdbc" }, "pipfile-spec": 6, "requires": { @@ -18,7 +18,7 @@ "default": { "bothub-engine": { "git": "https://github.com/Ilhasoft/bothub-engine", - "ref": "d3aa0888415f680d7726904b19dbae8a3f1569ab" + "ref": "ae6484f9afcc6de6fc6aa74bec050dcb42596020" }, "bothub-nlp": { "path": "./../bothub-nlp" @@ -65,11 +65,11 @@ }, "flake8": { "hashes": [ - "sha256:6a35f5b8761f45c5513e3405f110a86bea57982c3b75b766ce7b65217abe1670", - "sha256:c01f8a3963b3571a8e6bd7a4063359aff90749e160778e03817cd9b71c9e07d2" + "sha256:859996073f341f2670741b51ec1e67a01da142831aa1fdc6242dbf88dffbe661", + "sha256:a796a115208f5c03b18f332f7c11729812c8c3ded6c46319c59b53efd3819da8" ], "index": "pypi", - "version": "==3.6.0" + "version": "==3.7.7" }, "mccabe": { "hashes": [ @@ -80,39 +80,37 @@ }, "psycopg2-binary": { "hashes": [ - "sha256:19a2d1f3567b30f6c2bb3baea23f74f69d51f0c06c2e2082d0d9c28b0733a4c2", - "sha256:2b69cf4b0fa2716fd977aa4e1fd39af6110eb47b2bb30b4e5a469d8fbecfc102", - "sha256:2e952fa17ba48cbc2dc063ddeec37d7dc4ea0ef7db0ac1eda8906365a8543f31", - "sha256:348b49dd737ff74cfb5e663e18cb069b44c64f77ec0523b5794efafbfa7df0b8", - "sha256:3d72a5fdc5f00ca85160915eb9a973cf9a0ab8148f6eda40708bf672c55ac1d1", - "sha256:4957452f7868f43f32c090dadb4188e9c74a4687323c87a882e943c2bd4780c3", - "sha256:5138cec2ee1e53a671e11cc519505eb08aaaaf390c508f25b09605763d48de4b", - "sha256:587098ca4fc46c95736459d171102336af12f0d415b3b865972a79c03f06259f", - "sha256:5b79368bcdb1da4a05f931b62760bea0955ee2c81531d8e84625df2defd3f709", - "sha256:5cf43807392247d9bc99737160da32d3fa619e0bfd85ba24d1c78db205f472a4", - "sha256:676d1a80b1eebc0cacae8dd09b2fde24213173bf65650d22b038c5ed4039f392", - "sha256:6b0211ecda389101a7d1d3df2eba0cf7ffbdd2480ca6f1d2257c7bd739e84110", - "sha256:79cde4660de6f0bb523c229763bd8ad9a93ac6760b72c369cf1213955c430934", - "sha256:7aba9786ac32c2a6d5fb446002ed936b47d5e1f10c466ef7e48f66eb9f9ebe3b", - "sha256:7c8159352244e11bdd422226aa17651110b600d175220c451a9acf795e7414e0", - "sha256:945f2eedf4fc6b2432697eb90bb98cc467de5147869e57405bfc31fa0b824741", - "sha256:96b4e902cde37a7fc6ab306b3ac089a3949e6ce3d824eeca5b19dc0bedb9f6e2", - "sha256:9a7bccb1212e63f309eb9fab47b6eaef796f59850f169a25695b248ca1bf681b", - "sha256:a3bfcac727538ec11af304b5eccadbac952d4cca1a551a29b8fe554e3ad535dc", - "sha256:b19e9f1b85c5d6136f5a0549abdc55dcbd63aba18b4f10d0d063eb65ef2c68b4", - "sha256:b664011bb14ca1f2287c17185e222f2098f7b4c857961dbcf9badb28786dbbf4", - "sha256:bde7959ef012b628868d69c474ec4920252656d0800835ed999ba5e4f57e3e2e", - "sha256:cb095a0657d792c8de9f7c9a0452385a309dfb1bbbb3357d6b1e216353ade6ca", - "sha256:d16d42a1b9772152c1fe606f679b2316551f7e1a1ce273e7f808e82a136cdb3d", - "sha256:d444b1545430ffc1e7a24ce5a9be122ccd3b135a7b7e695c5862c5aff0b11159", - "sha256:d93ccc7bf409ec0a23f2ac70977507e0b8a8d8c54e5ee46109af2f0ec9e411f3", - "sha256:df6444f952ca849016902662e1a47abf4fa0678d75f92fd9dd27f20525f809cd", - "sha256:e63850d8c52ba2b502662bf3c02603175c2397a9acc756090e444ce49508d41e", - "sha256:ec43358c105794bc2b6fd34c68d27f92bea7102393c01889e93f4b6a70975728", - "sha256:f4c6926d9c03dadce7a3b378b40d2fea912c1344ef9b29869f984fb3d2a2420b" + "sha256:007ca0df127b1862fc010125bc4100b7a630efc6841047bd11afceadb4754611", + "sha256:03c49e02adf0b4d68f422fdbd98f7a7c547beb27e99a75ed02298f85cb48406a", + "sha256:0a1232cdd314e08848825edda06600455ad2a7adaa463ebfb12ece2d09f3370e", + "sha256:131c80d0958c89273d9720b9adf9df1d7600bb3120e16019a7389ab15b079af5", + "sha256:2de34cc3b775724623f86617d2601308083176a495f5b2efc2bbb0da154f483a", + "sha256:2eddc31500f73544a2a54123d4c4b249c3c711d31e64deddb0890982ea37397a", + "sha256:484f6c62bdc166ee0e5be3aa831120423bf399786d1f3b0304526c86180fbc0b", + "sha256:4c2d9369ed40b4a44a8ccd6bc3a7db6272b8314812d2d1091f95c4c836d92e06", + "sha256:70f570b5fa44413b9f30dbc053d17ef3ce6a4100147a10822f8662e58d473656", + "sha256:7a2b5b095f3bd733aab101c89c0e1a3f0dfb4ebdc26f6374805c086ffe29d5b2", + "sha256:804914a669186e2843c1f7fbe12b55aad1b36d40a28274abe6027deffad9433d", + "sha256:8520c03172da18345d012949a53617a963e0191ccb3c666f23276d5326af27b5", + "sha256:90da901fc33ea393fc644607e4a3916b509387e9339ec6ebc7bfded45b7a0ae9", + "sha256:a582416ad123291a82c300d1d872bdc4136d69ad0b41d57dc5ca3df7ef8e3088", + "sha256:ac8c5e20309f4989c296d62cac20ee456b69c41fd1bc03829e27de23b6fa9dd0", + "sha256:b2cf82f55a619879f8557fdaae5cec7a294fac815e0087c4f67026fdf5259844", + "sha256:b59d6f8cfca2983d8fdbe457bf95d2192f7b7efdb2b483bf5fa4e8981b04e8b2", + "sha256:be08168197021d669b9964bd87628fa88f910b1be31e7010901070f2540c05fd", + "sha256:be0f952f1c365061041bad16e27e224e29615d4eb1fb5b7e7760a1d3d12b90b6", + "sha256:c1c9a33e46d7c12b9c96cf2d4349d783e3127163fd96254dcd44663cf0a1d438", + "sha256:d18c89957ac57dd2a2724ecfe9a759912d776f96ecabba23acb9ecbf5c731035", + "sha256:d7e7b0ff21f39433c50397e60bf0995d078802c591ca3b8d99857ea18a7496ee", + "sha256:da0929b2bf0d1f365345e5eb940d8713c1d516312e010135b14402e2a3d2404d", + "sha256:de24a4962e361c512d3e528ded6c7480eab24c655b8ca1f0b761d3b3650d2f07", + "sha256:e45f93ff3f7dae2202248cf413a87aeb330821bf76998b3cf374eda2fc893dd7", + "sha256:f046aeae1f7a845041b8661bb7a52449202b6c5d3fb59eb4724e7ca088811904", + "sha256:f1dc2b7b2748084b890f5d05b65a47cd03188824890e9a60818721fd492249fb", + "sha256:fcbe7cf3a786572b73d2cd5f34ed452a5f5fac47c9c9d1e0642c457a148f9f88" ], "index": "pypi", - "version": "==2.7.7" + "version": "==2.8.2" }, "pycodestyle": { "hashes": [ @@ -123,18 +121,18 @@ }, "pyflakes": { "hashes": [ - "sha256:5e8c00e30c464c99e0b501dc160b13a14af7f27d4dffb529c556e30a159e231d", - "sha256:f277f9ca3e55de669fba45b7393a1449009cff5a37d1af10ebb76c52765269cd" + "sha256:17dbeb2e3f4d772725c777fabc446d5634d1038f234e77343108ce445ea69ce0", + "sha256:d976835886f8c5b31d47970ed689944a0262b5f3afa00a5a7b4dc81e5449f8a2" ], - "version": "==2.1.0" + "version": "==2.1.1" }, "redis": { "hashes": [ - "sha256:2100750629beff143b6a200a2ea8e719fcf26420adabb81402895e144c5083cf", - "sha256:8e0bdd2de02e829b6225b25646f9fb9daffea99a252610d040409a6738541f0a" + "sha256:6946b5dca72e86103edc8033019cc3814c031232d339d5f4533b02ea85685175", + "sha256:8ca418d2ddca1b1a850afa1680a7d2fd1f3322739271de4b704e0d4668449273" ], "index": "pypi", - "version": "==3.0.1" + "version": "==3.2.1" } } } diff --git a/bothub-nlp-api/bothub_nlp_api/app.py b/bothub-nlp-api/bothub_nlp_api/app.py index 0dccd2c4..9fba5dac 100644 --- a/bothub-nlp-api/bothub_nlp_api/app.py +++ b/bothub-nlp-api/bothub_nlp_api/app.py @@ -11,6 +11,7 @@ from .handlers.parse import ParseHandler from .handlers.train import TrainHandler from .handlers.info import InfoHandler +from .handlers.evaluate import EvaluateHandler app = None @@ -24,6 +25,7 @@ def make_app(): url('/parse/', ParseHandler), url('/train/', TrainHandler), url('/info/', InfoHandler), + url('/evaluate/', EvaluateHandler) ]) diff --git a/bothub-nlp-api/bothub_nlp_api/handlers/evaluate.py b/bothub-nlp-api/bothub_nlp_api/handlers/evaluate.py new file mode 100644 index 00000000..ce8e7f4d --- /dev/null +++ b/bothub-nlp-api/bothub_nlp_api/handlers/evaluate.py @@ -0,0 +1,73 @@ +import tornado.web +from tornado import gen + +from bothub_nlp_celery.actions import ACTION_EVALUATE, queue_name +from bothub_nlp_celery.tasks import TASK_NLU_EVALUATE_UPDATE +from bothub_nlp_celery.app import celery_app +from bothub_nlp import settings as bothub_nlp_settings + +from . import ApiHandler +from ..utils import ValidationError +from ..utils import authorization_required +from ..utils import AuthorizationIsRequired +from ..utils import NEXT_LANGS + + +EVALUATE_STATUS_EVALUATED = 'evaluated' +EVALUATE_STATUS_FAILED = 'failed' + + +class EvaluateHandler(ApiHandler): + @tornado.web.asynchronous + @gen.engine + @authorization_required + def post(self): + language = self.get_argument('language', default=None) + + if language and ( + language not in bothub_nlp_settings.SUPPORTED_LANGUAGES.keys() and + language not in NEXT_LANGS.keys() + ): + raise ValidationError( + 'Language \'{}\' not supported by now.'.format(language), + field='language') + + repository_authorization = self.repository_authorization() + if not repository_authorization: + raise AuthorizationIsRequired() + + repository = repository_authorization.repository + update = repository.last_trained_update(language) + + if not update: + raise ValidationError( + 'This repository has never been trained', + field='language') + + try: + evaluate_task = celery_app.send_task( + TASK_NLU_EVALUATE_UPDATE, + args=[ + update.id, + repository_authorization.user.id, + ], + queue=queue_name(ACTION_EVALUATE, update.language)) + evaluate_task.wait() + evaluate = evaluate_task.result + evaluate_report = { + 'language': language, + 'status': EVALUATE_STATUS_EVALUATED, + 'update_id': update.id, + 'evaluate_id': evaluate.get('id'), + 'evaluate_version': evaluate.get('version'), + } + except Exception as e: + from .. import logger + logger.exception(e) + + evaluate_report = { + 'status': EVALUATE_STATUS_FAILED, + 'error': str(e), + } + + self.finish(evaluate_report) diff --git a/bothub-nlp-celery/bothub_nlp_celery/actions.py b/bothub-nlp-celery/bothub_nlp_celery/actions.py index 268ffbdf..37b04c51 100644 --- a/bothub-nlp-celery/bothub_nlp_celery/actions.py +++ b/bothub-nlp-celery/bothub_nlp_celery/actions.py @@ -3,6 +3,7 @@ ACTION_PARSE = 'parse' ACTION_TRAIN = 'train' +ACTION_EVALUATE = 'evaluate' def queue_name(action, language): diff --git a/bothub-nlp-celery/bothub_nlp_celery/app.py b/bothub-nlp-celery/bothub_nlp_celery/app.py index f7b186be..a34dcf95 100644 --- a/bothub-nlp-celery/bothub_nlp_celery/app.py +++ b/bothub-nlp-celery/bothub_nlp_celery/app.py @@ -4,6 +4,7 @@ from .actions import ACTION_PARSE from .actions import ACTION_TRAIN +from .actions import ACTION_EVALUATE from .actions import queue_name from . import settings @@ -19,6 +20,9 @@ ] + [ queue_name(ACTION_TRAIN, lang) for lang in bothub_nlp_settings.SUPPORTED_LANGUAGES.keys() +] + [ + queue_name(ACTION_EVALUATE, lang) + for lang in bothub_nlp_settings.SUPPORTED_LANGUAGES.keys() ]) celery_app.conf.task_queues = [ Queue(queue) diff --git a/bothub-nlp-celery/bothub_nlp_celery/tasks.py b/bothub-nlp-celery/bothub_nlp_celery/tasks.py index 5975c4e0..9c1e298b 100644 --- a/bothub-nlp-celery/bothub_nlp_celery/tasks.py +++ b/bothub-nlp-celery/bothub_nlp_celery/tasks.py @@ -1,2 +1,3 @@ TASK_NLU_PARSE_TEXT = 'nlu-parse-text' TASK_NLU_TRAIN_UPDATE = 'nlu-train-update' +TASK_NLU_EVALUATE_UPDATE = 'nlu-evaluate-update' diff --git a/bothub-nlp-nlu-worker-on-demand/Pipfile b/bothub-nlp-nlu-worker-on-demand/Pipfile index 4c197000..d9484cea 100644 --- a/bothub-nlp-nlu-worker-on-demand/Pipfile +++ b/bothub-nlp-nlu-worker-on-demand/Pipfile @@ -13,7 +13,7 @@ celery-worker-on-demand = {ref = "0.2.0", git = "https://github.com/Ilhasoft/cel bothub-nlp-celery = {path = "./../bothub-nlp-celery"} docker = "==3.7.0" bothub-nlp = {path = "./../bothub-nlp"} -bothub-engine = {ref = "1.19.1", git = "https://github.com/Ilhasoft/bothub-engine"} +bothub-engine = {ref = "1.21.0", git = "https://github.com/Ilhasoft/bothub-engine"} [dev-packages] redis = "*" diff --git a/bothub-nlp-nlu-worker-on-demand/Pipfile.lock b/bothub-nlp-nlu-worker-on-demand/Pipfile.lock index aba8ba70..e3688380 100644 --- a/bothub-nlp-nlu-worker-on-demand/Pipfile.lock +++ b/bothub-nlp-nlu-worker-on-demand/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "d15b767a66963cfa4624355a3c4c81abe930a01aa0846ff7aa8dcdf9f11721ea" + "sha256": "a15e7cca1173ba15165f693688a78e24f8caffeaa74ab36a8bd75068ec57066b" }, "pipfile-spec": 6, "requires": { @@ -18,7 +18,7 @@ "default": { "bothub-engine": { "git": "https://github.com/Ilhasoft/bothub-engine", - "ref": "d3aa0888415f680d7726904b19dbae8a3f1569ab" + "ref": "ae6484f9afcc6de6fc6aa74bec050dcb42596020" }, "bothub-nlp": { "path": "./../bothub-nlp" @@ -32,10 +32,10 @@ }, "certifi": { "hashes": [ - "sha256:47f9c83ef4c0c621eaef743f133f09fa8a74a9b75f037e8624f83bd1b6626cb7", - "sha256:993f830721089fef441cdfeb4b2c8c9df86f0c63239f06bd025a76a7daddb033" + "sha256:59b7658e26ca9c7339e00f8f4636cdfe59d34fa37b9b04f6f9e9926b3cece1a5", + "sha256:b26104d6835d1f5e49452a26eb2ff87fe7090b89dfcaee5ea2212697e1e1d7ae" ], - "version": "==2018.11.29" + "version": "==2019.3.9" }, "chardet": { "hashes": [ @@ -75,10 +75,10 @@ }, "requests": { "hashes": [ - "sha256:502a824f31acdacb3a35b6690b5fbf0bc41d63a24a45c4004352b0242707598e", - "sha256:7bf2a778576d825600030a110f3c0e3e8edc51dfaafe1c146e39a2027784957b" + "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4", + "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31" ], - "version": "==2.21.0" + "version": "==2.22.0" }, "six": { "hashes": [ @@ -89,17 +89,17 @@ }, "urllib3": { "hashes": [ - "sha256:61bf29cada3fc2fbefad4fdf059ea4bd1b4a86d2b6d15e1c7c0b582b9752fe39", - "sha256:de9529817c93f27c8ccbfead6985011db27bd0ddfcdb2d86f3f663385c6a9c22" + "sha256:b246607a25ac80bedac05c6f282e3cdaf3afb65420fd024ac94435cabe6e18d1", + "sha256:dbe59173209418ae49d485b87d1681aefa36252ee85884c31346debd19463232" ], - "version": "==1.24.1" + "version": "==1.25.3" }, "websocket-client": { "hashes": [ - "sha256:8c8bf2d4f800c3ed952df206b18c28f7070d9e3dcbd6ca6291127574f57ee786", - "sha256:e51562c91ddb8148e791f0155fdb01325d99bb52c4cdbb291aee7a3563fd0849" + "sha256:1151d5fb3a62dc129164292e1227655e4bbc5dd5340a5165dfae61128ec50aa9", + "sha256:1fd5520878b68b84b5748bb30e592b10d0a91529d5383f74f4964e72b297fd3a" ], - "version": "==0.54.0" + "version": "==0.56.0" } }, "develop": { @@ -112,11 +112,11 @@ }, "flake8": { "hashes": [ - "sha256:c3ba1e130c813191db95c431a18cb4d20a468e98af7a77e2181b68574481ad36", - "sha256:fd9ddf503110bf3d8b1d270e8c673aab29ccb3dd6abf29bae1f54e5116ab4a91" + "sha256:859996073f341f2670741b51ec1e67a01da142831aa1fdc6242dbf88dffbe661", + "sha256:a796a115208f5c03b18f332f7c11729812c8c3ded6c46319c59b53efd3819da8" ], "index": "pypi", - "version": "==3.7.5" + "version": "==3.7.7" }, "mccabe": { "hashes": [ @@ -134,18 +134,18 @@ }, "pyflakes": { "hashes": [ - "sha256:5e8c00e30c464c99e0b501dc160b13a14af7f27d4dffb529c556e30a159e231d", - "sha256:f277f9ca3e55de669fba45b7393a1449009cff5a37d1af10ebb76c52765269cd" + "sha256:17dbeb2e3f4d772725c777fabc446d5634d1038f234e77343108ce445ea69ce0", + "sha256:d976835886f8c5b31d47970ed689944a0262b5f3afa00a5a7b4dc81e5449f8a2" ], - "version": "==2.1.0" + "version": "==2.1.1" }, "redis": { "hashes": [ - "sha256:74c892041cba46078ae1ef845241548baa3bd3634f9a6f0f952f006eb1619c71", - "sha256:7ba8612bbfd966dea8c62322543fed0095da2834dbd5a7c124afbc617a156aa7" + "sha256:6946b5dca72e86103edc8033019cc3814c031232d339d5f4533b02ea85685175", + "sha256:8ca418d2ddca1b1a850afa1680a7d2fd1f3322739271de4b704e0d4668449273" ], "index": "pypi", - "version": "==3.1.0" + "version": "==3.2.1" } } } diff --git a/bothub-nlp-nlu-worker-on-demand/bothub_nlp_nlu_worker_on_demand/__init__.py b/bothub-nlp-nlu-worker-on-demand/bothub_nlp_nlu_worker_on_demand/__init__.py index 13a4417a..272503ca 100644 --- a/bothub-nlp-nlu-worker-on-demand/bothub_nlp_nlu_worker_on_demand/__init__.py +++ b/bothub-nlp-nlu-worker-on-demand/bothub_nlp_nlu_worker_on_demand/__init__.py @@ -47,6 +47,9 @@ 'BOTHUB_NLP_CELERY_BROKER_URL', 'BOTHUB_NLP_CELERY_BACKEND_URL', 'BOTHUB_NLP_NLU_AGROUP_LANGUAGE_QUEUE', + 'BOTHUB_NLP_AWS_S3_BUCKET_NAME', + 'BOTHUB_NLP_AWS_ACCESS_KEY_ID', + 'BOTHUB_NLP_AWS_SECRET_ACCESS_KEY', ] ] diff --git a/bothub-nlp-nlu-worker/Dockerfile b/bothub-nlp-nlu-worker/Dockerfile index 95ad164e..5b22266d 100644 --- a/bothub-nlp-nlu-worker/Dockerfile +++ b/bothub-nlp-nlu-worker/Dockerfile @@ -13,11 +13,14 @@ RUN apt-get update \ && apt-get install --no-install-recommends -y ${PYTHON_BUILD_PACKAGES} git \ && add-apt-repository ppa:fkrull/deadsnakes \ && apt-get update \ - && apt-get install --no-install-recommends -y python3.6 python3.6-dev \ + && apt-get install --no-install-recommends -y python3.6 python3.6-dev python3.6-tk \ && curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py \ && python3.6 get-pip.py \ && rm get-pip.py \ - && apt-get remove -y ${PYTHON_BUILD_PACKAGES} \ + && apt-get remove -y ${PYTHON_BUILD_PACKAGES} + +RUN echo ttf-mscorefonts-installer msttcorefonts/accepted-mscorefonts-eula select true | debconf-set-selections +RUN apt-get install -y ttf-mscorefonts-installer \ && apt-get autoremove -y \ && apt-get clean -y \ && rm -rf /var/lib/apt/lists/* diff --git a/bothub-nlp-nlu-worker/Pipfile b/bothub-nlp-nlu-worker/Pipfile index 4305be12..dcc3033b 100644 --- a/bothub-nlp-nlu-worker/Pipfile +++ b/bothub-nlp-nlu-worker/Pipfile @@ -9,7 +9,7 @@ lint = "flake8" importilhaspacylangs = "sh scripts/import_ilha_spacy_langs.sh" [packages] -bothub-engine = {ref = "1.19.1", git = "https://github.com/Ilhasoft/bothub-engine"} +bothub-engine = {ref = "1.21.0", git = "https://github.com/Ilhasoft/bothub-engine"} bothub-nlp-celery = {path = "./../bothub-nlp-celery"} bothub-nlp-nlu = {path = "./../bothub-nlp-nlu"} bothub-nlp = {path = "./../bothub-nlp"} diff --git a/bothub-nlp-nlu-worker/Pipfile.lock b/bothub-nlp-nlu-worker/Pipfile.lock index 904180f3..065d707c 100644 --- a/bothub-nlp-nlu-worker/Pipfile.lock +++ b/bothub-nlp-nlu-worker/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "88f3f01346d2e6fc86ec853676d2946797dae5acd7286ce78709a08af4c7b4af" + "sha256": "eb8221facc6d6a0f32ba8549c7064f43e2231629f18f123865c1a6f22a13894b" }, "pipfile-spec": 6, "requires": { @@ -18,7 +18,7 @@ "default": { "bothub-engine": { "git": "https://github.com/Ilhasoft/bothub-engine", - "ref": "d3aa0888415f680d7726904b19dbae8a3f1569ab" + "ref": "ae6484f9afcc6de6fc6aa74bec050dcb42596020" }, "bothub-nlp": { "path": "./../bothub-nlp" @@ -84,11 +84,11 @@ }, "flake8": { "hashes": [ - "sha256:c3ba1e130c813191db95c431a18cb4d20a468e98af7a77e2181b68574481ad36", - "sha256:fd9ddf503110bf3d8b1d270e8c673aab29ccb3dd6abf29bae1f54e5116ab4a91" + "sha256:859996073f341f2670741b51ec1e67a01da142831aa1fdc6242dbf88dffbe661", + "sha256:a796a115208f5c03b18f332f7c11729812c8c3ded6c46319c59b53efd3819da8" ], "index": "pypi", - "version": "==3.7.5" + "version": "==3.7.7" }, "mccabe": { "hashes": [ @@ -106,18 +106,18 @@ }, "pyflakes": { "hashes": [ - "sha256:5e8c00e30c464c99e0b501dc160b13a14af7f27d4dffb529c556e30a159e231d", - "sha256:f277f9ca3e55de669fba45b7393a1449009cff5a37d1af10ebb76c52765269cd" + "sha256:17dbeb2e3f4d772725c777fabc446d5634d1038f234e77343108ce445ea69ce0", + "sha256:d976835886f8c5b31d47970ed689944a0262b5f3afa00a5a7b4dc81e5449f8a2" ], - "version": "==2.1.0" + "version": "==2.1.1" }, "redis": { "hashes": [ - "sha256:74c892041cba46078ae1ef845241548baa3bd3634f9a6f0f952f006eb1619c71", - "sha256:7ba8612bbfd966dea8c62322543fed0095da2834dbd5a7c124afbc617a156aa7" + "sha256:6946b5dca72e86103edc8033019cc3814c031232d339d5f4533b02ea85685175", + "sha256:8ca418d2ddca1b1a850afa1680a7d2fd1f3322739271de4b704e0d4668449273" ], "index": "pypi", - "version": "==3.1.0" + "version": "==3.2.1" } } } diff --git a/bothub-nlp-nlu-worker/bothub_nlp_nlu_worker/celery_app.py b/bothub-nlp-nlu-worker/bothub_nlp_nlu_worker/celery_app.py index 4d5c93fa..d4c6f614 100644 --- a/bothub-nlp-nlu-worker/bothub_nlp_nlu_worker/celery_app.py +++ b/bothub-nlp-nlu-worker/bothub_nlp_nlu_worker/celery_app.py @@ -1,9 +1,10 @@ from bothub.common.models import RepositoryUpdate from bothub.authentication.models import User from bothub_nlp_celery.app import celery_app -from bothub_nlp_celery.tasks import TASK_NLU_PARSE_TEXT, TASK_NLU_TRAIN_UPDATE +from bothub_nlp_celery.tasks import TASK_NLU_PARSE_TEXT, TASK_NLU_TRAIN_UPDATE, TASK_NLU_EVALUATE_UPDATE from bothub_nlp_nlu.parse import parse_text as parse_text_core from bothub_nlp_nlu.train import train_update as train_update_core +from bothub_nlp_nlu.evaluate import evaluate_update as evaluate_update_core @celery_app.task(name=TASK_NLU_PARSE_TEXT) @@ -17,3 +18,9 @@ def train_update(update_id, by_id): update = RepositoryUpdate.objects.get(id=update_id) by = User.objects.get(id=by_id) return train_update_core(update, by) + +@celery_app.task(name=TASK_NLU_EVALUATE_UPDATE) +def evaluate_update(update_id, by_id): + update = RepositoryUpdate.objects.get(id=update_id) + by = User.objects.get(id=by_id) + return evaluate_update_core(update, by) diff --git a/bothub-nlp-nlu-worker/requirements.txt b/bothub-nlp-nlu-worker/requirements.txt index 6406e8ae..5d24cf7a 100644 --- a/bothub-nlp-nlu-worker/requirements.txt +++ b/bothub-nlp-nlu-worker/requirements.txt @@ -2,6 +2,6 @@ ./../bothub-nlp ./../bothub-nlp-celery ./../bothub-nlp-nlu -git+https://github.com/Ilhasoft/bothub-engine@d3aa0888415f680d7726904b19dbae8a3f1569ab#egg=bothub-engine +git+https://github.com/Ilhasoft/bothub-engine@015bed8aebafc701e439c4e700718043486ecde6#egg=bothub-engine plac==0.9.6 psycopg2-binary==2.7.6.1 diff --git a/bothub-nlp-nlu/Pipfile b/bothub-nlp-nlu/Pipfile index c7b4f1b1..c6f972e4 100644 --- a/bothub-nlp-nlu/Pipfile +++ b/bothub-nlp-nlu/Pipfile @@ -8,7 +8,7 @@ lint = "flake8" test = "coverage run -m unittest" [packages] -bothub-engine = {ref = "1.19.1", git = "https://github.com/Ilhasoft/bothub-engine"} +bothub-engine = {ref = "1.21.0", git = "https://github.com/Ilhasoft/bothub-engine"} contextvars = "==2.3" spacy = "==2.0.18" rasa-nlu = "==0.14.1" diff --git a/bothub-nlp-nlu/Pipfile.lock b/bothub-nlp-nlu/Pipfile.lock index 872a393b..d0de1908 100644 --- a/bothub-nlp-nlu/Pipfile.lock +++ b/bothub-nlp-nlu/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "3734191986e975be4183f968aadba7583875429ec7b464fb71bf193fb5f1ca78" + "sha256": "d1984c8b9aee60d928d5504d7f2592eb6a320fee049833a6152e165abe37726a" }, "pipfile-spec": 6, "requires": { @@ -18,23 +18,23 @@ "default": { "absl-py": { "hashes": [ - "sha256:8718189e4bd6013bf79910b9d1cb0a76aecad8ce664f78e1144980fabdd2cd23" + "sha256:b943d1c567743ed0455878fcd60bc28ac9fae38d129d1ccfad58079da00b8951" ], - "version": "==0.7.0" + "version": "==0.7.1" }, "astor": { "hashes": [ - "sha256:95c30d87a6c2cf89aa628b87398466840f0ad8652f88eb173125a6df8533fb8d", - "sha256:fb503b9e2fdd05609fbf557b916b4a7824171203701660f0c55bbf5a7a68713e" + "sha256:0e41295809baf43ae8303350e031aff81ae52189b6f881f36d623fa8b2f1960e", + "sha256:37a6eed8b371f1228db08234ed7f6cfdc7817a3ed3824797e20cbb11dc2a7862" ], - "version": "==0.7.1" + "version": "==0.8.0" }, "attrs": { "hashes": [ - "sha256:10cbf6e27dbce8c30807caf056c8eb50917e0eaafe86347671b57254006c3e69", - "sha256:ca4be454458f9dec299268d472aaa5a11f67a4ff70093396e1ceae9c76cf4bbb" + "sha256:69c0dbf2ed392de1cb5ec704444b08a5ef81680a61cb899dc08127123af36a79", + "sha256:f0b870f674851ecbfbbbd364d6b5cbdff9dcedbc7f3f5e18a6891057f21fe399" ], - "version": "==18.2.0" + "version": "==19.1.0" }, "automat": { "hashes": [ @@ -45,28 +45,28 @@ }, "bothub-engine": { "git": "https://github.com/Ilhasoft/bothub-engine", - "ref": "d3aa0888415f680d7726904b19dbae8a3f1569ab" + "ref": "ae6484f9afcc6de6fc6aa74bec050dcb42596020" }, "boto3": { "hashes": [ - "sha256:465b4da5d292373f9ec5bb8834f26251a5f464f2ce9da1756988c16bb5e49cff", - "sha256:6ca40ef1893eacb37a3696bb2a5739a9b33a7d978658b451f4d87729cb5ec576" + "sha256:c42d6e09f314da9ddd5742f864073a5623d8f54ff94ba2d9aa6c90321a9a92aa", + "sha256:c939b576327e962af65d083b75e122f7e3d69166f4951238726121d60216aee8" ], - "version": "==1.9.89" + "version": "==1.9.158" }, "botocore": { "hashes": [ - "sha256:2257dc1c012f535ef364b6b60fc9fdc822605fafd6765c3095385528669260aa", - "sha256:b0b9f204cbba3ad7a523f7b274e2d0ca252384e0c114fdfe94c00eb205fb2537" + "sha256:20ab7eeb3e82f1d8a3bc12a286ce073a0ba1a0d189e7c6dd9d1140a213161692", + "sha256:ed3e79cb3d271e5e58d87fba3bd90549b97c5aba26a9de2228212ccb8ef9f11b" ], - "version": "==1.12.89" + "version": "==1.12.158" }, "certifi": { "hashes": [ - "sha256:47f9c83ef4c0c621eaef743f133f09fa8a74a9b75f037e8624f83bd1b6626cb7", - "sha256:993f830721089fef441cdfeb4b2c8c9df86f0c63239f06bd025a76a7daddb033" + "sha256:59b7658e26ca9c7339e00f8f4636cdfe59d34fa37b9b04f6f9e9926b3cece1a5", + "sha256:b26104d6835d1f5e49452a26eb2ff87fe7090b89dfcaee5ea2212697e1e1d7ae" ], - "version": "==2018.11.29" + "version": "==2019.3.9" }, "chardet": { "hashes": [ @@ -91,10 +91,10 @@ }, "conllu": { "hashes": [ - "sha256:c0663f137245e634ffd50b985dc2cc5f9daa715308bb04fb1e1f25d69562601f", - "sha256:dc187cffd398d3687ba5942c628aa1283738f9b2320bac0364c121b5ca057f2e" + "sha256:2f5f169de1d3d629dbfb30c8f1077db3ce78f4d242d5bbdc9c773af703440add", + "sha256:40ae56d4b3c8ba0dc01a13f8eb716dde16fa4c885e1ce8be1018c9a115b337cc" ], - "version": "==1.2.1" + "version": "==1.3.1" }, "constantly": { "hashes": [ @@ -245,36 +245,40 @@ }, "grpcio": { "hashes": [ - "sha256:0134bab8e8d16b195547f9216517b3abcd3e4b6b1f5a1c8940099888003287ac", - "sha256:084d4a5f34a671bd0ec4668d3a7a3351015de81e6d4aef6710d9dab026def8cc", - "sha256:1ab29724526d8651c8b878257775e17cf3fba7474c01edc76ff8bcfecf570f91", - "sha256:1bd017ca22a126af0d7d67b4140b427ae58fd6d79dbd277e6f21be3ee0fdfef7", - "sha256:25e7b619973e20d8f2cf05d6af0f2e11263a8792b99c058a5b590ef7aef554b8", - "sha256:2e836e6092e6639cc9edb486f27c6fe078408aac54ed345c5762edcf8588d9c2", - "sha256:34870eb5d157fe9639f263f0bfe0bcdc1737a6c08181ce113585f6461f37c84b", - "sha256:424c8f0748935932d28531ce6d817a11914dfb385b86fe815297f122cd04d592", - "sha256:43c42570f769748982c61a249e01eec5f91149e2aa98438c893de64e649d562b", - "sha256:4f845d13ecff25012fc9c7f22067fca1d2b3da3f693da146ddcc587fdab3e7b4", - "sha256:614de7d6672eb023c08dde70b103efa9faacf86ac63b2a24f8d74b064a86f6f0", - "sha256:6c5956292692f385bb12b5f47afd70ae9469d2ee07a949c94aef2946020c1300", - "sha256:7030674682433a5cbc069cd5a5fbcdf193c8a3680dc161cd7b984f72ab609f23", - "sha256:77fff21bee2d3c3487891cdb69b35190deddac609e48c05262e1097f0b2cd82a", - "sha256:8ac64f3e17e6a13abf9628f0ba22012c948d7ab400592510fed3c62444bdcc0d", - "sha256:8fdfa8129e1ab2cdf053956dd07b21ccc127c8a8f0c5b83ff60987c009ddb636", - "sha256:8ff4935abf61206479dd42c56aba0f6c395aebb5c42b29b1f7c2faae41ad979c", - "sha256:9af47d0f4137a2951b73ee592bdc5690b242cfe81cdfacba1b34becbf72a0d59", - "sha256:9da5b3c883621afca008d2c5729ddd7f06153f5dcaae1f690bead9b9018a3594", - "sha256:abe825aa49e6239d5edf4e222c44170d2c7f6f4b1fd5286b4756a62d8067e112", - "sha256:c8330efa27af2b65aa556a66517ba6657a13e259670ad32dec1b6ff3d6616c3c", - "sha256:dc3d09abe7b49e84516b53920320d0f0d05587f6398431e50d6a47bd7d27a8b6", - "sha256:deb08edefef880609f8bd2945764f31d577785ff3f2daea7027b67432ff12f74", - "sha256:e019c86f55cdcd2bbc239beab14167f2e03ee92407c7c42ddf42edf6f5640cce", - "sha256:eb0d154c4749458353fbb5a55b39de7aa8445617c20d200729f924be125c56d0", - "sha256:eed5edb8f2620ad1157c8c5786809fb0a2d885969287a758752ce514274e3be0", - "sha256:f7a9fc2dfbbc0e838c79f908262638fb86ab326b0fbc0ea2c3dd063b3561e9e2", - "sha256:f9df2e626f1a8d8114a9dc05a489bdf26a8e926fbbe43112669700f25fe0abb3" - ], - "version": "==1.18.0" + "sha256:0232add03144dd3cf9b660e2718244cb8e175370dca4d3855cb4e489a7811b53", + "sha256:0f20e6dcb1b8662cdca033bb97c0a8116a5343e3ebc7f71c5fe7f89039978350", + "sha256:10b07a623d33d4966f45c85d410bc6a79c5ac6341f06c3beda6c22be12cbfe07", + "sha256:10c0476d5a52d21f402fc073745dc43b87cc8e080a1f49bbff4e1059019310fb", + "sha256:289dae0b35c59d191c524e976dd0a6f8c995d2062e72621eb866ad0f4472a635", + "sha256:2be726f16142d358a0df1e81d583d6820ee561a7856a79cca2fbe49989308be7", + "sha256:4338d2a81f5b4ca022e085040b3cfce19419a5ce44aa7e6810ac1df05365bed7", + "sha256:4c535b46f20e66bee3097583231977e721acdfcb1671d1490c99b7be8902ce18", + "sha256:557154aef70a0e979700cc9528bc8b606b668084a29a0d57dbc4b06b078a2f1c", + "sha256:5bfdd7e6647498f979dc46583723c852d97b25afe995d55aa1c76a5f9816bc1f", + "sha256:87d8943ae7aa6ca5bbad732867d7f17d2550e4966a0c15b52088e8b579422e47", + "sha256:89d8719d8de4d137678f7caa979e1b0a6fd4026f8096ceef8c2d164bbabefaf2", + "sha256:9c3f4af989ce860710ac1864dc2e867dd87e6cee51a2368df1b253596868e52f", + "sha256:9da52c3c728883aee429bb7c315049f50b2139f680cd86bb1165418e4f93a982", + "sha256:9e9736659987beab42d18525ed10d21f80a1ba8389eac03425fbfd5684e6bbf0", + "sha256:9ebcbb1a054cab362d29d3be571d43d6b9b23302d9fc4b43e5327000da1680a9", + "sha256:a93e08636623e24c939851e2e0c0140b14f524b2980c9cdc4ea52b70a871c7e0", + "sha256:ac322d86d1a079e0a118d544443ee16f320af0062c191b4754c0c6ec2fc79310", + "sha256:b1fb101459868f52df6b61e7bb13375e50badf17a160e39fe1d51ae19e53f461", + "sha256:b39aac96cceac624a23d540473835086a3ffa77c91030189988c073488434493", + "sha256:b65507bc273c6dbf539175a786a344cc0ac78d50e5584f72c6599733f8a3301f", + "sha256:be5bb6e47417e537c884a2e2ff2e1a8b2c064a998fcfdfcc67528d4e63e7ebaf", + "sha256:c92de6a28a909c4f460dc1bbbcb50d676cf0b1f40224b222761f73fdd851b522", + "sha256:c9f5962eb7fa7607b20eb0e4f59ed35829bd600fc0eacb626a6db83229a3e445", + "sha256:d00bdf9c546ed6e649f785c55b05288e8b2dbb6bf2eb74b6c579fa0d591d35bd", + "sha256:da804b1dd8293bd9d61b1e6ea989c887ba042a808a4fbdd80001cfa059aafed2", + "sha256:ead6c5aa3e807345913649c3be395aaca2bbb2d225f18b8f31f37eab225508f6", + "sha256:eb4d81550ce6f826af4ec6e8d98be347fe96291d718bf115c3f254621ae8d98d", + "sha256:ef6a18ec8fd32ec81748fe720544ea2fb2d2dc50fd6d06739d5e2eb8f0626a1c", + "sha256:fad42835656e0b6d3b7ffc900598e776722e30f43b7234a48f2576ca30f31a47", + "sha256:fb98dbfee0d963b49ae5754554028cf62e6bd695f22de16d242ba9d2f0b7339b", + "sha256:fb9cd9bb8d26dc17c2dd715a46bca3a879ec8283879b164e85863110dc6e3b2a" + ], + "version": "==1.21.1" }, "h5py": { "hashes": [ @@ -311,17 +315,17 @@ }, "humanfriendly": { "hashes": [ - "sha256:1d3a1c157602801c62dfdb321760229df2e0d4f14412a0f41b13ad3f930a936a", - "sha256:42d0aa829f59c710db20ec42eed24a8b7a27688d477da61b5aebd604d0bb2402" + "sha256:23057b10ad6f782e7bc3a20e3cb6768ab919f619bbdc0dd75691121bbde5591d", + "sha256:33ee8ceb63f1db61cce8b5c800c531e1a61023ac5488ccde2ba574a85be00a85" ], - "version": "==4.17" + "version": "==4.18" }, "hyperlink": { "hashes": [ - "sha256:98da4218a56b448c7ec7d2655cb339af1f7d751cf541469bb4fc28c4a4245b34", - "sha256:f01b4ff744f14bc5d0a22a6b9f1525ab7d6312cb0ff967f59414bbac52f0a306" + "sha256:4288e34705da077fada1111a24a0aa08bb1e76699c9ce49876af722441845654", + "sha256:ab4a308feb039b04f855a020a6eda3b18ca5a68e6d8f8c899cbe9e653721d04f" ], - "version": "==18.0.0" + "version": "==19.0.0" }, "idna": { "hashes": [ @@ -355,10 +359,10 @@ }, "jmespath": { "hashes": [ - "sha256:6a81d4c9aa62caf061cb517b4d9ad1dd300374cd4706997aff9cd6aedd61fc64", - "sha256:f11b4461f425740a1d908e9a3f7365c3d2e569f6ca68a2ff8bc5bcd9676edd63" + "sha256:3720a4b1bd659dd2eecad0666459b9788813e032b83e7ba58578e48254e0a0e6", + "sha256:bde2aef6f44302dfb30320115b17d030798de8c4110e28d5cf6cf91a7a31074c" ], - "version": "==0.9.3" + "version": "==0.9.4" }, "jsonschema": { "hashes": [ @@ -383,36 +387,36 @@ }, "kiwisolver": { "hashes": [ - "sha256:0ee4ed8b3ae8f5f712b0aa9ebd2858b5b232f1b9a96b0943dceb34df2a223bc3", - "sha256:0f7f532f3c94e99545a29f4c3f05637f4d2713e7fd91b4dd8abfc18340b86cd5", - "sha256:1a078f5dd7e99317098f0e0d490257fd0349d79363e8c923d5bb76428f318421", - "sha256:1aa0b55a0eb1bd3fa82e704f44fb8f16e26702af1a073cc5030eea399e617b56", - "sha256:2874060b91e131ceeff00574b7c2140749c9355817a4ed498e82a4ffa308ecbc", - "sha256:379d97783ba8d2934d52221c833407f20ca287b36d949b4bba6c75274bcf6363", - "sha256:3b791ddf2aefc56382aadc26ea5b352e86a2921e4e85c31c1f770f527eb06ce4", - "sha256:4329008a167fac233e398e8a600d1b91539dc33c5a3eadee84c0d4b04d4494fa", - "sha256:45813e0873bbb679334a161b28cb9606d9665e70561fd6caa8863e279b5e464b", - "sha256:53a5b27e6b5717bdc0125338a822605084054c80f382051fb945d2c0e6899a20", - "sha256:574f24b9805cb1c72d02b9f7749aa0cc0b81aa82571be5201aa1453190390ae5", - "sha256:66f82819ff47fa67a11540da96966fb9245504b7f496034f534b81cacf333861", - "sha256:79e5fe3ccd5144ae80777e12973027bd2f4f5e3ae8eb286cabe787bed9780138", - "sha256:83410258eb886f3456714eea4d4304db3a1fc8624623fc3f38a487ab36c0f653", - "sha256:8b6a7b596ce1d2a6d93c3562f1178ebd3b7bb445b3b0dd33b09f9255e312a965", - "sha256:9576cb63897fbfa69df60f994082c3f4b8e6adb49cccb60efb2a80a208e6f996", - "sha256:95a25d9f3449046ecbe9065be8f8380c03c56081bc5d41fe0fb964aaa30b2195", - "sha256:a424f048bebc4476620e77f3e4d1f282920cef9bc376ba16d0b8fe97eec87cde", - "sha256:aaec1cfd94f4f3e9a25e144d5b0ed1eb8a9596ec36d7318a504d813412563a85", - "sha256:acb673eecbae089ea3be3dcf75bfe45fc8d4dcdc951e27d8691887963cf421c7", - "sha256:b15bc8d2c2848a4a7c04f76c9b3dc3561e95d4dabc6b4f24bfabe5fd81a0b14f", - "sha256:b1c240d565e977d80c0083404c01e4d59c5772c977fae2c483f100567f50847b", - "sha256:c595693de998461bcd49b8d20568c8870b3209b8ea323b2a7b0ea86d85864694", - "sha256:ce3be5d520b4d2c3e5eeb4cd2ef62b9b9ab8ac6b6fedbaa0e39cdb6f50644278", - "sha256:e0f910f84b35c36a3513b96d816e6442ae138862257ae18a0019d2fc67b041dc", - "sha256:ea36e19ac0a483eea239320aef0bd40702404ff8c7e42179a2d9d36c5afcb55c", - "sha256:efabbcd4f406b532206b8801058c8bab9e79645b9880329253ae3322b7b02cd5", - "sha256:f923406e6b32c86309261b8195e24e18b6a8801df0cfc7814ac44017bfcb3939" - ], - "version": "==1.0.1" + "sha256:05b5b061e09f60f56244adc885c4a7867da25ca387376b02c1efc29cc16bcd0f", + "sha256:26f4fbd6f5e1dabff70a9ba0d2c4bd30761086454aa30dddc5b52764ee4852b7", + "sha256:3b2378ad387f49cbb328205bda569b9f87288d6bc1bf4cd683c34523a2341efe", + "sha256:400599c0fe58d21522cae0e8b22318e09d9729451b17ee61ba8e1e7c0346565c", + "sha256:47b8cb81a7d18dbaf4fed6a61c3cecdb5adec7b4ac292bddb0d016d57e8507d5", + "sha256:53eaed412477c836e1b9522c19858a8557d6e595077830146182225613b11a75", + "sha256:58e626e1f7dfbb620d08d457325a4cdac65d1809680009f46bf41eaf74ad0187", + "sha256:5a52e1b006bfa5be04fe4debbcdd2688432a9af4b207a3f429c74ad625022641", + "sha256:5c7ca4e449ac9f99b3b9d4693debb1d6d237d1542dd6a56b3305fe8a9620f883", + "sha256:682e54f0ce8f45981878756d7203fd01e188cc6c8b2c5e2cf03675390b4534d5", + "sha256:79bfb2f0bd7cbf9ea256612c9523367e5ec51d7cd616ae20ca2c90f575d839a2", + "sha256:7f4dd50874177d2bb060d74769210f3bce1af87a8c7cf5b37d032ebf94f0aca3", + "sha256:8944a16020c07b682df861207b7e0efcd2f46c7488619cb55f65882279119389", + "sha256:8aa7009437640beb2768bfd06da049bad0df85f47ff18426261acecd1cf00897", + "sha256:939f36f21a8c571686eb491acfffa9c7f1ac345087281b412d63ea39ca14ec4a", + "sha256:9733b7f64bd9f807832d673355f79703f81f0b3e52bfce420fc00d8cb28c6a6c", + "sha256:a02f6c3e229d0b7220bd74600e9351e18bc0c361b05f29adae0d10599ae0e326", + "sha256:a0c0a9f06872330d0dd31b45607197caab3c22777600e88031bfe66799e70bb0", + "sha256:acc4df99308111585121db217681f1ce0eecb48d3a828a2f9bbf9773f4937e9e", + "sha256:b64916959e4ae0ac78af7c3e8cef4becee0c0e9694ad477b4c6b3a536de6a544", + "sha256:d3fcf0819dc3fea58be1fd1ca390851bdb719a549850e708ed858503ff25d995", + "sha256:d52e3b1868a4e8fd18b5cb15055c76820df514e26aa84cc02f593d99fef6707f", + "sha256:db1a5d3cc4ae943d674718d6c47d2d82488ddd94b93b9e12d24aabdbfe48caee", + "sha256:e3a21a720791712ed721c7b95d433e036134de6f18c77dbe96119eaf7aa08004", + "sha256:e8bf074363ce2babeb4764d94f8e65efd22e6a7c74860a4f05a6947afc020ff2", + "sha256:f16814a4a96dc04bf1da7d53ee8d5b1d6decfc1a92a63349bb15d37b6a263dd9", + "sha256:f2b22153870ca5cf2ab9c940d7bc38e8e9089fa0f7e5856ea195e1cf4ff43d5a", + "sha256:f790f8b3dff3d53453de6a7b7ddd173d2e020fb160baff578d578065b108a05f" + ], + "version": "==1.1.0" }, "klein": { "hashes": [ @@ -430,37 +434,37 @@ }, "markdown": { "hashes": [ - "sha256:c00429bd503a47ec88d5e30a751e147dcb4c6889663cd3e2ba0afe858e009baa", - "sha256:d02e0f9b04c500cde6637c11ad7c72671f359b87b9fe924b2383649d8841db7c" + "sha256:2e50876bcdd74517e7b71f3e7a76102050edec255b3983403f1a63e7c8a41e7a", + "sha256:56a46ac655704b91e5b7e6326ce43d5ef72411376588afa1dd90e881b83c7e8c" ], - "version": "==3.0.1" + "version": "==3.1.1" }, "matplotlib": { "hashes": [ - "sha256:0ba8e3ec1b0feddc6b068fe70dc38dcf2917e301ad8d2b3f848c14ad463a4157", - "sha256:10a48e33e64dbd95f0776ba162f379c5cc55301c2d155506e79ce0c26b52f2ce", - "sha256:1376535fe731adbba55ab9e48896de226b7e89dbb55390c5fbd8f7161b7ae3be", - "sha256:16f0f8ba22df1e2c9f06c87088de45742322fde282a93b5c744c0f969cf7932e", - "sha256:1c6c999f2212858021329537f8e0f98f3f29086ec3683511dd1ecec84409f51d", - "sha256:2316dc177fc7b3d8848b49365498de0c385b4c9bba511edddd24c34fbe3d37a4", - "sha256:3398bfb533482bf21974cecf28224dd23784ad4e4848be582903f7a2436ec12e", - "sha256:3477cb1e1061b34210acc43d20050be8444478ff50b8adfac5fe2b45fc97df01", - "sha256:3cc06333b8264428d02231804e2e726b902e9161dc16f573183dee6cb7ef621f", - "sha256:4259ea7cb2c238355ee13275eddd261d869cefbdeb18a65f35459589d6d17def", - "sha256:4addcf93234b6122f530f90f485fd3d00d158911fbc1ed24db3fa66cd49fe565", - "sha256:50c0e24bcbce9c54346f4a2f4e97b0ed111f0413ac3fe9954061ae1c8aa7021f", - "sha256:62ed7597d9e54db6e133420d779c642503c25eba390e1178d85dfb2ba0d05948", - "sha256:69f6d51e41a17f6a5f70c56bb10b8ded9f299609204495a7fa2782a3a755ffc5", - "sha256:6d232e49b74e3d2db22c63c25a9a0166d965e87e2b057f795487f1f244b61d9d", - "sha256:7355bf757ecacd5f0ac9dd9523c8e1a1103faadf8d33c22664178e17533f8ce5", - "sha256:886b1045c5105631f10c1cbc999f910e44d33af3e9c7efd68c2123efc06ab636", - "sha256:9e1f353edd7fc7e5e9101abd5bc0201946f77a1b59e0da49095086c03db856ed", - "sha256:b3a343dfcbe296dbe0f26c731beee72a792ff948407e6979524298ae7bc3234e", - "sha256:d93675af09ca497a25f4f8d62f3313cf0f21e45427a87487049fe84898b99909", - "sha256:e2409ef9d37804dfb566f39c962e6ed70f281ff516b8131b3e6b4e6442711ff1", - "sha256:f8b653b0f89938ba72e92ab080c2f3aa24c1b72e2f61add22880cd1b9a6e3cdd" - ], - "version": "==2.2.3" + "sha256:029620799e581802961ac1dcff5cb5d3ee2f602e0db9c0f202a90495b37d2126", + "sha256:2308f67e085735ed580fcace652339cb517f059cdc9ee8a418c1b55746dbffcb", + "sha256:280aebaec25575e35bf7d1b3ebb2d8ae7e839edb5a403f1a121b7271744b1ef9", + "sha256:295099acb5a8a1148d1b4693ad1a93479a20836cd8b7eb38183a98c84cdcb2f1", + "sha256:75d44c55eb87af653afc3d0a37ab62ab4784c752be0e7c96622713d88ed57e64", + "sha256:95d9d7c2d7f0c7a4317acbcf1a81efa0a2ce5cb5ddfad606ae4c25a783431f0a", + "sha256:9703ffc3e7e369f3ab31d0032719710876cb341eb618e1a8a54447e1946a9f0a", + "sha256:9ff80541d5676207c6e829632b28e22d9875ecaae54eab7a7f8fd82a6552e5e9", + "sha256:a6a04ebd81b3183e7882c9047a9514b7f547b2bae5e4f61a02eaaa6b446bde54", + "sha256:b22b0d3b8d8f769c6ac559f6761878d660bd23d67b36430f07161caf1505c29c", + "sha256:b464d598e36e13f7d798443805f2ba6b4af3d26fc1652c51c77a7847cf665813", + "sha256:c0fa162920185d5d74e6fdf52c1f8cca0fbf897025a9dd81e030cf08a915865a", + "sha256:c452b7aff0a9e4612670a4590e6efc30929dad620a121d423c8f3d0bd93715e2", + "sha256:c90fc796e97815ea3bbbdea63c1e4edf75336361a49b945fdbc2aff1c76008c6", + "sha256:cc1d376963ea9c97338582f3f9d64757c51e71cf2655efe363a3f2414d84aac2", + "sha256:d3f5dfaa345539599308bd83826db242e424e3f4e9657952f8738ce1b5b90e8a", + "sha256:d9e80ba0ffdb0daacaf49e561474d5c5c153d6db853478cf90c8cba5ed8b72b1", + "sha256:daac44fc77cf36ff01953e2acc57a843fb1f6572eb5bf0af10a2930fa7407715", + "sha256:de43c85335d71094a254e8538719752e30db3305005dae8dcb3097b72587ed07", + "sha256:e4621af28a2444f93b5b6d3d60f54767df8ac6daa510a98f68c34377cb474869", + "sha256:f3755a52aae7fb640f5f57b7b63eb5d65688c84931d7833dbc7d03959cd4f8ce", + "sha256:f99c43df8ed2b9d1c95a042f3cacf017f9690092feba0b4292eaa6713f92de97" + ], + "version": "==2.2.4" }, "msgpack": { "hashes": [ @@ -491,65 +495,55 @@ }, "murmurhash": { "hashes": [ - "sha256:071f6369a65b835becdfe2d8ab02a4d05e83336a0bf3138dbf12a8f6967604ea", - "sha256:197ac63d8eeadc5483771756d05aa19ae497ecdcdaf52c93494085ebb5ec07f3", - "sha256:1fc10274819f2c6bfc80d8fc3c58af02f08f642d591e202bb46992b460ce2987", - "sha256:2791a32228d7c34502b07078e720c3acc84e7e5b691f55812dcf155a0c13cca0", - "sha256:2f6b63d0d7c5171b91953ad204de8f3e2ce387b9308784f7e00170d7f229e5f7", - "sha256:38e91cd5ae5192b8f63cfe756cc784bf0cd44f64a15e496ba0a6fddda3f48b0b", - "sha256:3ee8ee6f31842e2aafc0aca30f4e77ed1fb8fcbe490ad2840cf494610fcb12b2", - "sha256:46892237f315a11bbf3c2bf15efaaa2a1ee16c9020ad9aa9f4741d056f06dd13", - "sha256:5657a0160d2b96cea7bd18b212e6c599a59423acbd89cde809c6e663b33b5431", - "sha256:70c9d020dea00251804fc40ce1282dd7209f924dc5bc7b99078fff48efe18de6", - "sha256:892ed1cf981018491c822e3170f9e0569e2ba4f545adda5c64c78ba260ee7aa7", - "sha256:8ada4beec7b06b32cb4a49b8f2b847246d47a3f49b0ed823958d69bf28435917", - "sha256:95efa59af24226321041c798fb7a125dc792edd6a31614efbd6c742ab98de35f", - "sha256:9903f5c877bcfe4c7afb33dd2ce9af014033e86d9df549c958bf15751a35474a", - "sha256:9da5dba8ac50f9b2daede067f0f103cd3cba7f437dbbd515d2decb393ee80dde", - "sha256:9fcc1d57eb8179713a6045ab96f24aabaa3ab259e72a4d22bad63eff321d6ea6", - "sha256:a44feb4efac2a8c319eda86f3213162bbde9874c57b3421a99f9673736fea162", - "sha256:a47b27867a40cd9312898609fda3b4e5150aee1df569745ddaf0b4b7fe17bc96", - "sha256:b6850783e4fc59386c0585fc106c9bbe2e7b8f9de74603b9a8b252db8cc7e0af", - "sha256:ba5019b87c659ffd4aab78b6fc1163837fbf871c43fb0307f97e5d29ab299434", - "sha256:e4edd636ef9338b19cfbbffb193674f96c8313797d04cd8750eeed802cbdf9bf", - "sha256:f578afc6a986529a39eab36b1446e04006a4489abd32efb0ccb2a3d984a40066", - "sha256:f585411e568bed2c5216b75681e4734baff8f7f174f95f3547637735896a76f4" - ], - "version": "==1.0.1" + "sha256:27b908fe4bdb426f4e4e4a8821acbe0302915b2945e035ec9d8ca513e2a74b1f", + "sha256:33405103fa8cde15d72ee525a03d5cfe2c7e4901133819754810986e29627d68", + "sha256:386a9eed3cb27cb2cd4394b6521275ba04552642c2d9cab5c9fb42aa5a3325c0", + "sha256:3af36a0dc9f13f6892d9b8b39a6a3ccf216cae5bce38adc7c2d145677987772f", + "sha256:717196a04cdc80cc3103a3da17b2415a8a5e1d0d578b7079259386bf153b3258", + "sha256:8a4ed95cd3456b43ea301679c7c39ade43fc18b844b37d0ba0ac0d6acbff8e0c", + "sha256:a6c071b4b498bcea16a8dc8590cad81fa8d43821f34c74bc00f96499e2527073", + "sha256:b0afe329701b59d02e56bc6cee7325af83e3fee9c299c615fc1df3202b4f886f", + "sha256:ba766343bdbcb928039b8fff609e80ae7a5fd5ed7a4fc5af822224b63e0cbaff", + "sha256:bf33490514d308bcc27ed240cb3eb114f1ec31af031535cd8f27659a7049bd52", + "sha256:c7a646f6b07b033642b4f52ae2e45efd8b80780b3b90e8092a0cec935fbf81e2", + "sha256:d696c394ebd164ca80b5871e2e9ad2f9fdbb81bd3c552c1d5f1e8ee694e6204a", + "sha256:fe344face8d30a5a6aa26e5acf288aa2a8f0f32e05efdda3d314b4bf289ec2af" + ], + "version": "==1.0.2" }, "nltk": { "hashes": [ - "sha256:286f6797204ffdb52525a1d21ec0a221ec68b8e3fa4f2d25f412ac8e63c70e8d" + "sha256:3a64b1cb685bbf344adec416871fee07996671c876ff313b3e504158fa1500e1" ], - "version": "==3.4" + "version": "==3.4.1" }, "numpy": { "hashes": [ - "sha256:0cdbbaa30ae69281b18dd995d3079c4e552ad6d5426977f66b9a2a95f11f552a", - "sha256:2b0cca1049bd39d1879fa4d598624cafe82d35529c72de1b3d528d68031cdd95", - "sha256:31d3fe5b673e99d33d70cfee2ea8fe8dccd60f265c3ed990873a88647e3dd288", - "sha256:34dd4922aab246c39bf5df03ca653d6265e65971deca6784c956bf356bca6197", - "sha256:384e2dfa03da7c8d54f8f934f61b6a5e4e1ebb56a65b287567629d6c14578003", - "sha256:392e2ea22b41a22c0289a88053204b616181288162ba78e6823e1760309d5277", - "sha256:4341a39fc085f31a583be505eabf00e17c619b469fef78dc7e8241385bfddaa4", - "sha256:45080f065dcaa573ebecbfe13cdd86e8c0a68c4e999aa06bd365374ea7137706", - "sha256:485cb1eb4c9962f4cd042fed9424482ec1d83fee5dc2ef3f2552ac47852cb259", - "sha256:575cefd28d3e0da85b0864506ae26b06483ee4a906e308be5a7ad11083f9d757", - "sha256:62784b35df7de7ca4d0d81c5b6af5983f48c5cdef32fc3635b445674e56e3266", - "sha256:69c152f7c11bf3b4fc11bc4cc62eb0334371c0db6844ebace43b7c815b602805", - "sha256:6ccfdcefd287f252cf1ea7a3f1656070da330c4a5658e43ad223269165cdf977", - "sha256:7298fbd73c0b3eff1d53dc9b9bdb7add8797bb55eeee38c8ccd7906755ba28af", - "sha256:79463d918d1bf3aeb9186e3df17ddb0baca443f41371df422f99ee94f4f2bbfe", - "sha256:8bbee788d82c0ac656536de70e817af09b7694f5326b0ef08e5c1014fcb96bb3", - "sha256:a863957192855c4c57f60a75a1ac06ce5362ad18506d362dd807e194b4baf3ce", - "sha256:ae602ba425fb2b074e16d125cdce4f0194903da935b2e7fe284ebecca6d92e76", - "sha256:b13faa258b20fa66d29011f99fdf498641ca74a0a6d9266bc27d83c70fea4a6a", - "sha256:c2c39d69266621dd7464e2bb740d6eb5abc64ddc339cc97aa669f3bb4d75c103", - "sha256:e9c88f173d31909d881a60f08a8494e63f1aff2a4052476b24d4f50e82c47e24", - "sha256:f1a29267ac29fff0913de0f11f3a9edfcd3f39595f467026c29376fad243ebe3", - "sha256:f69dde0c5a137d887676a8129373e44366055cf19d1b434e853310c7a1e68f93" - ], - "version": "==1.16.1" + "sha256:0778076e764e146d3078b17c24c4d89e0ecd4ac5401beff8e1c87879043a0633", + "sha256:141c7102f20abe6cf0d54c4ced8d565b86df4d3077ba2343b61a6db996cefec7", + "sha256:14270a1ee8917d11e7753fb54fc7ffd1934f4d529235beec0b275e2ccf00333b", + "sha256:27e11c7a8ec9d5838bc59f809bfa86efc8a4fd02e58960fa9c49d998e14332d5", + "sha256:2a04dda79606f3d2f760384c38ccd3d5b9bb79d4c8126b67aff5eb09a253763e", + "sha256:3c26010c1b51e1224a3ca6b8df807de6e95128b0908c7e34f190e7775455b0ca", + "sha256:52c40f1a4262c896420c6ea1c6fda62cf67070e3947e3307f5562bd783a90336", + "sha256:6e4f8d9e8aa79321657079b9ac03f3cf3fd067bf31c1cca4f56d49543f4356a5", + "sha256:7242be12a58fec245ee9734e625964b97cf7e3f2f7d016603f9e56660ce479c7", + "sha256:7dc253b542bfd4b4eb88d9dbae4ca079e7bf2e2afd819ee18891a43db66c60c7", + "sha256:94f5bd885f67bbb25c82d80184abbf7ce4f6c3c3a41fbaa4182f034bba803e69", + "sha256:a89e188daa119ffa0d03ce5123dee3f8ffd5115c896c2a9d4f0dbb3d8b95bfa3", + "sha256:ad3399da9b0ca36e2f24de72f67ab2854a62e623274607e37e0ce5f5d5fa9166", + "sha256:b0348be89275fd1d4c44ffa39530c41a21062f52299b1e3ee7d1c61f060044b8", + "sha256:b5554368e4ede1856121b0dfa35ce71768102e4aa55e526cb8de7f374ff78722", + "sha256:cbddc56b2502d3f87fda4f98d948eb5b11f36ff3902e17cb6cc44727f2200525", + "sha256:d79f18f41751725c56eceab2a886f021d70fd70a6188fd386e29a045945ffc10", + "sha256:dc2ca26a19ab32dc475dbad9dfe723d3a64c835f4c23f625c2b6566ca32b9f29", + "sha256:dd9bcd4f294eb0633bb33d1a74febdd2b9018b8b8ed325f861fffcd2c7660bb8", + "sha256:e8baab1bc7c9152715844f1faca6744f2416929de10d7639ed49555a85549f52", + "sha256:ec31fe12668af687b99acf1567399632a7c47b0e17cfb9ae47c098644ef36797", + "sha256:f12b4f7e2d8f9da3141564e6737d79016fe5336cc92de6814eba579744f65b0a", + "sha256:f58ac38d5ca045a377b3b377c84df8175ab992c970a53332fa8ac2373df44ff7" + ], + "version": "==1.16.4" }, "packaging": { "hashes": [ @@ -596,24 +590,26 @@ }, "protobuf": { "hashes": [ - "sha256:10394a4d03af7060fa8a6e1cbf38cea44be1467053b0aea5bbfcb4b13c4b88c4", - "sha256:1489b376b0f364bcc6f89519718c057eb191d7ad6f1b395ffd93d1aa45587811", - "sha256:1931d8efce896981fe410c802fd66df14f9f429c32a72dd9cfeeac9815ec6444", - "sha256:196d3a80f93c537f27d2a19a4fafb826fb4c331b0b99110f985119391d170f96", - "sha256:46e34fdcc2b1f2620172d3a4885128705a4e658b9b62355ae5e98f9ea19f42c2", - "sha256:4b92e235a3afd42e7493b281c8b80c0c65cbef45de30f43d571d1ee40a1f77ef", - "sha256:574085a33ca0d2c67433e5f3e9a0965c487410d6cb3406c83bdaf549bfc2992e", - "sha256:59cd75ded98094d3cf2d79e84cdb38a46e33e7441b2826f3838dcc7c07f82995", - "sha256:5ee0522eed6680bb5bac5b6d738f7b0923b3cafce8c4b1a039a6107f0841d7ed", - "sha256:65917cfd5da9dfc993d5684643063318a2e875f798047911a9dd71ca066641c9", - "sha256:685bc4ec61a50f7360c9fd18e277b65db90105adbf9c79938bd315435e526b90", - "sha256:92e8418976e52201364a3174e40dc31f5fd8c147186d72380cbda54e0464ee19", - "sha256:9335f79d1940dfb9bcaf8ec881fb8ab47d7a2c721fb8b02949aab8bbf8b68625", - "sha256:a7ee3bb6de78185e5411487bef8bc1c59ebd97e47713cba3c460ef44e99b3db9", - "sha256:ceec283da2323e2431c49de58f80e1718986b79be59c266bb0509cbf90ca5b9e", - "sha256:fcfc907746ec22716f05ea96b7f41597dfe1a1c088f861efb8a0d4f4196a6f10" - ], - "version": "==3.6.1" + "sha256:03f43eac9d5b651f976e91cf46a25b75e5779d98f0f4114b0abfed83376d75f8", + "sha256:0c94b21e6de01362f91a86b372555d22a60b59708599ca9d5032ae9fdf8e3538", + "sha256:2d2a9f30f61f4063fadd7fb68a2510a6939b43c0d6ceeec5c4704f22225da28e", + "sha256:34a0b05fca061e4abb77dd180209f68d8637115ff319f51e28a6a9382d69853a", + "sha256:358710fd0db25372edcf1150fa691f48376a134a6c69ce29f38f185eea7699e6", + "sha256:41e47198b94c27ba05a08b4a95160656105745c462af574e4bcb0807164065c0", + "sha256:8c61cc8a76e9d381c665aecc5105fa0f1878cf7db8b5cd17202603bcb386d0fc", + "sha256:a6eebc4db759e58fdac02efcd3028b811effac881d8a5bad1996e4e8ee6acb47", + "sha256:a9c12f7c98093da0a46ba76ec40ace725daa1ac4038c41e4b1466afb5c45bb01", + "sha256:cb95068492ba0859b8c9e61fa8ba206a83c64e5d0916fb4543700b2e2b214115", + "sha256:cd98476ce7bb4dcd6a7b101f5eecdc073dafea19f311e36eb8fba1a349346277", + "sha256:ce64cfbea18c535176bdaa10ba740c0fc4c6d998a3f511c17bedb0ae4b3b167c", + "sha256:dcbb59eac73fd454e8f2c5fba9e3d3320fd4707ed6a9d3ea3717924a6f0903ea", + "sha256:dd67f34458ae716029e2a71ede998e9092493b62a519236ca52e3c5202096c87", + "sha256:e3c96056eb5b7284a20e256cb0bf783c8f36ad82a4ae5434a7b7cd02384144a7", + "sha256:f612d584d7a27e2f39e7b17878430a959c1bc09a74ba09db096b468558e5e126", + "sha256:f6de8a7d6122297b81566e5bd4df37fd5d62bec14f8f90ebff8ede1c9726cd0a", + "sha256:fa529d9261682b24c2aaa683667253175c9acebe0a31105394b221090da75832" + ], + "version": "==3.8.0" }, "pyhamcrest": { "hashes": [ @@ -640,10 +636,10 @@ }, "pyparsing": { "hashes": [ - "sha256:66c9268862641abcac4a96ba74506e594c884e3f57690a696d21ad8210ed667a", - "sha256:f6c5ef0d7480ad048c054c37632c67fca55299990fff127850181659eea33fc3" + "sha256:1873c03321fc118f4e9746baf201ff990ceb915f433f23b395f5580d1840cb2a", + "sha256:9b6323ef4ab914af344ba97510e966d64ba91055d6b9afa6b30799340e89cc03" ], - "version": "==2.3.1" + "version": "==2.4.0" }, "pythainlp": { "hashes": [ @@ -695,10 +691,10 @@ }, "pytz": { "hashes": [ - "sha256:32b0891edff07e28efe91284ed9c31e123d84bea3fd98e1f72be2508f43ef8d9", - "sha256:d5f05e487007e29e03409f9398d074e158d920d36eb82eaf66fb1136b0c5374c" + "sha256:303879e36b721603cc54604edcac9d20401bdbe31e1e4fdee5b9f98d5d31dfda", + "sha256:d747dd3d23d77ef44c6a3526e274af6efeb0a6f1afd5a69ba4d5be4098c8e141" ], - "version": "==2018.9" + "version": "==2019.1" }, "rasa-nlu": { "hashes": [ @@ -730,37 +726,33 @@ }, "requests": { "hashes": [ - "sha256:502a824f31acdacb3a35b6690b5fbf0bc41d63a24a45c4004352b0242707598e", - "sha256:7bf2a778576d825600030a110f3c0e3e8edc51dfaafe1c146e39a2027784957b" + "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4", + "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31" ], - "version": "==2.21.0" + "version": "==2.22.0" }, "ruamel.yaml": { "hashes": [ - "sha256:18078354bfcf00d51bcc17984aded80840379aed36036f078479e191b59bc059", - "sha256:211e6ef2530f44fc3197c713892678e7fbfbc40a1db6741179d6981514be1674", - "sha256:2e8f7cee12a2372cec4480fe81086b1fdab163f4b56e58b5592a105c52973b78", - "sha256:48cc8e948a7ec4917bf94adff2cc1255e98f1eef5e1961889886acc4ff3a7194", - "sha256:4a0c7f970aa0e30bc541f690fbd14aca19de1cab70787180de5083b902ec40b5", - "sha256:5dd0ea7c5c703e8675f3caf2898a50b4dadaa52838f8e104637a452a05e03030", - "sha256:612fb4833f1978ceb7fd7a24d86a5ebd103bcc408394f3af621293194658cf1b", - "sha256:61c421a7a2b8e2886a94fbe29866df6b99451998abaa1584b9fdc9c10c33e40b", - "sha256:6483416847980aa7090b697d177a8754c4f340683cc84abd38da7b850826687d", - "sha256:6622f3b0cae7ed6fe5d3d6a6d8d8cb9413a05b408d69a789a57b77a616bb6562", - "sha256:80b2acde0d1b9d25e5c041960a9149480c15c6d9f4c24b8ddb381b14e9e70ea4", - "sha256:8f9ed94be17f306485df8fd0274a30f130a73f127798657d4dc65b1f89ec7a36", - "sha256:9a6b94cc9b6e738036426498ac9fe8ca05afea4249fb9dec1be32ce4823d5756", - "sha256:a4b11dfe421a9836c723107a4ccc9cab9674de611ba60b8212e85526ea8bf254", - "sha256:a55e55c6ecb5725ba472f9b811940e8d258a32fb36f5793dbc38582d6f377f3f", - "sha256:a736ab1d8c2d5566254a1a2ee38e7c5460520bcccd4a8f0feb25a4463735e5a7", - "sha256:c29d0a3cffa5a25f5259bfeac06ffdc5e7d1fd38a0a26a6664d160192730434f", - "sha256:c33458217a8c352b59c86065c4f05f3f1ac28b01c3e1a422845c306237446bf3", - "sha256:cc9bd3c3fa8a928f7b6e19fe8de13a61deb91f257eccbe0d16114ce8c54cdc81", - "sha256:d63b7c828a7358ce5b03a3e2c2a3e5a7058a954f8919334cb09b3d8541d1fff6", - "sha256:fbd301680a3563e84d667042dac1c5d50ef402ecf1f4b1763507a6877b8181ad", - "sha256:fc67e79e2f5083be6fd1000c4646e13a891585772a503f56f51f845b547fe621" - ], - "version": "==0.15.87" + "sha256:0372b039c2358db2e7a7d5c77f2a37c552bd45896936f430678b5f00ac9fef08", + "sha256:12ebbba6447cfd61491ace18a6972d4edaab6615c933ae8a0016c27c27ee93b7", + "sha256:1973a131a7b5a604653ffd904286e53334c08306b575bf964ae87f226d4956cd", + "sha256:21c130c2741e8499ad92362d24f68aad70089e77b206e6e85d62e255e6017c92", + "sha256:21c6287beabb96c9f51478506b00db269276d84aa41a61f29c88af397406b267", + "sha256:2e07d11526c70bfb3a07c77d73c72b7fcfae21cc7f2252c7d6419e25b6349d23", + "sha256:32755f26f46816e46bd74fd48c4db63ee500b68cbe2394b2943daab573d12a33", + "sha256:343ace5ffbab036536a3da65e4cfd31b8292388a389f6305744984581a479b2a", + "sha256:3de37e2de83fa4016886bf40069e9cc7816b51a1f57687e6872cb414f891a573", + "sha256:809db4d5213bfb0205e2dcc6118fbfa348e3ae39f3d8f6810e3e6831f3070321", + "sha256:8810319a64d4cf5701feb7c2833b03f8bd29e1d6753e4b97cf977f889eb6354d", + "sha256:8b91affdcab942ab1319d8d24345a3de8e0e70fd2871d5bb61e19e32b5ae31d9", + "sha256:8e3d51a2d20a982a6eb38b0b9bcecdd2acacdcf2137081b0a744ca98cdcca9af", + "sha256:97cc58bff414bf40b8b909aeadaa669becad35e182a2b229d0c3d6c9a34e1f15", + "sha256:a6f4f214d6dc6253846630af7a701ee00ebd2730eca03c7e8e031d748b0e22e4", + "sha256:e1e34869d005e3e5292f44022e01cc4eb3f045291ba01166908f97f4716e7a69", + "sha256:effc63d7f86841cec3a4a76ed6c73f441e68c5ea02c3dee3faaaeda9fabc8cd8", + "sha256:fc4c69b505f9178aa55b780cd8cde7c17927501046c7f0ebcd66959cd0dba2db" + ], + "version": "==0.15.96" }, "s3transfer": { "hashes": [ @@ -805,36 +797,24 @@ }, "scipy": { "hashes": [ - "sha256:02cb79ea38114dc480e9b08d6b87095728e8fb39b9a49b449ee443d678001611", - "sha256:03c827cdbc584e935264040b958e5fa0570a16095bee23a013482ba3f0e963a2", - "sha256:04f2b23258139c109d0524f111597dd095a505d9cb2c71e381d688d653877fa3", - "sha256:3132a9fab3f3545c8b0ba15688d11857efdd4a58d388d3785dc474f56fea7138", - "sha256:4b1f0883cb9d8ee963cf0a31c87341e9e758abb2cf1e5bcc0d7b066ef6b17573", - "sha256:4cce25c6e7ff7399c67dfe1b5423c36c391cf9b4b2be390c1675ab410f1ef503", - "sha256:51a2424c8ed80e60bdb9a896806e7adaf24a58253b326fbad10f80a6d06f2214", - "sha256:5706b785ca289fdfd91aa05066619e51d140613b613e35932601f2315f5d8470", - "sha256:58f0435f052cb60f1472c77f52a8f6642f8877b70559e5e0b9a1744f33f5cbe5", - "sha256:63e1d5ca9e5e1984f1a275276991b036e25d39d37dd7edbb3f4f6165c2da7dbb", - "sha256:64b2c35824da3ef6bb1e722216e4ef28802af6413c7586136500e343d34ba179", - "sha256:6f791987899532305126309578727c0197bddbafab9596bafe3e7bfab6e1ce13", - "sha256:72bd766f753fd32f072d30d7bc2ad492d56dbcbf3e13764e27635d5c41079339", - "sha256:7413080b381766a22d52814edb65631f0e323a7cea945c70021a672f38acc73f", - "sha256:78a67ee4845440e81cfbfabde20537ca12051d0eeac951fe4c6d8751feac3103", - "sha256:7994c044bf659b0a24ad7673ec7db85c2fadb87e4980a379a9fd5b086fe3649a", - "sha256:7dc4002f0a0a688774ef04878afe769ecd1ac21fe9b4b1d7125e2cf16170afd3", - "sha256:854bd87cc23824d5db4983956bc30f3790e1c7448f1a9e6a8fb7bff7601aef87", - "sha256:8608316d0cc01f8b25111c8adfe6efbc959cbba037a62c784551568d7ffbf280", - "sha256:8f5fcc87b48fc3dd6d901669c89af4feeb856dffb6f671539a238b7e8af1799c", - "sha256:937147086e8b4338bf139ca8fa98da650e3a46bf2ca617f8e9dd68c3971ec420", - "sha256:bc294841f6c822714af362095b181a853f47ed5ce757354bd2e4776d579ff3a4", - "sha256:bc6a88b0009a1b60eab5c22ac3a006f6968d6328de10c6a64ebb0d64a05548d3", - "sha256:c5eae911cf26b3c7eda889ec98d3c226f312c587acfaaf02602473f98b4c16d6", - "sha256:cca33a01a5987c650b87a1a910aa311ffa44e67cca1ff502ef9efdae5d9a8624", - "sha256:d1ae77b79fd5e27a10ba7c4e7c3a62927b9d29a4dccf28f6905c25d983aaf183", - "sha256:fb36064047e6bf87b6320a9b6eb7f525ef6863c7a4aef1a84a4bbfb043612617", - "sha256:fc1a19d95649439dbd50baca676bceb29bbfcd600aed2c5bd71d9bad82a87cfe" - ], - "version": "==1.2.0" + "sha256:03b1e0775edbe6a4c64effb05fff2ce1429b76d29d754aa5ee2d848b60033351", + "sha256:09d008237baabf52a5d4f5a6fcf9b3c03408f3f61a69c404472a16861a73917e", + "sha256:10325f0ffac2400b1ec09537b7e403419dcd25d9fee602a44e8a32119af9079e", + "sha256:1db9f964ed9c52dc5bd6127f0dd90ac89791daa690a5665cc01eae185912e1ba", + "sha256:409846be9d6bdcbd78b9e5afe2f64b2da5a923dd7c1cd0615ce589489533fdbb", + "sha256:4907040f62b91c2e170359c3d36c000af783f0fa1516a83d6c1517cde0af5340", + "sha256:6c0543f2fdd38dee631fb023c0f31c284a532d205590b393d72009c14847f5b1", + "sha256:826b9f5fbb7f908a13aa1efd4b7321e36992f5868d5d8311c7b40cf9b11ca0e7", + "sha256:a7695a378c2ce402405ea37b12c7a338a8755e081869bd6b95858893ceb617ae", + "sha256:a84c31e8409b420c3ca57fd30c7589378d6fdc8d155d866a7f8e6e80dec6fd06", + "sha256:adadeeae5500de0da2b9e8dd478520d0a9945b577b2198f2462555e68f58e7ef", + "sha256:b283a76a83fe463c9587a2c88003f800e08c3929dfbeba833b78260f9c209785", + "sha256:c19a7389ab3cd712058a8c3c9ffd8d27a57f3d84b9c91a931f542682bb3d269d", + "sha256:c3bb4bd2aca82fb498247deeac12265921fe231502a6bc6edea3ee7fe6c40a7a", + "sha256:c5ea60ece0c0c1c849025bfc541b60a6751b491b6f11dd9ef37ab5b8c9041921", + "sha256:db61a640ca20f237317d27bc658c1fc54c7581ff7f6502d112922dc285bdabee" + ], + "version": "==1.3.0" }, "simplejson": { "hashes": [ @@ -853,13 +833,6 @@ ], "version": "==3.16.0" }, - "singledispatch": { - "hashes": [ - "sha256:5b06af87df13818d14f08a028e42f566640aef80805c3b50c5056b086e3c2b9c", - "sha256:833b46966687b3de7f438c761ac475213e53b306740f1abfaa86e1d1aae56aa8" - ], - "version": "==3.4.0.3" - }, "six": { "hashes": [ "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", @@ -951,10 +924,10 @@ }, "tinydb": { "hashes": [ - "sha256:24b3d4a9611e9953fd57caf063ede6d20abfa0886289fa251f5933082c605dca", - "sha256:54f6b52fc9bc8378ea29b60e8d93c58f0f4b580a0a3b345810fbc2375baa7655" + "sha256:260b1f69168a24518af63f0270c72dc026476607016a0105aef6a966d8d2fbdc", + "sha256:a05c4c81e6e867c4f8a2e51c5236d0d897019aa5e9296f5947455b0bdd3c519d" ], - "version": "==3.12.2" + "version": "==3.13.0" }, "toolz": { "hashes": [ @@ -964,16 +937,17 @@ }, "tqdm": { "hashes": [ - "sha256:13f018038711256ed27aae118a80d63929588e90f00d072a0f4eb7aa3333b4dc", - "sha256:dd60ea2567baa013c625153ce41fd274209c69a5814513e1d635f20e5cd61b97" + "sha256:0a860bf2683fdbb4812fe539a6c22ea3f1777843ea985cb8c3807db448a0f7ab", + "sha256:e288416eecd4df19d12407d0c913cbf77aa8009d7fddb18f632aded3bdbdda6b" ], - "version": "==4.30.0" + "version": "==4.32.1" }, "twisted": { "hashes": [ - "sha256:294be2c6bf84ae776df2fc98e7af7d6537e1c5e60a46d33c3ce2a197677da395" + "sha256:1708e1928ae84ec9d3ebab0d427e20e1e38ff721b15bbced476d047d4a43abbe", + "sha256:3716eca1c80ef88729a85e9a70f09acce8df2adf7c58590d54c94f383945bc47" ], - "version": "==18.9.0" + "version": "==19.2.0" }, "typing": { "hashes": [ @@ -991,26 +965,26 @@ }, "urllib3": { "hashes": [ - "sha256:61bf29cada3fc2fbefad4fdf059ea4bd1b4a86d2b6d15e1c7c0b582b9752fe39", - "sha256:de9529817c93f27c8ccbfead6985011db27bd0ddfcdb2d86f3f663385c6a9c22" + "sha256:b246607a25ac80bedac05c6f282e3cdaf3afb65420fd024ac94435cabe6e18d1", + "sha256:dbe59173209418ae49d485b87d1681aefa36252ee85884c31346debd19463232" ], "markers": "python_version >= '3.4'", - "version": "==1.24.1" + "version": "==1.25.3" }, "werkzeug": { "hashes": [ - "sha256:c3fd7a7d41976d9f44db327260e263132466836cef6f91512889ed60ad26557c", - "sha256:d5da73735293558eb1651ee2fddc4d0dedcfa06538b8813a2e20011583c9e49b" + "sha256:865856ebb55c4dcd0630cdd8f3331a1847a819dda7e8c750d3db6f2aa6c0209c", + "sha256:a0b915f0815982fb2a09161cb8f31708052d0951c3ba433ccc5e1aa276507ca6" ], - "version": "==0.14.1" + "version": "==0.15.4" }, "wheel": { "hashes": [ - "sha256:029703bf514e16c8271c3821806a1c171220cc5bdd325cbf4e7da1e056a01db6", - "sha256:1e53cdb3f808d5ccd0df57f964263752aa74ea7359526d3da6c02114ec1e1d44" + "sha256:5e79117472686ac0c4aef5bad5172ea73a1c2d1646b808c35926bd26bdfb0c08", + "sha256:62fcfa03d45b5b722539ccbc07b190e4bfff4bb9e3a4d470dd9f6a0981002565" ], "markers": "python_version >= '3'", - "version": "==0.32.3" + "version": "==0.33.4" }, "wrapt": { "hashes": [ @@ -1056,40 +1030,40 @@ "develop": { "coverage": { "hashes": [ - "sha256:09e47c529ff77bf042ecfe858fb55c3e3eb97aac2c87f0349ab5a7efd6b3939f", - "sha256:0a1f9b0eb3aa15c990c328535655847b3420231af299386cfe5efc98f9c250fe", - "sha256:0cc941b37b8c2ececfed341444a456912e740ecf515d560de58b9a76562d966d", - "sha256:10e8af18d1315de936d67775d3a814cc81d0747a1a0312d84e27ae5610e313b0", - "sha256:1b4276550b86caa60606bd3572b52769860a81a70754a54acc8ba789ce74d607", - "sha256:1e8a2627c48266c7b813975335cfdea58c706fe36f607c97d9392e61502dc79d", - "sha256:2b224052bfd801beb7478b03e8a66f3f25ea56ea488922e98903914ac9ac930b", - "sha256:447c450a093766744ab53bf1e7063ec82866f27bcb4f4c907da25ad293bba7e3", - "sha256:46101fc20c6f6568561cdd15a54018bb42980954b79aa46da8ae6f008066a30e", - "sha256:4710dc676bb4b779c4361b54eb308bc84d64a2fa3d78e5f7228921eccce5d815", - "sha256:510986f9a280cd05189b42eee2b69fecdf5bf9651d4cd315ea21d24a964a3c36", - "sha256:5535dda5739257effef56e49a1c51c71f1d37a6e5607bb25a5eee507c59580d1", - "sha256:5a7524042014642b39b1fcae85fb37556c200e64ec90824ae9ecf7b667ccfc14", - "sha256:5f55028169ef85e1fa8e4b8b1b91c0b3b0fa3297c4fb22990d46ff01d22c2d6c", - "sha256:6694d5573e7790a0e8d3d177d7a416ca5f5c150742ee703f3c18df76260de794", - "sha256:6831e1ac20ac52634da606b658b0b2712d26984999c9d93f0c6e59fe62ca741b", - "sha256:77f0d9fa5e10d03aa4528436e33423bfa3718b86c646615f04616294c935f840", - "sha256:828ad813c7cdc2e71dcf141912c685bfe4b548c0e6d9540db6418b807c345ddd", - "sha256:85a06c61598b14b015d4df233d249cd5abfa61084ef5b9f64a48e997fd829a82", - "sha256:8cb4febad0f0b26c6f62e1628f2053954ad2c555d67660f28dfb1b0496711952", - "sha256:a5c58664b23b248b16b96253880b2868fb34358911400a7ba39d7f6399935389", - "sha256:aaa0f296e503cda4bc07566f592cd7a28779d433f3a23c48082af425d6d5a78f", - "sha256:ab235d9fe64833f12d1334d29b558aacedfbca2356dfb9691f2d0d38a8a7bfb4", - "sha256:b3b0c8f660fae65eac74fbf003f3103769b90012ae7a460863010539bb7a80da", - "sha256:bab8e6d510d2ea0f1d14f12642e3f35cefa47a9b2e4c7cea1852b52bc9c49647", - "sha256:c45297bbdbc8bb79b02cf41417d63352b70bcb76f1bbb1ee7d47b3e89e42f95d", - "sha256:d19bca47c8a01b92640c614a9147b081a1974f69168ecd494687c827109e8f42", - "sha256:d64b4340a0c488a9e79b66ec9f9d77d02b99b772c8b8afd46c1294c1d39ca478", - "sha256:da969da069a82bbb5300b59161d8d7c8d423bc4ccd3b410a9b4d8932aeefc14b", - "sha256:ed02c7539705696ecb7dc9d476d861f3904a8d2b7e894bd418994920935d36bb", - "sha256:ee5b8abc35b549012e03a7b1e86c09491457dba6c94112a2482b18589cc2bdb9" + "sha256:3684fabf6b87a369017756b551cef29e505cb155ddb892a7a29277b978da88b9", + "sha256:39e088da9b284f1bd17c750ac672103779f7954ce6125fd4382134ac8d152d74", + "sha256:3c205bc11cc4fcc57b761c2da73b9b72a59f8d5ca89979afb0c1c6f9e53c7390", + "sha256:465ce53a8c0f3a7950dfb836438442f833cf6663d407f37d8c52fe7b6e56d7e8", + "sha256:48020e343fc40f72a442c8a1334284620f81295256a6b6ca6d8aa1350c763bbe", + "sha256:5296fc86ab612ec12394565c500b412a43b328b3907c0d14358950d06fd83baf", + "sha256:5f61bed2f7d9b6a9ab935150a6b23d7f84b8055524e7be7715b6513f3328138e", + "sha256:68a43a9f9f83693ce0414d17e019daee7ab3f7113a70c79a3dd4c2f704e4d741", + "sha256:6b8033d47fe22506856fe450470ccb1d8ba1ffb8463494a15cfc96392a288c09", + "sha256:7ad7536066b28863e5835e8cfeaa794b7fe352d99a8cded9f43d1161be8e9fbd", + "sha256:7bacb89ccf4bedb30b277e96e4cc68cd1369ca6841bde7b005191b54d3dd1034", + "sha256:839dc7c36501254e14331bcb98b27002aa415e4af7ea039d9009409b9d2d5420", + "sha256:8f9a95b66969cdea53ec992ecea5406c5bd99c9221f539bca1e8406b200ae98c", + "sha256:932c03d2d565f75961ba1d3cec41ddde00e162c5b46d03f7423edcb807734eab", + "sha256:988529edadc49039d205e0aa6ce049c5ccda4acb2d6c3c5c550c17e8c02c05ba", + "sha256:998d7e73548fe395eeb294495a04d38942edb66d1fa61eb70418871bc621227e", + "sha256:9de60893fb447d1e797f6bf08fdf0dbcda0c1e34c1b06c92bd3a363c0ea8c609", + "sha256:9e80d45d0c7fcee54e22771db7f1b0b126fb4a6c0a2e5afa72f66827207ff2f2", + "sha256:a545a3dfe5082dc8e8c3eb7f8a2cf4f2870902ff1860bd99b6198cfd1f9d1f49", + "sha256:a5d8f29e5ec661143621a8f4de51adfb300d7a476224156a39a392254f70687b", + "sha256:aca06bfba4759bbdb09bf52ebb15ae20268ee1f6747417837926fae990ebc41d", + "sha256:bb23b7a6fd666e551a3094ab896a57809e010059540ad20acbeec03a154224ce", + "sha256:bfd1d0ae7e292105f29d7deaa9d8f2916ed8553ab9d5f39ec65bcf5deadff3f9", + "sha256:c62ca0a38958f541a73cf86acdab020c2091631c137bd359c4f5bddde7b75fd4", + "sha256:c709d8bda72cf4cd348ccec2a4881f2c5848fd72903c185f363d361b2737f773", + "sha256:c968a6aa7e0b56ecbd28531ddf439c2ec103610d3e2bf3b75b813304f8cb7723", + "sha256:df785d8cb80539d0b55fd47183264b7002077859028dfe3070cf6359bf8b2d9c", + "sha256:f406628ca51e0ae90ae76ea8398677a921b36f0bd71aab2099dfed08abd0322f", + "sha256:f46087bbd95ebae244a0eda01a618aff11ec7a069b15a3ef8f6b520db523dcf1", + "sha256:f8019c5279eb32360ca03e9fac40a12667715546eed5c5eb59eb381f2f501260", + "sha256:fc5f4d209733750afd2714e9109816a29500718b32dd9a5db01c0cb3a019b96a" ], "index": "pypi", - "version": "==4.5.2" + "version": "==4.5.3" }, "entrypoints": { "hashes": [ @@ -1100,11 +1074,11 @@ }, "flake8": { "hashes": [ - "sha256:c3ba1e130c813191db95c431a18cb4d20a468e98af7a77e2181b68574481ad36", - "sha256:fd9ddf503110bf3d8b1d270e8c673aab29ccb3dd6abf29bae1f54e5116ab4a91" + "sha256:859996073f341f2670741b51ec1e67a01da142831aa1fdc6242dbf88dffbe661", + "sha256:a796a115208f5c03b18f332f7c11729812c8c3ded6c46319c59b53efd3819da8" ], "index": "pypi", - "version": "==3.7.5" + "version": "==3.7.7" }, "mccabe": { "hashes": [ @@ -1122,10 +1096,10 @@ }, "pyflakes": { "hashes": [ - "sha256:5e8c00e30c464c99e0b501dc160b13a14af7f27d4dffb529c556e30a159e231d", - "sha256:f277f9ca3e55de669fba45b7393a1449009cff5a37d1af10ebb76c52765269cd" + "sha256:17dbeb2e3f4d772725c777fabc446d5634d1038f234e77343108ce445ea69ce0", + "sha256:d976835886f8c5b31d47970ed689944a0262b5f3afa00a5a7b4dc81e5449f8a2" ], - "version": "==2.1.0" + "version": "==2.1.1" } } } diff --git a/bothub-nlp-nlu/bothub_nlp_nlu/evaluate.py b/bothub-nlp-nlu/bothub_nlp_nlu/evaluate.py new file mode 100644 index 00000000..10d23da2 --- /dev/null +++ b/bothub-nlp-nlu/bothub_nlp_nlu/evaluate.py @@ -0,0 +1,324 @@ +import logging +import json +import uuid + +from rasa_nlu.training_data import Message +from rasa_nlu.training_data import TrainingData +from rasa_nlu.evaluate import ( + merge_labels, + align_all_entity_predictions, + substitute_labels, + get_evaluation_metrics, + is_intent_classifier_present, + get_entity_targets, + get_entity_extractors, + get_intent_targets, + plot_intent_confidences, + plot_confusion_matrix, + get_intent_predictions, + get_entity_predictions, + _targets_predictions_from, +) + +from bothub.common.models import RepositoryEntity +from bothub.common.models import RepositoryEvaluateResult +from bothub.common.models import RepositoryEvaluateResultScore +from bothub.common.models import RepositoryEvaluateResultEntity +from bothub.common.models import RepositoryEvaluateResultIntent + +from .utils import update_interpreters + +logger = logging.getLogger(__name__) + +excluded_itens = [ + 'micro avg', + 'macro avg', + 'weighted avg', + 'no_entity', + 'no predicted', +] + + +def remove_empty_intent_examples(intent_results): + filtered = [] + for r in intent_results: + if r.prediction is None: + r = r._replace(prediction='no predicted') + + if r.target != '' and r.target is not None: + filtered.append(r) + + return filtered + + +def collect_nlu_successes(intent_results): + successes = [{'text': r.message, + 'intent': r.target, + 'intent_prediction': {'name': r.prediction, + 'confidence': r.confidence, + }, + 'status': 'success'} + for r in intent_results if r.target == r.prediction] + return successes + + +def collect_nlu_errors(intent_results): + errors = [{'text': r.message, + 'intent': r.target, + 'intent_prediction': {'name': r.prediction, + 'confidence': r.confidence, + }, + 'status': 'error'} + for r in intent_results if r.target != r.prediction] + return errors + + +def evaluate_entities(targets, + predictions, + tokens, + extractors): # pragma: no cover + aligned_predictions = align_all_entity_predictions(targets, predictions, + tokens, extractors) + merged_targets = merge_labels(aligned_predictions) + merged_targets = substitute_labels(merged_targets, 'O', 'no_entity') + + for extractor in extractors: + merged_predictions = merge_labels(aligned_predictions, extractor) + merged_predictions = substitute_labels( + merged_predictions, 'O', 'no_entity') + report, precision, f1, accuracy = get_evaluation_metrics( + merged_targets, merged_predictions, output_dict=True) + + result = { + 'report': report, + 'precision': precision, + 'f1_score': f1, + 'accuracy': accuracy + } + + return result + + +def evaluate_intents(intent_results): # pragma: no cover + intent_results = remove_empty_intent_examples(intent_results) + targets, predictions = _targets_predictions_from(intent_results) + + report, precision, f1, accuracy = get_evaluation_metrics( + targets, predictions, output_dict=True) + + log = collect_nlu_errors(intent_results) + \ + collect_nlu_successes(intent_results) + + predictions = [ + { + 'text': res.message, + 'intent': res.target, + 'predicted': res.prediction, + 'confidence': res.confidence + } for res in intent_results + ] + + return { + 'predictions': predictions, + 'report': report, + 'precision': precision, + 'f1_score': f1, + 'accuracy': accuracy, + 'log': log, + } + + +def plot_and_save_charts(update, intent_results): + import io + import boto3 + import matplotlib as mpl + mpl.use('Agg') + + import matplotlib.pyplot as plt + from sklearn.metrics import confusion_matrix + from sklearn.utils.multiclass import unique_labels + from botocore.exceptions import ClientError + from decouple import config + + aws_access_key_id = config('BOTHUB_NLP_AWS_ACCESS_KEY_ID', default='') + aws_secret_access_key = config( + 'BOTHUB_NLP_AWS_SECRET_ACCESS_KEY', default='') + aws_bucket_name = config('BOTHUB_NLP_AWS_S3_BUCKET_NAME', default='') + aws_region_name = config('BOTHUB_NLP_AWS_REGION_NAME', 'us-east-1') + + confmat_url = '' + intent_hist_url = '' + + if all([aws_access_key_id, aws_secret_access_key, aws_bucket_name]): + confmat_filename = 'repository_{}/confmat_{}.png'.format( + update.id, uuid.uuid4()) + intent_hist_filename = 'repository_{}/intent_hist_{}.png'.format( + update.id, uuid.uuid4()) + + intent_results = remove_empty_intent_examples(intent_results) + targets, predictions = _targets_predictions_from(intent_results) + + cnf_matrix = confusion_matrix(targets, predictions) + labels = unique_labels(targets, predictions) + plot_confusion_matrix(cnf_matrix, classes=labels, + title='Intent Confusion matrix') + + chart = io.BytesIO() + fig = plt.gcf() + fig.set_size_inches(20, 20) + fig.savefig(chart, format='png', bbox_inches='tight') + chart.seek(0) + + s3_client = boto3.client('s3', + aws_access_key_id=aws_access_key_id, + aws_secret_access_key=aws_secret_access_key, + region_name=aws_region_name, + ) + try: + s3_client.upload_fileobj(chart, aws_bucket_name, confmat_filename, + ExtraArgs={ + 'ContentType': 'image/png'}) + confmat_url = '{}/{}/{}'.format(s3_client.meta.endpoint_url, + aws_bucket_name, confmat_filename) + except ClientError as e: + logger.error(e) + + plot_intent_confidences(intent_results, None) + chart = io.BytesIO() + fig = plt.gcf() + fig.set_size_inches(10, 10) + fig.savefig(chart, format='png', bbox_inches='tight') + chart.seek(0) + + try: + s3_client.upload_fileobj(chart, aws_bucket_name, + intent_hist_filename, + ExtraArgs={ + 'ContentType': 'image/png'}) + intent_hist_url = '{}/{}/{}'.format(s3_client.meta.endpoint_url, + aws_bucket_name, + intent_hist_filename) + except ClientError as e: + logger.error(e) + + return { + 'matrix_chart': confmat_url, + 'confidence_chart': intent_hist_url, + } + + +def entity_rasa_nlu_data(entity, evaluate): + return { + 'start': entity.start, + 'end': entity.end, + 'value': evaluate.text[entity.start:entity.end], + 'entity': entity.entity.value, + } + + +def evaluate_update(update, by): + evaluations = update.repository.evaluations(language=update.language) + + training_examples = [ + Message.build( + text=evaluate.get_text(update.language), + intent=evaluate.intent, + entities=[ + entity_rasa_nlu_data(evaluate_entity, evaluate) + for evaluate_entity in evaluate.get_entities( + update.language)]) + for evaluate in evaluations + ] + + test_data = TrainingData(training_examples=training_examples) + interpreter = update_interpreters.get(update, use_cache=False) + extractor = get_entity_extractors(interpreter) + entity_predictions, tokens = get_entity_predictions(interpreter, + test_data) + + result = { + 'intent_evaluation': None, + 'entity_evaluation': None + } + + if is_intent_classifier_present(interpreter): + intent_targets = get_intent_targets(test_data) + intent_results = get_intent_predictions( + intent_targets, interpreter, test_data) + + result['intent_evaluation'] = evaluate_intents(intent_results) + + if extractor: + entity_targets = get_entity_targets(test_data) + result['entity_evaluation'] = evaluate_entities(entity_targets, + entity_predictions, + tokens, + extractor) + + intent_evaluation = result.get('intent_evaluation') + entity_evaluation = result.get('entity_evaluation') + + intents_score = RepositoryEvaluateResultScore.objects.create( + precision=intent_evaluation.get('precision'), + f1_score=intent_evaluation.get('f1_score'), + accuracy=intent_evaluation.get('accuracy'), + ) + + entities_score = RepositoryEvaluateResultScore.objects.create( + precision=entity_evaluation.get('precision'), + f1_score=entity_evaluation.get('f1_score'), + accuracy=entity_evaluation.get('accuracy'), + ) + + charts = plot_and_save_charts(update, intent_results) + evaluate_result = RepositoryEvaluateResult.objects.create( + repository_update=update, + entity_results=entities_score, + intent_results=intents_score, + matrix_chart=charts.get('matrix_chart'), + confidence_chart=charts.get('confidence_chart'), + log=json.dumps(intent_evaluation.get('log')), + ) + + intent_reports = intent_evaluation.get('report') + entity_reports = entity_evaluation.get('report') + + for intent_key in intent_reports.keys(): + if intent_key and intent_key not in excluded_itens: + intent = intent_reports.get(intent_key) + intent_score = RepositoryEvaluateResultScore.objects.create( + precision=intent.get('precision'), + recall=intent.get('recall'), + f1_score=intent.get('f1-score'), + support=intent.get('support'), + ) + + RepositoryEvaluateResultIntent.objects.create( + intent=intent_key, + evaluate_result=evaluate_result, + score=intent_score, + ) + + for entity_key in entity_reports.keys(): + if entity_key and entity_key not in excluded_itens: + entity = entity_reports.get(entity_key) + entity_score = RepositoryEvaluateResultScore.objects.create( + precision=entity.get('precision'), + recall=entity.get('recall'), + f1_score=entity.get('f1-score'), + support=entity.get('support'), + ) + + RepositoryEvaluateResultEntity.objects.create( + entity=RepositoryEntity.objects.get( + repository=update.repository, + value=entity_key, + create_entity=False), + evaluate_result=evaluate_result, + score=entity_score, + ) + + return { + 'id': evaluate_result.id, + 'version': evaluate_result.version, + } diff --git a/bothub-nlp-nlu/bothub_nlp_nlu/parse.py b/bothub-nlp-nlu/bothub_nlp_nlu/parse.py index 4f0a5c11..d8456b12 100644 --- a/bothub-nlp-nlu/bothub_nlp_nlu/parse.py +++ b/bothub-nlp-nlu/bothub_nlp_nlu/parse.py @@ -8,7 +8,7 @@ def order_by_confidence(l): return sorted( l, - key=lambda x: x.get('confidence'), + key=lambda x: (x.get('confidence') is not None, x.get('confidence')), reverse=True) @@ -79,7 +79,7 @@ def format_parse_output(update, r): ), ( 'entities_list', - list(set([ + list(OrderedDict.fromkeys([ x.get('entity') for x in extracted_entities ])), diff --git a/bothub-nlp-nlu/bothub_nlp_nlu/tests/test_evaluate.py b/bothub-nlp-nlu/bothub_nlp_nlu/tests/test_evaluate.py new file mode 100644 index 00000000..d7cfa219 --- /dev/null +++ b/bothub-nlp-nlu/bothub_nlp_nlu/tests/test_evaluate.py @@ -0,0 +1,71 @@ +from django.test import TestCase + +from ..evaluate import evaluate_update +from ..train import train_update + +from bothub.authentication.models import User +from bothub.common.models import Repository +from bothub.common.models import RepositoryEvaluate +from bothub.common.models import RepositoryEvaluateEntity +from bothub.common import languages + +from .utils import fill_examples +from .utils import EXAMPLES_MOCKUP +# from .utils import EXAMPLES_WITH_LABEL_MOCKUP + + +class EvaluateTestCase(TestCase): + + def setUp(self): + self.user = User.objects.create( + email='fake@user.com', + nickname='fake') + self.repository = Repository.objects.create( + owner=self.user, + slug='test', + name='Testing', + language=languages.LANGUAGE_EN) + + def test_evaluate(self): + fill_examples(EXAMPLES_MOCKUP, self.repository) + update = self.repository.current_update() + train_update(update, self.user) + + evalute_1 = RepositoryEvaluate.objects.create( + repository_update=update, + text='hello, my name is Douglas', + intent='greet') + + evalute_2 = RepositoryEvaluate.objects.create( + repository_update=update, + text='hello', + intent='greet') + + RepositoryEvaluate.objects.create( + repository_update=update, + text='bye', + intent='goodbye') + + RepositoryEvaluate.objects.create( + repository_update=update, + text='hey', + intent='greet') + + RepositoryEvaluate.objects.create( + repository_update=update, + text='test evaluate with rasa and spacy', + intent='goodbye') + + RepositoryEvaluateEntity.objects.create( + repository_evaluate=evalute_1, + start=18, + end=25, + entity='name') + + RepositoryEvaluateEntity.objects.create( + repository_evaluate=evalute_2, + start=0, + end=5, + entity='greet') + + evaluate_update(update, self.user) diff --git a/bothub-nlp-nlu/bothub_nlp_nlu/tests/test_parse.py b/bothub-nlp-nlu/bothub_nlp_nlu/tests/test_parse.py index 285ae608..87273fed 100644 --- a/bothub-nlp-nlu/bothub_nlp_nlu/tests/test_parse.py +++ b/bothub-nlp-nlu/bothub_nlp_nlu/tests/test_parse.py @@ -14,6 +14,7 @@ from .utils import fill_examples from .utils import EXAMPLES_MOCKUP from .utils import EXAMPLES_WITH_LABEL_MOCKUP +from .utils import EXAMPLES_WITH_SPACY_NER_MOCKUP BASE_DIR = os.path.dirname(os.path.realpath(__file__)) @@ -85,6 +86,63 @@ def test_parse_label_self(self): self.assertEqual(animal_label[0].get('entity'), 'animal') +class ParseWithSpacyNERTestCase(TestCase): + def setUp(self): + self.user = User.objects.create( + email='fake@user.com', + nickname='fake') + self.repository = Repository.objects.create( + owner=self.user, + slug='test', + name='Testing', + language=languages.LANGUAGE_PT) + fill_examples(EXAMPLES_WITH_SPACY_NER_MOCKUP, self.repository) + self.update = self.repository.current_update() + train_update(self.update, self.user) + + def test_parse_name_entities_disabled(self): + response = parse_text( + self.update, + 'Meu nome é João e eu gosto de gatos', + use_cache=False) + self.assertListEqual( + response.get('entities_list'), + ['cat']) + self.assertIsNone( + response.get('entities').get('animal')[0].get('self')) + + def test_parse_name_entities_enabled(self): + self.repository.use_name_entities = True + self.repository.save() + + self.update = self.repository.current_update() + train_update(self.update, self.user) + + response = parse_text( + self.update, + 'Meu nome é João e eu gosto de gatos', + use_cache=False) + self.assertListEqual( + response.get('entities_list'), + ['cat', 'PER']) + + def test_parse_name_entities_enabled_nn(self): + self.repository.use_name_entities = True + self.repository.algorithm = Repository.ALGORITHM_NEURAL_NETWORK_INTERNAL + self.repository.save() + + self.update = self.repository.current_update() + train_update(self.update, self.user) + + response = parse_text( + self.update, + 'Meu nome é João e eu gosto de gatos', + use_cache=False) + self.assertListEqual( + response.get('entities_list'), + ['cat', 'PER']) + + class TestFormatParseOutput(TestCase): def setUp(self): self.user = User.objects.create( diff --git a/bothub-nlp-nlu/bothub_nlp_nlu/tests/utils.py b/bothub-nlp-nlu/bothub_nlp_nlu/tests/utils.py index 3756b105..aae35239 100644 --- a/bothub-nlp-nlu/bothub_nlp_nlu/tests/utils.py +++ b/bothub-nlp-nlu/bothub_nlp_nlu/tests/utils.py @@ -160,6 +160,69 @@ }, ] +EXAMPLES_WITH_SPACY_NER_MOCKUP = [ + { + 'text': 'Minha irmã ama cachorros', + 'intent': '', + 'entities': [ + { + 'start': 15, + 'end': 24, + 'entity': 'dog', + 'label': 'animal', + }, + ], + }, + { + 'text': 'Eu gosto de tartarugas', + 'intent': '', + 'entities': [ + { + 'start': 12, + 'end': 22, + 'entity': 'tartarugas', + 'label': 'animal', + }, + ], + }, + { + 'text': 'Meu pai ama gatos', + 'intent': '', + 'entities': [ + { + 'start': 12, + 'end': 17, + 'entity': 'cat', + 'label': 'animal', + }, + ], + }, + { + 'text': 'Minha tia ama gatos', + 'intent': '', + 'entities': [ + { + 'start': 14, + 'end': 19, + 'entity': 'cat', + 'label': 'animal', + }, + ], + }, + { + 'text': 'Minha irmã ama cachorros', + 'intent': '', + 'entities': [ + { + 'start': 15, + 'end': 24, + 'entity': 'dog', + 'label': 'animal', + }, + ], + }, +] + def fill_examples(examples_mockup, repository, language=None): for example_mockup in examples_mockup: diff --git a/bothub-nlp-nlu/bothub_nlp_nlu/utils.py b/bothub-nlp-nlu/bothub_nlp_nlu/utils.py index 00552a7b..991fa5af 100644 --- a/bothub-nlp-nlu/bothub_nlp_nlu/utils.py +++ b/bothub-nlp-nlu/bothub_nlp_nlu/utils.py @@ -22,6 +22,9 @@ def get_rasa_nlu_config_from_update(update): pipeline.append({'name': 'intent_entity_featurizer_regex'}) pipeline.append({'name': 'intent_featurizer_spacy'}) pipeline.append({'name': 'ner_crf'}) + # spacy named entity recognition + if update.use_name_entities: + pipeline.append({'name': 'ner_spacy'}) pipeline.append({'name': 'crf_label_as_entity_extractor'}) pipeline.append({'name': 'intent_classifier_sklearn'}) else: @@ -44,6 +47,9 @@ def get_rasa_nlu_config_from_update(update): }) # entity extractor pipeline.append({'name': 'ner_crf'}) + # spacy named entity recognition + if update.use_name_entities: + pipeline.append({'name': 'ner_spacy'}) # label extractor pipeline.append({'name': 'crf_label_as_entity_extractor'}) return RasaNLUModelConfig({ diff --git a/bothub-nlp-nlu/setup.py b/bothub-nlp-nlu/setup.py index 61b95d4e..379701fa 100644 --- a/bothub-nlp-nlu/setup.py +++ b/bothub-nlp-nlu/setup.py @@ -7,7 +7,7 @@ description='Bothub NLP NLU', packages=find_packages(), dependency_links=[ - 'git+https://github.com/Ilhasoft/bothub-engine@1.19.1#egg=bothub-en' + + 'git+https://github.com/Ilhasoft/bothub-engine@1.21.0#egg=bothub-en' + 'gine', ], install_requires=[ diff --git a/bothub-nlp/setup.py b/bothub-nlp/setup.py index 74750993..401fbdfc 100644 --- a/bothub-nlp/setup.py +++ b/bothub-nlp/setup.py @@ -7,7 +7,7 @@ description='Bothub NLP Common', packages=find_packages(), dependency_links=[ - 'git+https://github.com/Ilhasoft/bothub-engine@1.19.1#egg=bothub-en' + + 'git+https://github.com/Ilhasoft/bothub-engine@1.21.0#egg=bothub-en' + 'gine', ], install_requires=[ diff --git a/docker-compose.yml b/docker-compose.yml index a8686a75..4c253a5c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -50,6 +50,10 @@ services: - bothub environment: - SUPPORTED_LANGUAGES=${SUPPORTED_LANGUAGES:-en|pt} + # bothub-nlp aws to save charts + - BOTHUB_NLP_AWS_S3_BUCKET_NAME=${BOTHUB_NLP_AWS_S3_BUCKET_NAME} + - BOTHUB_NLP_AWS_ACCESS_KEY_ID=${BOTHUB_NLP_AWS_ACCESS_KEY_ID} + - BOTHUB_NLP_AWS_SECRET_ACCESS_KEY=${BOTHUB_NLP_AWS_SECRET_ACCESS_KEY} # bothub-engine env vars - SECRET_KEY=${SECRET_KEY:-SK} - DEBUG=${DEBUG:-true} @@ -79,6 +83,10 @@ services: - /var/run/docker.sock:/var/run/docker.sock:ro environment: - SUPPORTED_LANGUAGES=${SUPPORTED_LANGUAGES:-en|pt} + # bothub-nlp aws to save charts + - BOTHUB_NLP_AWS_S3_BUCKET_NAME=${BOTHUB_NLP_AWS_S3_BUCKET_NAME} + - BOTHUB_NLP_AWS_ACCESS_KEY_ID=${BOTHUB_NLP_AWS_ACCESS_KEY_ID} + - BOTHUB_NLP_AWS_SECRET_ACCESS_KEY=${BOTHUB_NLP_AWS_SECRET_ACCESS_KEY} # bothub-engine env vars - SECRET_KEY=${SECRET_KEY:-SK} - DEBUG=${DEBUG:-true}