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

知识图谱(BILSTM+CRF项目完整实现)【第六章】

一、代码架构图

在data_origin中有两种类型的数据:分别是一般项目和一般项目txtoriginal

一般项目中放的是部位、症状、索引;列之间用制表符隔开

一般项目txtoriginal放的是原始数据;

二、构建序列标注数据

要把原始数据转换为目标数据:

常用的方式是构建字典,把索引作为键,把标签作为值。

可以使用标签类型字典把中文转换为英文

然后遍历索引(防止中间的索引被标记为O)可以判断是否是起始索引,若果是起始索引拼接B,不是起始索引拼接I

难点:
(1)获取到所有原始数据
通过os.Walk()遍历原始数据所在的文件夹,得到所有数据文件
(2)获取原始数据对应的标注数据
通过文件名称的特点,将原始数据文件名中的.txtoriginal替换成",就是对应的标注数据

三、BILSTM输入输出计算

BILSTM输入有三个元素分别是输入张量、隐藏状态、细胞状态;

BILSTM输出有三个元素分别是输出张量、最终隐藏状态、最终细胞状态;
无论是输入张量还是输出张亮,默认参数的顺序是(L【序列长度】,N(批次数),H(张量维度));
如果参数batch_first=True的时候,那么参数顺序是(N(批次数),L【序列长度】,H(张量维度)),这是我们常用的顺序;

输入参数:

输入序列:(batch_size,seq_length,n_dim)[batch_first=True]
隐藏状态维度:hidden_size
隐藏状态:(D*num_lays,batch_size,hidden_size)
细胞状态:(D*num_lays,batch_size,hidden_size)



输出参数:

输出序列:(batch_size,seq_length,D*hidden_size)[batch_first=True]

隐藏状态:(D*num_lays,batch_size,hidden_size)

细胞状态:(D*num_lays,batch_size,hidden_size)
如果在输出层上面加一个线性层,那所有的输出参数最后一维的hidden变为线性层的维度

小结:
输入序列(批次,序列长度,序列维度)

输出序列(批次,序列长度,输出维度(隐藏维度/自定义的线性维度))
细胞状态(层数*双向/单向,批次数,隐藏状态)

细胞状态(层数*双向/单向,批次数,隐藏状态)

例如:

输入序列[8,50,128](batch_first=true),隐藏层维度100
那么隐藏状态是(D*1,8,100)

细胞状态为(D*1,8,100)

D的取值是看这个模型是双向模型还是单向模型,如果说是单向模型(比如:LSTM)那么D=1,如果是双向模型(比如BILSTM),那么D=2

num_lays指的是总共有多少个模型,如果整个系统只有一个BILSTM,那么num_lays=1,如果整个系统里面有两个BILSTM,那么num_lays=2

输出序列[8,50,D*100](batch_first=True)
隐藏状态是(D*1,8,100)

细胞状态是(D*1,8,100)

四、项目BILSTM应用(基线模型)

  1. 输入序列的批次和长度:[batch_size,seq_length]
  2. 向量层对输入序列进行向量化:[batch_size,seq_length,embedding_dim]
  3. 输入序列到BILSTM里面,BILSTM输出维度:[batch_size,seq_length,hidden_size*2](input_size,hidden_size,bidirectional=True,batch_first=True)
  4. BILSTM输出的维度是:隐藏层*D,所以真正的隐藏层维度是BILSTM输出维度/2
  5. 随机失活层:只保留有效未知的输出结果,无效部分的值转换为0
  6. attention_mask:因为输入序列长短不一,但是神经网络要求同一批次输入序列长度相同.这时候使用attention_mask可以防止神经网络看到这些补齐的padding,让神经网络只关注有用的信息(使用padding补齐序列是在数据预处理的时候完成的)
  7. 线性层:把输出维度转换为标签类型数

维度变换分析:

1. 输入层input_ids

  • 形状:[batch_size, seq_len] = [2, 59]

  • 含义:2 个句子,每个句子 59 个词的索引(含 padding)


2. 词嵌入层word_embeds

  • 操作:nn.Embedding(vocab_size, embedding_dim),把每个词索引映射成 300 维向量

  • 形状:[batch_size, seq_len, embedding_dim] = [2, 59, 300]

  • 图中标注:[2, 59, 300]


3. BiLSTM 层

  • 参数:nn.LSTM(input_size=300, hidden_size=128, bidirectional=True)

    • input_size:输入维度 = 词向量维度 = 300

    • hidden_size:单向隐藏层维度 = 128

    • bidirectional=True:双向 LSTM,输出会拼接前向 + 后向的隐藏状态

  • 输出形状:[batch_size, seq_len, hidden_size*2] = [2, 59, 128*2=256]

  • 图中标注:[2, 59, 256]


4. Dropout 层

  • 操作:随机让部分神经元失活,防止过拟合,不改变维度

  • 输出形状:和输入一样[2, 59, 256]

  • 图中标注:[2, 59, 256]


