BERT的中文问答体系56

[复制链接]
发表于 2025-12-5 11:04:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
对GUI举行优化,使其更加人性化和易用。以下是一些优化的实现:
布局优化:调解布局,使各个控件更加公道地分布,进步用户体验。
功能加强:增长一些辅助功能,如主动滚动谈天纪录、主动扫除输入框等。
视觉结果:改善视觉结果,利用更当代的样式和颜色。
交互性:增长更多的提示信息和反馈,利用户操纵更加直观。
以下是优化后的代码:
优化后的代码
  1. import os
  2. import json
  3. import jsonlines
  4. import torch
  5. import torch.optim as optim
  6. from torch.utils.data import Dataset, DataLoader
  7. from transformers import BertModel, BertTokenizer
  8. import tkinter as tk
  9. from tkinter import filedialog, messagebox, ttk, simpledialog
  10. import logging
  11. from difflib import SequenceMatcher
  12. from datetime import datetime
  13. import requests
  14. from bs4 import BeautifulSoup
  15. import tkcalendar
  16. # 获取项目根目录
  17. PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
  18. # 配置日志日志
  19. LOGS_DIR = os.path.join(PROJECT_ROOT, 'logs')
  20. os.makedirs(LOGS_DIR, exist_ok=True)
  21. def setup_logging():
  22.     log_file = os.path.join(LOGS_DIR, datetime.now().strftime('%Y-%m-%d_%H-%M-%S_羲和.txt'))
  23.     logging.basicConfig(
  24.         level=logging.INFO,
  25.         format='%(asctime)s - %(levelname)s - %(message)s',
  26.         handlers=[
  27.             logging.FileHandler(log_file),
  28.             logging.StreamHandler()
  29.         ]
  30.     )
  31. setup_logging()
  32. # 数据集类
  33. class XihuaDataset(Dataset):
  34.     def __init__(self, file_path, tokenizer, max_length=128):
  35.         self.tokenizer = tokenizer
  36.         self.max_length = max_length
  37.         self.data = self.load_data(file_path)
  38.     def load_data(self, file_path):
  39.         data = []
  40.         if file_path.endswith('.jsonl'):
  41.             with jsonlines.open(file_path) as reader:
  42.                 for i, item in enumerate(reader):
  43.                     try:
  44.                         data.append(item)
  45.                     except jsonlines.jsonlines.InvalidLineError as e:
  46.                         logging.warning(f"跳过无效行 {
  47.      
  48.      i + 1}: {
  49.      
  50.      e}")
  51.         elif file_path.endswith('.json'):
  52.             with open(file_path, 'r') as f:
  53.                 try:
  54.                     data = json.load(f)
  55.                 except json.JSONDecodeError as e:
  56.                     logging.warning(f"跳过无效文件 {
  57.      
  58.      file_path}: {
  59.      
  60.      e}")
  61.         return data
  62.     def __len__(self):
  63.         return len(self.data)
  64.     def __getitem__(self, idx):
  65.         item = self.data[idx]
  66.         question = item.get('question', '')
  67.         human_answer = item.get('human_answers', [''])[0]
  68.         chatgpt_answer = item.get('chatgpt_answers', [''])[0]
  69.         try:
  70.             inputs = self.tokenizer(question, return_tensors='pt', padding='max_length', truncation=True, max_length=self.max_length)
  71.             human_inputs = self.tokenizer(human_answer, return_tensors='pt', padding='max_length', truncation=True, max_length=self.max_length)
  72.             chatgpt_inputs = self.tokenizer(chatgpt_answer, return_tensors='pt', padding='max_length', truncation=True, max_length=self.max_length)
  73.         except Exception as e:
  74.             logging.warning(f"跳过无效项 {
  75.      
  76.      idx}: {
  77.      
  78.      e}")
  79.             return self.__getitem__((idx + 1) % len(self.data))
  80.         return {
  81.    
  82.    
  83.             'input_ids': inputs['input_ids'].squeeze(),
  84.             'attention_mask': inputs['attention_mask'].squeeze(),
  85.             'human_input_ids': human_inputs['input_ids'].squeeze(),
  86.             'human_attention_mask': human_inputs['attention_mask'].squeeze(),
  87.             'chatgpt_input_ids': chatgpt_inputs['input_ids'].squeeze(),
  88.             'chatgpt_attention_mask': chatgpt_inputs['attention_mask'].squeeze(),
  89.             'human_answer': human_answer,
  90.             'chatgpt_answer': chatgpt_answer
  91.         }
  92. # 获取数据加载器
  93. def get_data_loader(file_path, tokenizer, batch_size=8, max_length=128):
  94.     dataset = XihuaDataset(file_path, tokenizer, max_length)
  95.     return DataLoader(dataset, batch_size=batch_size, shuffle=True)
  96. # 模型定义
  97. class XihuaModel(torch.nn.Module):
  98.     def __init__(self, pretrained_model_name):
  99.         super(XihuaModel, self).__init__()
  100.         self.bert = BertModel.from_pretrained(pretrained_model_name)
  101.         self.classifier = torch.nn.Linear(self.bert.config.hidden_size, 1)
  102.     def forward(self, input_ids, attention_mask):
  103.         outputs = self.bert(input_ids=input_ids, attention_mask=attention_mask)
  104.         pooled_output = outputs.pooler_output
  105.         logits = self.classifier(pooled_output)
  106.         return logits
  107. # 训练函数
  108. def train(model, data_loader, optimizer, criterion, device, progress_var=None):
  109.     model.train()
  110.     total_loss = 0.0
  111.     num_batches = len(data_loader)
  112.     for batch_idx, batch in enumerate(data_loader):
  113.         try:
  114.             input_ids = batch['input_ids'].to(device)
  115.             attention_mask = batch['attention_mask'].to(device)
  116.             human_input_ids = batch['human_input_ids'].to(device)
  117.             human_attention_mask = batch['human_attention_mask'].to(device)
  118.             chatgpt_input_ids = batch['chatgpt_input_ids'].to(device)
  119.             chatgpt_attention_mask = batch['chatgpt_attention_mask'].to(device)
  120.             optimizer.zero_grad()
  121.             human_logits = model(human_input_ids, human_attention_mask)
  122.             chatgpt_logits = model(chatgpt_input_ids, chatgpt_attention_mask)
  123.             human_labels = torch.ones(human_logits.size(0), 1).to(device)
  124.             chatgpt_labels = torch.zeros(chatgpt_logits.size(0), 1).to(device)
  125.             loss = criterion(human_logits, human_labels) + criterion(chatgpt_logits, chatgpt_labels)
  126.             loss.backward()
  127.             optimizer.step()
  128.             total_loss += loss.item()
  129.             if progress_var:
  130.                 progress_var.set((batch_idx + 1) / num_batches * 100)
  131.         except Exception as e:
  132.             logging.warning(f"跳过无效批次: {
  133.      
  134.      e}")
  135.     return total_loss / len(data_loader)
  136. # 模型评估函数
  137. def evaluate_model(model, data_loader, device):
  138.     model.eval()
  139.     correct = 0
  140.     total
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表