当前位置: 首页 > article >正文

BERT的中文问答系统26

为了确保代码的有效性和功能性,我们将进行以下改进:

日志记录:确保日志记录的路径正确,并且能够正确记录。
数据加载:优化数据加载过程,确保能够处理各种异常情况。
模型训练:确保模型训练过程中能够正确更新进度条,并且在训练完成后保存模型。
GUI界面:优化GUI界面,使其更加用户友好,并且增加一些提示信息。
以下是改进后的代码:

python

import os
import json
import jsonlines
import torch
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader
from transformers import BertModel, BertTokenizer
import tkinter as tk
from tkinter import filedialog, messagebox, ttk
import logging
from difflib import SequenceMatcher
from datetime import datetime

# 获取项目根目录
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))

# 配置日志
LOGS_DIR = os.path.join(PROJECT_ROOT, 'logs')
os.makedirs(LOGS_DIR, exist_ok=True)

def setup_logging():
    log_file = os.path.join(LOGS_DIR, datetime.now().strftime('%Y-%m-%d_%H-%M-%S_羲和.txt'))
    logging.basicConfig(
        level=logging.INFO,
        format='%(asctime)s - %(levelname)s - %(message)s',
        handlers=[
            logging.FileHandler(log_file),
            logging.StreamHandler()
        ]
    )

setup_logging()

# 数据集类
class XihuaDataset(Dataset):
    def __init__(self, file_path, tokenizer, max_length=128):
        self.tokenizer = tokenizer
        self.max_length = max_length
        self.data = self.load_data(file_path)

    def load_data(self, file_path):
        data = []
        if file_path.endswith('.jsonl'):
            with jsonlines.open(file_path) as reader:
                for i, item in enumerate(reader):
                    try:
                        data.append(item)
                    except jsonlines.jsonlines.InvalidLineError as e:
                        logging.warning(f"跳过无效行 {
     i + 1}: {
     e}")
        elif file_path.endswith('.json'):
            with open(file_path, 'r') as f:
                try:
                    data = json.load(f)
                except json.JSONDecodeError as e:
                    logging.warning(f"跳过无效文件 {
     file_path}: {
     e}")
        return data

    def __len__(self):
        return len(self.data)

    def __getitem__(self, idx):
        item = self.data[idx]
        question = item['question']
        human_answer = item['human_answers'][0]
        chatgpt_answer = item['chatgpt_answers'][0]

        try:
            inputs = self.tokenizer(question, return_tensors='pt', padding='max_length', truncation=True, max_length=self.max_length)
            human_inputs = self.tokenizer(human_answer, return_tensors='pt', padding='max_length', truncation=True, max_length=self.max_length)
            chatgpt_inputs = self.tokenizer(chatgpt_answer, return_tensors='pt', padding='max_length', truncation=True, max_length=self.max_length)
        except Exception as e:
            logging.warning(f"跳过无效项 {
     idx}: {
     e}")
            return self.__getitem__(

http://www.kler.cn/a/375002.html

相关文章:

  • Docker | 将本地项目发布到阿里云的实现流程
  • 游戏和各大APP改IP地址方法教程
  • day13:FTP服务
  • 两个时间戳计算时间差
  • 【C++】string 类模拟实现:深入探索字符串操作原理
  • 《战场车辆及部件损毁识别与评估的神经网络迁移训练》
  • 20241101编译Rockchip原厂的RK3566平台的Buildroot【使用荣品的DTS】
  • 91.【C语言】数据结构之单向链表的头删和尾删
  • MySQL 日志之 binlog 格式 → 关于 MySQL 默认隔离级别的探讨
  • 如何实现图片懒加载,原生 + React 实现方式
  • 数据库管理系统的ACID都各自是什么?
  • 遗传算法:AI 借鉴生物进化的优化方法
  • HTML练习题 :新闻列表 包含盒子模型,内边距,外边距,鼠标悬停
  • 数据结构模拟题[二]
  • scrapy爬取名人名言
  • 安卓基础001
  • .NET Core WebApi第4讲:控制器、路由
  • LeetCode每日一题3165---不包含相邻元素的子序列的最大和
  • 扩展el-table,实现当showOverflowTooltip时,鼠标可移入tooltip功能
  • 一个免费开源自托管的机器翻译项目,支持API接口
  • 建筑行业知识库搭建:好处、方法与注意事项
  • Chrome和Firefox哪款浏览器的密码管理更安全
  • C++第十讲:继承
  • LeetCode --- 421周赛
  • linux开机自启动三种方式
  • PySpark的使用