5. 「对位相乘」(Attention Mask)

  • 两个输入:

    1. Dropout 输出:[2, 59, 256]

    2. attention_mask:形状是[2, 59](0/1 矩阵,1 表示有效 token,0 表示 padding)

  • 关键:广播机制下的对位相乘

    • attention_mask会被自动扩展为[2, 59, 1],再和[2, 59, 256]逐元素相乘

    • 有效位置(mask=1):向量保持不变

    • padding 位置(mask=0):整个 256 维向量全部置 0

  • 输出形状:还是[2, 59, 256],但 padding 部分的向量全是 0


6. 线性层linear

  • 参数:nn.Linear(hidden_dim*2, tag_size)nn.Linear(256, 12)

  • 操作:对每个 token 的 256 维特征做线性变换,映射到 12 个标签的分数

  • 输出形状:[batch_size, seq_len, tag_size] = [2, 59, 12]

  • 图中标注:[2, 59, 12]


总结:每一步的维度变化

表格

输入形状

操作

输出形状

输入层

-

-

[2, 59]

词嵌入

[2, 59]

词索引→300 维向量

[2, 59, 300]

BiLSTM

[2, 59, 300]

双向 LSTM,隐藏层 128

[2, 59, 256]

Dropout

[2, 59, 256]

随机失活

[2, 59, 256]

对位相乘

[2, 59, 256]+[2, 59]mask

广播 + 逐元素相乘,padding 置 0

[2, 59, 256]

线性层

[2, 59, 256]

256→12 维线性变换

[2, 59, 12]


关键补充:为什么要做「对位相乘」?

这一步的核心目的是屏蔽 padding 部分

  • 模型对 padding 位置也会输出特征,但这些是无效的

  • 通过attention_mask的 0 值和这些特征做对位相乘,直接把无效位置的特征清 0

  • 这样后续计算 loss 或做预测时,就不会被 padding 部分干扰

五、BILSTM实现NER

总共有五个超参需要设置:向量化维度、隐藏层维度、随机失活比例、字符数量、标签数量

import torch import torch.nn as nn class NERLSTM(nn.Module): def __init__(self, embedding_dim, hidden_dim, dropout, word2id, tag2id): super(NERLSTM, self).__init__() self.name = "BiLSTM" self.embedding_dim = embedding_dim self.hidden_dim = hidden_dim self.vocab_size = len(word2id) self.tag_size = len(tag2id) self.word_embeds = nn.Embedding(self.vocab_size, self.embedding_dim) self.dropout = nn.Dropout(dropout) self.lstm = nn.LSTM(self.embedding_dim, self.hidden_dim // 2, bidirectional=True, batch_first=True) self.hidden2tag = nn.Linear(self.hidden_dim, self.tag_size) def forward(self, x, mask): embedding = self.word_embeds(x) outputs, hidden = self.lstm(embedding) outputs = outputs * mask.unsqueeze(-1) # 仅保留有效位置的输出 outputs = self.dropout(outputs) outputs = self.hidden2tag(outputs) return outputs
http://www.jsqmd.com/news/675414/

相关文章:

  • nli-MiniLM2-L6-H768参数详解:Position Embedding截断长度对长句NLI的影响实测
  • WeChatPad终极指南:3步破解微信平板模式限制,实现安卓多设备登录
  • 传统 on-call 的 5 个致命问题——从人肉值班到 AI Agent 自动排障
  • 学习记录 健脾祛湿方收集
  • vulhub系列-73-RA1NXing Bots(超详细)
  • 基于麒麟V11、昇腾300i Duo安装torch、torch_npu
  • LLM应用缓存设计范式重构,Dify 2026新增Context-Aware TTL引擎与动态驱逐策略
  • NEURAL MASK视觉重构实验室参数详解:BIREFNET引擎输入尺寸/格式/显存占用
  • 终极指南:如何使用JDspyder实现京东商品自动化预约与抢购
  • vulhub系列-74-Hackable III(超详细)
  • PHP生成器yield怎么节省内存开销【教程】
  • Phi-3.5-mini-instruct惊艳案例:将学术论文摘要转化为大众科普短视频脚本
  • 【Linux】进程(2)状态
  • 大模型很热,但怎么用?预算不多也能搞?10大政企AI落地案例,助你收藏学习,开启AI转型之路!
  • AWPortrait-Z人像美化神器:5分钟快速部署,小白也能轻松上手
  • LeetCode 每日一题笔记 日期:2026.04.09 题目:3655.区间乘法查询后的异或二
  • 2026 论文神器榜:10 款 AI 工具让本科写作告别熬夜爆肝
  • vulhub系列-76-02-Breakout(超详细)
  • CSS如何快速获取网页上的标准色值_借助开发者工具的取色器和色彩格式转换功能
  • AI Coding的效能传导:从个体提速到组织进化
  • burpsuite-基础一
  • unity mcp接入 实现一句话生成游戏!
  • SEER‘S EYE 预言家之眼实战:集成至Dify平台构建AI Agent应用
  • Linux命令:ss
  • 从零开始:Spring Boot + MyBatis 搭建后端接口完整教程
  • Linux---信号
  • 线性代数与矩阵运算:AI世界的数学基石——从SVD到特征值分解的实战解析
  • 基于Simulink的轴向磁通电机多物理场耦合仿真​
  • NativeScript APP 开发备忘
  • GitHub 上的 CI/CD 怎么用?从 GitHub Actions 到一条可上线的流水线