NLP(9)--rnn实现中文分词

前言

仅记录学习过程,有问题欢迎讨论

利用rnn实现分词效果(感觉十分依赖词数据)
使用jieba分词好的数据做样本
  • pip install jieba

代码

import jieba
import numpy as np
import torch
import torch.nn as nn
from torch.utils.data import DataLoader"""
基于pytorch的网络编写一个分词模型
我们使用jieba分词的结果作为训练数据
看看是否可以得到一个效果接近的神经网络模型中文分词缺点:
1.对词表极为依赖,如果没有词表,则无法进行;如果词表中缺少需要的词,结果也不会正确
2.切分过程中不会关注整个句子表达的意思,只会将句子看成一个个片段
3.如果文本中出现一定的错别字,会造成一连串影响
4.对于人名等的无法枚举实体词无法有效的处理"""class TorchModel(nn.Module):def __init__(self, vocab, input_dim, hidden_size, rnn_layer_size):super(TorchModel, self).__init__()self.emb = nn.Embedding(len(vocab) + 1, input_dim)# 多层rnn效果会比 单层好self.rnn = nn.RNN(input_size=input_dim,hidden_size=hidden_size,num_layers=rnn_layer_size,batch_first=True)# 不能使用pool# self.pool = nn.AvgPool1d(sentence_length)# 输出为0/1 2分类的self.classify = nn.Linear(hidden_size, 2)# -1 不参与计算self.loss = nn.CrossEntropyLoss(ignore_index=-1)def forward(self, x, y=None):x = self.emb(x)x, _ = self.rnn(x)# 用 polling 层# x= self.pool(x.transpose(1,2)).squeeze()y_pred = self.classify(x)if y is not None:# y_pred : n,class_num [[1,2,3][3,2,1]]# y : n                 [0     ,1     ]# 20*20*2===>view ===> 400 * 2   y===> 400 *1return self.loss(y_pred.view(-1, 2), y.view(-1))else:return y_pred# 使用jieba获取切分好的数据 来作为样本数据
# 我爱你们 === 1,1,0,1
def sequence_to_label(sentence):words = jieba.lcut(sentence)labels = [0] * len(sentence)pointer = 0for word in words:pointer += len(word)labels[pointer - 1] = 1return labels# 读取给定词表数据 构建字符集
def build_vocab(path):vocab = {}with open(path, encoding="utf8") as f:for index, line in enumerate(f):char = line.strip()vocab[char] = index + 1vocab['unk'] = len(vocab) + 1return vocabclass Dataset:def __init__(self, vocab, corpus_path, max_length):self.vocab = vocabself.corpus_path = corpus_pathself.max_length = max_lengthself.load()# 构建数据集def load(self):# data 的结构为 [x,y]self.data = []with open(self.corpus_path, encoding="utf8") as f:for line in f:vocab = self.vocab# 转化为 切分好的数据 yy = sequence_to_label(line)# 转化为数字x = [vocab.get(char, vocab['unk']) for char in line]# 都 标准化为最大长度x, y = self.padding(x, y)self.data.append([torch.LongTensor(x), torch.LongTensor(y)])# 使用部分数据做展示,使用全部数据训练时间会相应变长if len(self.data) > 10000:breakdef padding(self, x, y):# 长了就截取x = x[:self.max_length]# 短了就 补0x += [0] * (self.max_length - len(x))y = y[:self.max_length]# y 不能用 0y += [-1] * (self.max_length - len(y))return x, y# 为了给 data_load 使用 做小批量数据分割def __len__(self):return len(self.data)def __getitem__(self, item):return self.data[item]def build_dataset(vocab, corpus_path, max_length, batch_size):dataset = Dataset(vocab, corpus_path, max_length)# shuffle 随机打乱样本data_loader = DataLoader(dataset, shuffle=True, batch_size=batch_size)  # torchreturn data_loaderdef main():batch_size = 20lr = 1e-3epoch_size = 10vocab = build_vocab("D:\\NLP\\test\\week4\\chars.txt")hidden_size = 100# 每个字符的维度input_dim = 20rnn_layer_size = 2# 样本最大长度max_length = 20model = TorchModel(vocab, input_dim, hidden_size, rnn_layer_size)optim = torch.optim.Adam(model.parameters(), lr=lr)# 语料库(样本数据)路径corpus_path = "D:\\NLP\\test\\week4\\corpus.txt"dataiter = build_dataset(vocab, corpus_path, max_length, batch_size)for epoch in range(epoch_size):epoch_loss = []model.train()for x, y_true in dataiter:loss = model(x, y_true)loss.backward()optim.step()optim.zero_grad()epoch_loss.append(loss.item())print("第%d轮 loss = %f" % (epoch + 1, np.mean(epoch_loss)))# save modeltorch.save(model.state_dict(), "model.pth")return# 最终预测
def predict(model_path, vocab_path, input_strings):# 配置保持和训练时一致char_dim = 20  # 每个字的维度hidden_size = 100  # 隐含层维度num_rnn_layers = 2  # rnn层数vocab = build_vocab(vocab_path)  # 建立字表(字符集)model = TorchModel(vocab, char_dim, hidden_size, num_rnn_layers)  # 建立模型model.load_state_dict(torch.load(model_path))  # 加载训练好的模型权重model.eval()for input_string in input_strings:# 逐条预测x = [vocab.get(char, vocab['unk']) for char in input_string]with torch.no_grad():result = model.forward(torch.LongTensor([x]))[0]result = torch.argmax(result, dim=-1)  # 预测出的01序列# 在预测为1的地方切分,将切分后文本打印出来for index, p in enumerate(result):if p == 1:print(input_string[index], end=" ")else:print(input_string[index], end="")print()if __name__ == '__main__':main()# input_strings = ["同时国内有望出台新汽车刺激方案",#                  "沪胶后市有望延续强势",#                  "经过两个交易日的强势调整后",#                  "昨日上海天然橡胶期货价格再度大幅上扬"]# predict("model.pth", "D:\\NLP\\test\\week4\\chars.txt", input_strings)

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

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

