自然语言处理实验2 字符级RNN分类实验

news2024/12/29 13:48:39

实验2 字符级RNN分类实验

必做题:

(1)数据准备:academy_titles.txt为“考硕考博”板块的帖子标题,job_titles.txt为“招聘信息”板块的帖子标题,将上述两个txt进行划分,其中训练集为70%,测试集为30%。二分类标签:考硕考博为0,招聘信息为1。字符使用One-hot方法表示。

(2)设计模型:在训练集上训练字符级RNN模型。注意,字符级不用分词,是将文本的每个字依次送入模型。

(3)将训练好的模型在测试数据集上进行验证,计算准确率,并分析实验结果。要给出每一部分的代码。

import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
from sklearn.model_selection import train_test_split

# 读取academy_titles文件内容
with open('C:\\Users\\hp\\Desktop\\academy_titles.txt', 'r', encoding='utf-8') as file:
    academy_titles = file.readlines()

# 读取job_titles文件内容
with open('C:\\Users\\hp\\Desktop\\job_titles.txt', 'r', encoding='utf-8') as file:
    job_titles = file.readlines()

# 将招聘信息与学术信息分开
academy_titles = [title.strip() for title in academy_titles]
job_titles = [title.strip() for title in job_titles]

# 构建标签和数据
X = academy_titles + job_titles
y = [0] * len(academy_titles) + [1] * len(job_titles)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 构建字符到索引的映射
all_chars = set(''.join(academy_titles + job_titles))
char_to_index = {char: i for i, char in enumerate(all_chars)}

# 将文本转换为模型可接受的输入形式
def text_to_input(text, max_len, char_to_index):
    X_indices = np.zeros((len(text), max_len, len(char_to_index)), dtype=np.float32)
    for i, title in enumerate(text):
        for t, char in enumerate(title):
            X_indices[i, t, char_to_index[char]] = 1
    return torch.tensor(X_indices)

max_len = max([len(title) for title in X])
X_train_indices = text_to_input(X_train, max_len, char_to_index)
X_test_indices = text_to_input(X_test, max_len, char_to_index)

# 构建字符级RNN模型
class CharRNN(nn.Module):
    def __init__(self, input_size, hidden_size):
        super(CharRNN, self).__init__()
        self.hidden_size = hidden_size
        self.i2h = nn.LSTM(input_size, hidden_size)
        self.fc = nn.Linear(hidden_size, 1)
        self.sigmoid = nn.Sigmoid()

    def forward(self, input):
        hidden, _ = self.i2h(input)
        output = self.fc(hidden[-1])
        output = self.sigmoid(output)
        return output

model = CharRNN(input_size=len(char_to_index), hidden_size=128)

# 定义损失函数和优化器
criterion = nn.BCELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 转换数据为PyTorch张量
y_train_tensor = torch.tensor(y_train, dtype=torch.float32).view(-1, 1)
y_test_tensor = torch.tensor(y_test, dtype=torch.float32).view(-1, 1)

# 定义新的训练周期数和学习率
num_epochs = 30
learning_rate = 0.01

# 定义新的优化器
optimizer = optim.Adam(model.parameters(), lr=learning_rate)
best_accuracy = 0.0
best_model = None

# 训练模型并输出每一轮的准确率
for epoch in range(num_epochs):
    optimizer.zero_grad()
    output = model(X_train_indices)
    output = output.view(-1, 1)
    loss = criterion(output, y_train_tensor[:output.size(0)])
    loss.backward()
    optimizer.step()

    # 计算训练集准确率
    predictions = (output > 0.5).float()
    correct = (predictions == y_train_tensor[:output.size(0)]).float()
    accuracy = correct.sum() / len(correct)
    print(f'Epoch {epoch+1}, 训练集准确率: {accuracy.item()}')

    # 保存准确率最高的模型
    if accuracy > best_accuracy:
        best_accuracy = accuracy
        best_model = model.state_dict().copy()

