pytorch中的词性标注_seq2seq_比较naive的示例

一、各种用法_查漏补缺:
1.关于numpy中的argmax的用法:

numpy之argmax()函数 - 知乎 (zhihu.com)

具体看这篇文章够了

二、代码+注释:

参考:

Sequence Models and Long Short-Term Memory Networks — PyTorch Tutorials 2.0.1+cu117 documentation

01 序列模型和基于LSTM的循环神经网络 - 知乎 (zhihu.com)

#这么少的训练数据?
training_data = [("The dog ate the apple".split(), ["DET", "NN", "V", "DET", "NN"]),("Everybody read that book".split(), ["NN", "V", "DET", "NN"])
]
import torch
import torch.autograd as autograd # torch中自动计算梯度模块
import torch.nn as nn             # 神经网络模块
import torch.nn.functional as F   # 神经网络模块中的常用功能 
import torch.optim as optim       # 模型优化器模块torch.manual_seed(1)  
#构建一个单词到 索引index1的 字典  word_to_ix 和 词性到所有的自带你tag_to_ix
word_to_ix = {} # 单词的索引字典
for sent, tags in training_data:for word in sent:if word not in word_to_ix:word_to_ix[word] = len(word_to_ix)
print(word_to_ix)
tag_to_ix = {"DET": 0, "NN": 1, "V": 2} # 手工设定词性标签数据字典
#设计这个RNN模型
class LSTMTagger(nn.Module):def __init__(self, embedding_dim, hidden_dim, vocab_size, tagset_size):#vocab_size:词的数量super(LSTMTagger, self).__init__() self.hidden_dim = hidden_dimself.word_embeddings = nn.Embedding(vocab_size, embedding_dim) #词汇表-vocab*embedding_dim维度self.lstm = nn.LSTM(embedding_dim, hidden_dim) #从embedding_dim -> hidden_dim的lstmself.hidden2tag = nn.Linear(hidden_dim, tagset_size) #从hidden_dim维度 -> tagset_size维度的linear层self.hidden = self.init_hidden() #自动调用init_hidden()def init_hidden(self): #自动调用h_0的初始化内容return (autograd.Variable(torch.zeros(1, 1, self.hidden_dim)),autograd.Variable(torch.zeros(1, 1, self.hidden_dim)))def forward(self, sentence):                 #运行过程embeds = self.word_embeddings(sentence)  #sentence需要是一个 数字 组成的数组lstm_out, self.hidden = self.lstm(embeds.view(len(sentence), 1, -1), self.hidden) #将sentence数组转换为len*1*(自动)的3维空间 ->通过 lstmtag_space = self.hidden2tag(lstm_out.view(len(sentence), -1)) #在将lstm_out转换为2维tag_scores = F.log_softmax(tag_space) #通过softmaxreturn tag_scores #返回分数
#将句子转换为 对应的 数值数组:
def prepare_sequence(seq, to_ix):idxs = [to_ix[w] for w in seq] #将句子seq中的词汇转成数字index后 组成一个一维数组idxstensor = torch.LongTensor(idxs)return autograd.Variable(tensor)
#生成model对象, loss_Function,optimizer对象实体
EMBEDDING_DIM = 6
HIDDEN_DIM = 6
model = LSTMTagger(EMBEDDING_DIM, HIDDEN_DIM, len(word_to_ix), len(tag_to_ix)) #模型对象
loss_function = nn.NLLLoss()  #loss_function
optimizer = optim.SGD(model.parameters(), lr=0.1) #optimizer
#一个小小的测试:
inputs = prepare_sequence(training_data[0][0], word_to_ix) #得到数值 数组inputs
tag_scores = model(inputs) #通过一个model得到的 tag_scores
print(training_data[0][0])
print(inputs)
print(tag_scores)#用最大的数值对应的索引号去标签数据: “The dog ate the apple”
#所以,这里预测的结果是 1 1 1 1 1 也就是名词 名词 名词 名词 名词 ,这个纯粹随机结果