相关文章

Java 提取HTML文件中的文本内容

从 HTML 文件中提取文本内容是数据抓取中的一个常见任务,你可以将提取的文本信息用于编制报告、进行数据分析或其他处理。本文分享如何使用免费 Java API 从HTML 文件中提取文本内容。 安装免费Java库: 要通过Java提取HTML文本,需要用到Free…

QT——简易计算器(从0开始)

目录 一、题目描述: 二、创建工程: 1. ​编辑 2. 3. 4. 默认 5. 6. 7. 8. 默认 9. 创建完成 三、UI界面设计: 1. 添加按钮 1. 2. 按钮界面 3. 按钮绑定快捷键 2. 文本框添加 1. 文本框字体 2. 默认文本 3. 文本对齐方式…

48、spfa求最短路

spfa求最短路 题目描述 给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数。 请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出impossible。 数据保证不存在负权回路。 输入格式 第一行包…

Linux多线程(二) 线程同步 信号量互斥锁读写锁条件变量

多个进程同时访问某些资源时,必须考虑同步问题,以确保任一时刻只有一个进程可以拥有对资源的独占式访问。通常,程序对关键资源的访问代码只是很短的一段,我们称这段代码为关键代码段或者临界区,对进程同步,…

机器人系统开发ros2-基础实践01-学会自定义一个机器人动作aciton实体类

您之前在了解操作教程中了解了action 。与其他通信类型及其各自的接口(主题/消息和服务/srv)一样,您也可以在包中自定义操作。本教程向您展示如何定义和构建可与您将在下一个教程中编写的action服务器和action 客户端一起使用的操作。 需要理…

UE5 GAS开发P41-43 永久效果,去除永久效果,伤害区域,EnumClass,开始重叠与结束重叠事件

这一部分学习了怎么创建一个伤害性的地形(火焰地形,毒沼泽等都可以用这个方式创建) AuraEffectActor.h // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h" #include "GameplayEffect.h&q…

软件测试(Web自动化测试)(二)

一.Selenium WebDriver的基本应用 (一)安装浏览器驱动 1.关闭浏览器的自动更新功能 以Windows7(64位)操作系统为例,讲解如何关闭Chrome浏览器的自动更新。首先按下快捷键“WinR”,打开运行对话框&#x…

uniapp步骤条 组件

//子组件 <template><view class"container-step"><view class"uni-padding-wrap"><view class"progress-box"><progress :percent"3" active"true" stroke-width"2" /></vie…

【c++】深入剖析与动手实践:C++中Stack与Queue的艺术

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好&#xff0c;本篇文章我们来到STL新的内容&#xff0c;stack和queue 目录 1. stack的介绍与使用函数介绍例题一&#xff1a;最小栈例题二&#xff1a;栈的压入、弹出队列栈的模…

Adobe Photoshop CC 2017无法打开解决方案

