Example #1
0
    def get_response_statements(self):
        """
        Return only statements that are in response to another statement.
        A statement must exist which lists the closest matching statement in the
        in_response_to field. Otherwise, the logic adapter may find a closest
        matching statement that does not have a known response.
        """
        # '程序员涤生' 原来的逻辑是根据in_response_to字段来判断是否是问题,如果一个句子出现在了其他句子的in_response_to字段中,那么该句子可以做为问题,
        # 因此需要先查出in_response_to字段中的text,然后查出在这些text集合中的句子,做为问题,这样的效率非常慢,
        # 通过在句子中加入Q和A标记,我们可以利用正则来直接匹配出表示问题的句子,
        # 并且我们只返回text字段,大大提升了查询的效率。
        pattern = re.compile('^Q ')
        regex = Regex.from_native(pattern)
        # response_query = self.statements.find({'text': 'Q 今天天气怎么样?'}, {'text': 1})
        response_query = self.statements.find({'text': {'$regex': regex}}, {'text': 1})

        statement_objects = []
        statement_vec = []
        import datetime as dt
        starttime2 = dt.datetime.now()
        for r in response_query:
            try:
                # 此处考虑直接使用text对应的向量,从系统启动时就构建好的text-vec索引文件中获取
                text_vec_indx = IntentClassifier().text_vec_indx
                vec = text_vec_indx.get(r['text'],None)
                if vec is not None: # 注意:下面这两个数组一定要保证长度一样,否则计算相似度的时候根据索引来取原文本会出先位置偏移,导致无法获取正确的答案!!
                    statement_vec.append(vec)
                    statement_objects.append(self.mongo_to_object({'text': r['text']}))
            except Exception as e:
                logging.warning("出现异常%s,问题句子为:%s", str(e), r['text'])
        endtime2 = dt.datetime.now()
        logging.debug("===========get_response_statements的for循环构造向量耗时: %s秒", (endtime2 - starttime2).seconds)
        return statement_objects, statement_vec
Example #2
0
def learn_batch():
    """
    批量学习给定的问题和答案:
    重命名wait-learn.txt为learning.txt,读取learning.txt的内容进行学习
    :return:
    """
    _learn_new_batch_lock = threading.Lock()
    logging.debug("开始学习...")
    starttime = datetime.datetime.now()
    learn_path = path_configer.get_learn()
    wait_learn_path = "%s/%s" % (learn_path, "wait-learn.txt")
    learning_path = "%s/%s" % (learn_path, "learning.txt")
    with __record_lock:
        if os.path.exists(learning_path):
            # 若上一次的临时文件未能删除,就在这里删除。
            os.remove(learning_path)
            logging.info("=========发现上一次的临时文件未能删除,已删除!")
        if not os.path.exists(wait_learn_path):
            msg = "nothing"
            logging.info(msg)
            return msg
        os.rename(wait_learn_path, learning_path)
        logging.debug("重命名wait-learn.txt为learning.txt ...")
    with _learn_new_batch_lock:
        logging.debug("读取learning.txt的内容进行学习 ...")
        with codecs.open(learning_path, "r", encoding="utf-8") as fr:
            q = fr.readline().strip("\n\r")
            while q != "":
                a = fr.readline().strip("\n\r")
                assert a.strip("\n\r") != "", 'q,a,c格式无法匹配!缺少a!'
                c = fr.readline().strip("\n\r")
                assert c.strip("\n\r") != "", 'q,a,c格式无法匹配!缺少a!'
                # 添加q,a到指定的c类别文件;训练c对应的chatterbot
                logging.debug("添加%s,%s到指定的%s类别文件;训练对应的chatterbot ...", q, a, c)
                # 开始学习
                learn_(q, a, c[c.find(" ") + 1:])
                q = fr.readline().strip("\n\r")
        logging.debug("learning.txt学习全部完成...")
        logging.debug("完整的重新训练分类器模型 ...")
        IntentClassifier().full_retrain_clf()
        logging.debug("构建文本-向量索引文件,并存储 ...")
        IntentClassifier().build_text_vec_indx()
        logging.debug("加载文本向量索引文件 ...")
        IntentClassifier().load_text_vec_indx()
        # 删除临时的学习文件
        os.remove(learning_path)
        endtime = datetime.datetime.now()
        print("===========本次学习耗时: %s秒" % (endtime - starttime).seconds)
        logging.info("=========本次学习已全部完成!")
    return "success"
Example #3
0
def loadProjContext():
    # 加载自定义分词表
    SentenceProcesser()
    # 加载意图分类器实例
    intent_classifier = IntentClassifier()
    # 加载词汇反向索引
    replier_resource.w_i_dict = intent_classifier.load_word_index()
    # 加载分类器模型
    replier_resource.clf_ = intent_classifier.load_clf()
    # 预加载sf所有实例
    SF()
    # 预加载talk所有实例
    Talk()
    # 加载文本向量索引文件
    IntentClassifier().load_text_vec_indx()
Example #4
0
def reset():
    logging.debug("重新训练业务专业领域问答机器人...")
    train_sf_chatbot()
    logging.debug("重新训练闲聊机器人 ...")
    train_custom_chatbot()
    logging.debug("完整的重新训练分类器模型 ...")
    IntentClassifier().full_retrain_clf()
    return "success"
Example #5
0
 def test_evaluate_clf(self):
     clf = IntentClassifier().load_clf()
     clf.evaluate_clf(3)
Example #6
0
 def test_full_retrain_clf(self):
     print("完整的训练分类器模型...")
     IntentClassifier().full_retrain_clf()
Example #7
0
 def test_build_text_vec_indx(self):
     # 构建文本-向量索引文件,并存储
     IntentClassifier().build_text_vec_indx()