# 加载最佳模型参数
model.load_state_dict(best_model)

# 使用测试集上准确率最高的模型进行测试
test_output = model(X_test_indices)
test_output = test_output.view(-1, 1)
test_loss = criterion(test_output, y_test_tensor[:test_output.size(0)])
predictions = (test_output > 0.5).float()
correct = (predictions == y_test_tensor[:test_output.size(0)]).float()
accuracy = correct.sum() / len(correct)

print(f'使用测试集上准确率最高的模型进行测试,准确率: {accuracy.item()}')

 这个实验准确率目前是偏低的,但是我没有很多时间去一直调整参数

希望后面有需要的同学,可以去调整参数!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1517838.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超薄片式厚膜电阻

超薄片式厚膜电阻器具有许多碳电阻器特性;它们可以做得很小,而且大批量的成本非常低。同时厚膜电阻器具有高达10TW(太欧姆)的高电阻值、非常高的温度性能和高电压能力,并且本质上是无感的。它们适用于医疗、航空航天和井下&#x…

比Let‘s Encrypt更简单更齐全的免费证书申请教程

步骤一 打开JoySSL官网,注册属于你的专属账号; 永久免费SSL证书申请地址真正完全且永久免费!不用您花一分钱,SSL证书免费使用90天,并且还支持连续签发。JoySSL携手全球权威可信顶级根,自研新一代SSL证书&…

YOLOV5 部署:QT的可视化界面推理(创建UI,并编译成py文件)

1、前言 之前用YOLOV5 做了一个猫和老鼠的实战检测项目,本章将根据之前训练好的权重进行部署,搭建一个基于QT的可视化推理界面,可以检测图片和视频 本章使用的数据集和权重参照:YOLOV5 初体验:简单猫和老鼠数据集模型训练-CSDN博客 可视化界面如下: 2、安装Pyside6 本…

【Leetcode每日一题】 递归 - 合并两个有序链表(难度⭐)(35)

1. 题目解析 题目链接:21. 合并两个有序链表 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 1. 递归函数定义与功能 递归函数的主要任务是将两个有序链表合并成一个新的有序链表,并返回合并后…

面试常问:为什么 Vite 速度比 Webpack 快?

前言 最近作者在学习 webpack 相关的知识,之前一直对这个问题不是特别了解,甚至讲不出个123....,这个问题在面试中也是常见的,作者在学习的过程当中总结了以下几点,在这里分享给大家看一下,当然最重要的是…

PostgreSQL从入门到精通教程 - 第46讲:poc-tpch测试

PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。 第46讲&#…

【计算机网络】概述

文章目录 一、Internet 因特网1.1 网络、互联网、因特网1.2 因特网的组成 二、三种交换方式2.1 电路交换 (Circuit Switching)2.2 *分组交换 (Packet Switching)2.3 报文交换 (Message Switching) 三、计算…

基于Verilog的简易CPU设计

前言 本篇文章将简单讲解CPU之间各部分的功能及接线,并提供Verilog模拟CPU的各个组成部分。该CPU可以完成一些操作,如:加减法,与或,指令跳转等,最后提供testbench用于测试该CPU的工作情况是否符合预期。 C…

雷卯推荐基于USB 快充(USB-PD) 浪涌保护器件

USB PD 从2010年USB BC1.2 :单一5V 1.5A,到2021 年USB PD 3.1,支持电压 5V、9V、15V 和 20V,28V、36V 和 48V, 充电功率同步提升至240W。应用范围从从手机、平板电脑、笔记本电脑,逐渐向显示器、服务器、电机驱动和通信…

企业架构设计方法与实践中的架构治理演进、架构评估方法、架构成熟度模型