#正式的开始train
for epoch in range(300):  # 我们要训练300次,可以根据任务量的大小酌情修改次数。for sentence, tags in training_data:# 清除网络先前的梯度值,梯度值是Pytorch的变量才有的数据,Pytorch张量没有model.zero_grad()# 重新初始化隐藏层数据,避免受之前运行代码的干扰model.hidden = model.init_hidden()# 准备网络可以接受的的输入数据和真实标签数据,这是一个监督式学习sentence_in = prepare_sequence(sentence, word_to_ix)targets = prepare_sequence(tags, tag_to_ix) #targets数组也是转化为 数值 数组# 运行我们的模型,直接将模型名作为方法名看待即可tag_scores = model(sentence_in)# 计算损失,反向传递梯度及更新模型参数loss = loss_function(tag_scores, targets)loss.backward()optimizer.step()# 来检验下模型训练的结果
inputs = prepare_sequence(training_data[0][0], word_to_ix)
tag_scores = model(inputs)
print(tag_scores)
#利用numpy中的argmax找到每一行最大值的 索引值
import numpy as np
numpy_array = tag_scores.detach().numpy()
np.argmax(numpy_array,axis=1)#用最大的数值对应的索引号去标签数据: “The dog ate the apple”
#所以,这里预测的结果是 0 1 2 0 1 也就是冠词 名词 动词 冠词 名词 ,这个完全正确

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

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

相关文章

【1++的数据结构】之map与set(二)

👍作者主页:进击的1 🤩 专栏链接:【1的数据结构】 文章目录 一,前言二,红黑树的概念及其性质三,红黑树的插入四,红黑树的验证五,map与set的封装红黑树迭代器的实现map重载…

qt 正则表达式

以上是正则表达式的格式说明 以下是自己写的正则表达式 22-25行 是一种设置正则表达式的方式, 29-34行 : 29行 new一个正则表达式的过滤器对象 30行 正则表达式 的过滤格式 这个格式是0-321的任意数字都可以输入 31行 将过滤格式保存到过滤器对象里面 32行 将验…

快人一步进入智能新纪元,《新程序员006》来了!

文 | 王启隆 曾浩辰 出品 | 《新程序员》编辑部 亲爱的 CSDN 以及《新程序员》的读者朋友们,金秋将至,《新程序员006:人工智能新十年》也正式与大家见面!现在点击下方封面,即可订阅,立即阅读电子书。精美…

UNIX网络编程卷一 学习笔记 第三十章 客户/服务器程序设计范式

开发一个Unix服务器程序时,我们本书做过的进程控制: 1.迭代服务器(iterative server),它的适用情形极为有限,因为这样的服务器在完成对当前客户的服务前无法处理已等待服务的新客户。 2.并发服务器&#x…

Java笔记040-反射/反射机制、Class类

目录 反射(reflection) 一个需求引出反射 反射机制 Java反射机制原理图 Java反射机制可以完成 反射相关的主要类 反射机制的优点和缺点 反射调用优化-关闭访问检查 Class类 基本介绍 代码解释部分 类加载方法 应用实例:Class02.java 获取Class类对象 …

【17 > 分布式接口幂等性】2. Update的幂等性原理解析

一、 根据 唯一业务号去更新 数据的情况 1.1 原理 1.2 操作 1.3 实战 Stage 1:表添加 version 字段 Stage 2:前端 > 版本号放入隐藏域 Stage 3:后台 > 使用版本号作为更新条件 二、更新操作没有唯一业务号,可使用Tok…

RP9学习-1

一.基础 1.10个面板位置示意图: 2.常用英文 1.鼠标点击:click or tap 3.工作区 1.恢复默认工作区: view-->reset view 2.自定义工作区: 可以用鼠标左键拖动面板到独立的位置或者吸附到其他面板上 3.自定义工具栏 view-->T…

Adobe Acrobat Reader界面改版 - 解决方案

