实现自学习系统,输入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}")
相关推荐
金銀銅鐵21 分钟前
[Python] 体验用欧几里得算法计算最大公约数的过程
python·数学
FreakStudio4 小时前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
用户0332126663675 小时前
使用 Python 从零创建 Word 文档
python
Csvn10 小时前
Python 两大经典坑点 —— 可变默认参数 & 闭包延迟绑定
后端·python
曲幽11 小时前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
用户5569188175313 小时前
#从脚本到独立程序:Python + Playwright 批量抓取的完整踩坑记录
python·自动化运维
兵慌码乱1 天前
基于 MediaPipe 与 PySide2 的手势交互音乐控制系统实现:轻量化视觉交互全流程解析
python·opencv·计算机视觉·人机交互·手势识别·mediapipe·pyside2
luckdewei1 天前
FastAPI 资产管理系统实战:复杂 ORM 关联、Alembic 迁移与 N+1 查询优化
python
aqi001 天前
15天学会AI应用开发(八)使用向量数据库实现RAG功能
人工智能·python·大模型·ai编程·ai应用