实现自学习系统,输入excel文件,能学习后进行相应回答

复制代码
import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity
from sentence_transformers import SentenceTransformer

'''
效果理想
'''

class SelfLearningQASystem:
    def __init__(self, excel_path):
        # 读取Excel文件
        self.df = pd.read_excel(excel_path)
        # 假定有 'question' 和 'answer' 两列
        self.questions = self.df['question'].astype(str).tolist()
        self.answers = self.df['answer'].astype(str).tolist()

        # 使用预训练的多语言句子嵌入模型
        self.model = SentenceTransformer(r'D:\modelproject\paraphrase-multilingual-MiniLM-L12-v2')
        # 将所有问题向量化
        self.question_vectors = self.model.encode(self.questions)

    def ask(self, user_question):
        # 将用户问题向量化
        user_vector = self.model.encode(user_question)

        # 确保向量是二维的
        if len(user_vector.shape) == 1:
            user_vector = user_vector.reshape(1, -1)

        # 如果question_vectors是一维的,转换为二维
        question_vectors = self.question_vectors
        if len(question_vectors.shape) == 1:
            question_vectors = question_vectors.reshape(1, -1)

        # 计算用户问题与所有已有问题的相似度
        similarities = cosine_similarity(user_vector, question_vectors)
        # print(similarities)
        # 找出最相似的问题的索引
        most_similar_idx = similarities.argmax()
        # print(most_similar_idx)
        max_similarity = similarities[0, most_similar_idx]
        print("问题相似度",max_similarity)
        # 可选择设置一个阈值,低于则认为没有匹配到
        threshold = 0.5  # 可调,根据实际情况调整
        if max_similarity < threshold:
            return "抱歉,我暂时无法回答这个问题。您可以更新我的知识库。"

        # 返回最相似问题对应的答案
        return self.answers[most_similar_idx]


    def add_qa_pair(self, new_question, new_answer, excel_path=None):
        # 自学习追加
        # 追加到内存
        self.questions.append(new_question)
        self.answers.append(new_answer)
        # 重新训练向量化
        self.question_vectors = self.model.encode(self.questions)
        # 可选:将新数据写入 Excel
        if excel_path:
            new_data = pd.DataFrame({
                'question': [new_question],
                'answer': [new_answer]
            })
            try:
                existing = pd.read_excel(excel_path)
                updated = pd.concat([existing, new_data], ignore_index=True)
                updated.to_excel(excel_path, index=False)
            except FileNotFoundError:
                new_data.to_excel(excel_path, index=False)


if __name__ == "__main__":
    # 初始化问答系统,传入你的Excel路径
    inputfile = "input.xlsx"
    qa_system = SelfLearningQASystem(inputfile)
    qa_system.add_qa_pair("今天周几","星期三",inputfile)
    print("=== 欢迎使用自学习问答系统,输入 '退出' 结束对话 ===")
    while True:
        user_input = input("\n你:")
        if user_input.strip() in ['退出', 'exit', 'quit']:
            print("系统:再见!")
            break
        answer = qa_system.ask(user_input)
        print(f"系统:{answer}")
相关推荐
赤月幼狼23 分钟前
clickhouse学习笔记(一)基础概念与架构
笔记·学习·clickhouse
时空无限1 小时前
conda 管理 python 版本和虚拟环境
python·conda
隔壁程序员老王1 小时前
基于 Python 的坦克大战小程序,使用 Pygame 库开发
python·小程序·pygame·1024程序员节
kaikaile19951 小时前
Java面试题总结
开发语言·python
周周记笔记1 小时前
Python及Ipython解释器
开发语言·python
Yupureki2 小时前
从零开始的C++学习生活 13:红黑树全面解析
c语言·数据结构·c++·学习·visual studio
AndrewHZ2 小时前
【图像处理基石】多光谱图片去噪入门:从概念到Python实操
图像处理·python·计算机视觉·图像去噪·多光谱
互联网中的一颗神经元2 小时前
小白python入门 - 6. Python 分支结构——逻辑决策的核心机制
开发语言·数据库·python
AhriProGramming3 小时前
Python学习快速上手文章推荐(持续更新)
开发语言·python·学习·1024程序员节
IDOlaoluo3 小时前
nginx-1.9.1.tar.gz 安装教程(详细步骤,从解压到启动)
开发语言·python