def generate( ctx_entities_path='input/ctx_entities.txt' ): """Generate ChatScript files""" input_files = list() dirname = os.path.dirname(os.path.abspath(__file__)) dirname = os.path.join(dirname, 'input') input_files = glob.glob('{}*.csv'.format(dirname+os.sep)) generetad_topics = list() cbow = wordembedding.CBoW() ctx_entities = load_file(ctx_entities_path) for questions_path in input_files: beaty_topic_name, questions = load_questions(questions_path) rules = generate_rules(questions, ctx_entities, cbow) sorted_rules = generalize_rules.sort_by_entities(rules, cbow) top_name = questions_path.split(os.sep)[-1].split('.')[0] topic = models.Topic(top_name, rules, beauty_name=beaty_topic_name) gen_rules = generalize_rules.generalize(topic, wordembedding) gen_topic = models.Topic(top_name+'_gen', gen_rules) topic.rules.extend(sorted_rules) generetad_topics.append(topic) generetad_topics.append(gen_topic) menu = generate_topic_menu(generetad_topics) generetad_topics.append(menu) postprocessing.save_chatbot_files('Botin', generetad_topics)
class TestTopics(object): cbow = wordembedding.CBoW() def test_get_topic_keywords(self): result = topics.get_topic_keywords([ ('*~1 loja [disponibiliza oferece] embalagem', 'oferecemos empacotamento grátis para você'), ('[utilizar usar] *~1 bicicleta', 'utilize nossas bicicletas à vontade') ]) expected = { 'empacotamento grátis', 'loja', 'embalagem', 'bicicleta', 'bicicletas' } assert result == expected
def get_plurals(word, cbow=None): if cbow is None: print('WORDEMBEDDING MODEL BEEN INSTANCED') cbow = wordembedding.CBoW() word_plurals = _get_word_plurals(word) plurals = list() for plural in word_plurals: try: sim = cbow.model.similarity(word, plural) except KeyError: sim = 0 plurals.append((plural, sim)) if plurals: plurals.sort(key=lambda p: p[1], reverse=True) return plurals[0][0] return None
class TestGeneralizeRules(object): cbow = wordembedding.CBoW() def test_group_by_similarity(self): groups = [ {'arroz', 'cachorro', 'feijão', 'montanha'}, {'bicicleta', 'cão'}, {'cadeira', 'w'}, {'parque', 'cachorrinho', 'comprar'}, ] result = generalize_rules.group_by_similarity(groups, self.cbow) assert result == [[0, 1, 3], [2]] def test_group_by_commom_words(self): groups = [ {'a', 's', 'd'}, {'z', 's', 'c'}, {'q', 'w', 'e'}, {'t', 's', 'y'}, ] result = generalize_rules.group_by_commom_words(groups) assert result == [[0, 1, 3], [2]] def test_group_rules(self): rules = [ 'localizo código vale_trocas', 'funciona postagem', 'quero postar produto', ] expected = [[1, 2], [0]] result = generalize_rules.group_rules(rules, self.cbow) assert result == expected def test_group_rules_dois(self): rules = [ 'como localizo o código do meu vale trocas?', 'como funciona a postagem?', 'quero postar meu produto.', 'a loja disponibiliza embalagem de presente?', 'onde solicitar a montagem de bicicleta?', 'posso utilizar o bike service para qualquer bicicleta?', 'o que é bike service?', 'o que é nota fiscal eletrônica?', 'como faço para resgatar a segunda via da nota fiscal?', ] expected = [[1, 2], [4, 5, 6], [8, 7], [0], [3]] result = generalize_rules.group_rules(rules, self.cbow) assert result == expected def test_get_group_reijoindes(self): rules = [ 'localizo *~1 código *~2 vale_trocas', 'funciona *~1 postagem', 'quero postar *~1 produto', 'loja [disponibiliza oferece disponibilizará disponibilizou] embalagem *~1 presente', 'onde [solicitar requerer pedir exigir] *~1 montagem *~1 bicicleta', 'é bike_service', 'central *~1 relacionamento', '[é seria foi era] nota fiscal eletrônica', 'faço *~1 [resgatar salvar capturar seduzir] *~1 segunda via *~1 nota fiscal', 'posso utilizar *~1 bike_service *~1 qualquer bicicleta' ] rules_ids = [1,2] generalize_rules.get_group_rejoinders(rules_ids, rules, rules)