Adobe Photoshop CC 2017双击无反应&#xff0c;右键以管理员身份运行也没有反应 解决方案&#xff1a; 事件查看器中查看应用程序的事件 如果找到程序报错事件&#xff0c;网上下载ZXPSignLib-minimal.dll文件替换错误模块路径位置的该文件即可 ZXPSignLib-minimal.dll下载地…

树莓派驱动开发----spi flash设备w25q64开发

这期使用的是spi驱动开发框架&#xff0c;其实spi和iic合起来有一个 Regmap 子系统&#xff0c;下回讲这个&#xff01;&#xff01; 使用方法 &#xff1a;./w25q64App /dev/w25q64-device <cmd> <address> <cnt> <data> ... 可读写擦&#xff0…

大模型_alpaca-lora微调及推理部署

文章目录 lora是什么重要相关参数LoRA 的优势 微调部署下载项目切换到项目目录下切换conda环境模型下载微调数据集下载 启动微调失败1原因分析 失败2修改前修改后 推理部署 lora是什么 重要相关参数 lora_rank(int,optional): LoRA 微调中的秩大小。lora_alpha(float,optional…

【嵌入式AI开发】轻量级卷积神经网络MobileNetV2详解

前言:MobileNetV2网络先升维后降维,在降维时使用线性激活函数,带残差的Inverted bottleck模块,防止ReLU信息丢失。在图像分类、目标检测、语义分割等任务上实现了网络轻量化、速度和准确度的权衡。 回顾MobileNetV1的理论和MobileNetV2项目实战可查阅如下链接: 【嵌入式AI…

小程序线多点路图绘制

需求 当接口返回一连串地图坐标&#xff0c;需要根据这些坐标串联起来&#xff0c;形成一个线路图&#xff08;本次使用步行导航线路图&#xff09;。 思路 首先优先想到使用小程序Map组件的polyline属性去进行展示。但是我们发现直接使用该属性进行坐标绘制画出来的数据都是…

STL--string详解

STL基本内容 string是什么 string实质上是一个对象 string可看作一个串&#xff0c;类似字符数组 可以扩容&#xff0c;可以增删查改 可用下表访问操作符[]引用&#xff0c;修改某值 构造函数 默认构造 拷贝构造&#xff1a;参数为(string 或 char*) 求string对象的长度不…

ruoyi-cloud-plus的bom

ruoyi-cloud-plus项目下关于bom有两个macen模块&#xff0c;分别是 ruoyi-api-bomruoyi-common-bomruoyi-common-bom bom模块的作用是对所有的maven模块的版本进行控制&#xff0c;所有同级别的maven模块都是可以依赖bom模块。 依赖顺序是父类模块dependencyManagement依赖下…

逻辑回归模型与GBDT+LR——特征工程模型化的开端

随着信息技术和互联网的发展&#xff0c; 我们已经步入了一个信息过载的时代&#xff0c;这个时代&#xff0c;无论是信息消费者还是信息生产者都遇到了很大的挑战&#xff1a; 信息消费者&#xff1a;如何从大量的信息中找到自己感兴趣的信息&#xff1f;信息生产者&#xff…

PMBOK® 第六版 项目是什么

目录 读后感—PMBOK第六版 目录 项目定义 定义&#xff1a;项目是为创造独特的产品、服务或成果而进行的临时性工作。 项目的特征具备以下三点&#xff1a; 独特性&#xff1a;独一无二&#xff0c;无法简单重复过去的做法。 临时性&#xff1a;项目有明确的起点和终点&…

EOCR-i3MS-WRDUW电机保护器 韩国三和 进口施耐德

韩国三和&#xff0c;EOCR&#xff0c;SAMWHA&#xff0c;Schneider&#xff0c;施耐德&#xff0c;电机保护器&#xff0c;电动机保护器&#xff0c;电子式电动机保护继电器&#xff0c;电子式过电流继电器&#xff0c;电子式欠电流继电器&#xff0c;电子式电压继电器&#x…

一起陪伴走过20多年,XILINX五大系列CPLD/FPGA将于6月截止接单

一起陪伴走过20多年&#xff0c;XILINX五大系列CPLD/FPGA将于6月截止接单 Product Discontinuation Notice AMD/XILINX于2024年春节后&#xff0c;发布了最新的产品停产通知&#xff0c;产品系列包括&#xff1a;XC9500XL, CoolRunner XPLA 3, CoolRunner II, Spartan II, a…