企业架构设计方法与实践中的架构治理演进、架构评估方法、架构成熟度模型。 架构治理演进: 架构治理是指通过设立和执行一套政策和程序,来管理和控制一个组织的架构活动。架构治理演进是一个持续的过程,需要根据组织的实际情况进行定期审查和调整。 在演进过程中,重点需要…

Python学习01 python开发的准备工作 1.Python解释器的下载 2.Pycharm集成开发环境的安装

0.按照步骤,快速进行python的开发准备工作 1. Python解释器的下载 下载地址 https://www.python.org/ 选择对应你的系统的安装包 2.记得勾选这里将python加入你的路径中 3.有如下四个程序表明安装成功 4.点击上图中的第二个程序打开窗口检查解释器能否正常工作 输…

Flutter 多语言自动化本地化生成器

Flutter 多语言自动化本地化生成器 这是一个为Flutter设计的插件,通过从Excel表格提取的CSV文件自动生成Dart本地化文件,以简化应用程序本地化的流程。这个工具通过自动化创建多语言资源文件,简化了开发人员和翻译人员的工作流程。 特点 默…

MQTT.fx实现(MQTT Client)连接物联网平台(ThingsCloud )

目录 概述 1 ThingsCloud平台介绍 2 ThingsCloud创建项目 2.1 创建项目 2.2 创建数据类型 2.3 创建设备类型 3 发布和订阅主题 3.1 发布Topic 3.2 订阅主题Topic 4 使用MQTT.fx 测试ThingsClond 4.1 使用MQTT.fx连接ThingsClond 4.2 MQTT.fx 订阅ThingsCloud Messag…

Unity资源热更新----AssetBundle

13.1 资源热更新——AssetBundle1-1_哔哩哔哩_bilibili Resources 性能消耗较大 Resources文件夹大小不能超过2个G 获取AssetBundle中的资源 打包流程 选择图片后点击 创建文件夹,Editor优先编译 打包文件夹位置 using UnityEditor; using UnityEngine; public cla…

探索编程新纪元:Code GeeX、Copilot与通义灵码的智能辅助之旅

在人工智能技术日新月异的今天,编程领域的革新也正以前所未有的速度推进。新一代的编程辅助工具,如Code GeeX、Copilot和通义灵码,正在重塑开发者的工作流程,提升编程效率,并推动编程教育的普及。本文将深入探讨这三款…

已解决Keil报错unknown type name “u8“或/u16/u32

出现问题如下所示,提示错误unknown type name “u8“ 解决方法: 在头文件中加入如下即可解决 typedef uint8_t u8; 这个错误通常表示编译器无法识别“u8”这个类型名。在C/C中,通常使用“uint8_t”来表示8位无符号整数类型。如果代码中…

django-q轻量级定时任务制定

django-q ,celery,apschedule都可以作为python的选型,但是django-q更轻量级,可以定制想要的任务,通过消息中间件,来实现不太高并发的实现 官网介绍地址 django-q官网地址 本次测试的是python3.12版本 首先需要安装dja…

ELK日志管理实现的3种常见方法

ELK日志管理实现的3种常见方法 1. 日志收集方法 1.1 使用DaemonSet方式日志收集 通过将node节点的/var/log/pods目录挂载给以DaemonSet方式部署的logstash来读取容器日志,并将日志吐给kafka并分布写入Zookeeper数据库.再使用logstash将Zookeeper中的数据写入ES,并通过kibana…

C语言函数—递归

这方面内容涉及到栈的使用,我们的递归函数如果被执行那么系统将会自动的去创建一个栈,相关内容有机会单独写文章讲解 什么是递归? 程序调用自身的编程技巧称为递归( recursion)。 递归做为一种算法在程序设计语言中广泛…

基于单片机的恒压供水控制器设计

摘 要 随着我国现代化的进程不断加快,城市居民生活水平不断提高,随之而来的是房屋的翻新和重建,但建筑层数的不断增高,使得供水所需压力不断提高,若建筑设计时对压力判断不足,会导致供水时无法供应到高楼层…