问题 日期:2023年9月 Adobe Acrobat Reader下文简称Adobe PDF Reader,此软件会自动进行更新,当版本更新至2023.003.20284版本后。 软件UI界面会大改版:书签页变成了右边、工具栏变到了左边、缩放按钮变到了右下角,如…

打造高效的私密论坛网站:Cpolar内网穿透+HadSky轻量级搭建指南

文章目录 前言1. 网站搭建1.1 网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道(云端设置)2.3 Cpolar稳定隧道(本地设置)2.4 公网访问测试 总结 前言 经过多年的基础…

怎么激活IDM

IDM是一个下载软件。 激活它需要用到git上面的一个项目,同时网络要能连到github GitHub - lstprjct/IDM-Activation-Script: IDM Activation & Trail Reset Script WINR 输入powershell 输入命令行 iex(irm is.gd/idm_reset) 或者 iwr -useb https://raw.…

vim常用操作

一、Esc键 & 命令模式 1.撤销:u 恢复撤销:Ctrl r 2.定位 行首:0 行尾:$ 第7行:7G 3.编辑 下行开始插入: o 删除行:dd 复制3行并粘贴:3yy ---> p 复制单词并粘贴&#…

【Leetcode-面试经典150题-day22】

目录 97. 交错字符串 97. 交错字符串 题意: 给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串: s s1 s2 …

Hadoop:HDFS--分布式文件存储系统

目录 HDFS的基础架构 VMware虚拟机部署HDFS集群 HDFS集群启停命令 HDFS Shell操作 hadoop 命令体系: 创建文件夹 -mkdir 查看目录内容 -ls 上传文件到hdfs -put 查看HDFS文件内容 -cat 下载HDFS文件 -get 复制HDFS文件 -cp 追加数据到HDFS文件中 -appendTo…

初阶扫雷(超详解)

✨博客主页:小钱编程成长记 🎈博客专栏:C语言小游戏 🎈推荐相关博文:初阶三子棋(超详解) 初阶扫雷 1.游戏介绍2.基本思路3.实现前的准备4.实现步骤4.1 打印菜单4.2 初始化扫雷棋盘4.3 打印扫雷棋…

如何让Android平台像网络摄像机一样实现GB28181前端设备接入?

技术背景 好多开发者在做国标对接的时候,首先想到的是IPC(网络摄像头),通过参数化配置,接入到国标平台,实现媒体数据的按需查看等操作。 像执法记录仪等智能终端,跑在Android平台,…

2024腾讯校招后端面试真题汇总及其解答(三)

21【算法题】反转链表 题目: 给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。 示例 1: 输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head = [1,2] 输出:[2,1]示例 3: 输入:head = [] 输出:[]提示: 链表中节点的数目范围是 [0, 5…

Spring系列文章:Bean的获取⽅式

一、简介 Spring为Bean提供了多种实例化⽅式,通常包括4种⽅式。(也就是说在Spring中为Bean对象的创建准 备了多种⽅案,⽬的是:更加灵活) 第⼀种:通过构造⽅法实例化 第⼆种:通过简单⼯⼚模式…

App测试时常用的adb命令你都掌握了哪些呢?

adb 全称为 Android Debug Bridge(Android 调试桥),是 Android SDK 中提供的用于管理 Android 模拟器或真机的工具。 adb 是一种功能强大的命令行工具,可让 PC 端与 Android 设备进行通信。adb 命令可执行各种设备操作&#xff0…

Redis原理:动态字符串SDS

(课程总结自b站黑马程序员课程) 一、引言 Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。 不过Redis没有直接使用C语言中的字符串,因为C语言字符串存在很多问题&…

防火墙 FireWall

这里写自定义目录标题 一、概述二、防火墙分类三、防火墙性能四、硬件防火墙定义五、硬件防火墙作用(拓扑图 ups)六、硬件防火墙品牌七、软件防火墙八、iptables一、iptables是什么?二、netfilter/iptables功能三、iptables概念四、iptables中…