自然语言处理实战项目13-基于GRU模型与NER的关键词抽取模型训练全流程

大家好,我是微学AI,今天给大家介绍一下自然语言处理实战项目13-基于GRU模型与NER的关键词抽取模型训练全流程。本文主要介绍关键词抽取样例数据、GRU模型模型构建与训练、命名实体识别(NER)、模型评估与应用,项目的目标是通过训练一个GRU模型来实现准确和鲁棒的关键词抽取,并通过集成NER模型提高关键词抽取的效果。这个项目提供了一个完整的流程,可以根据实际需求进行调整和扩展。

目录:
1.GRU模型介绍
2.NER方式提取关键词
3.NER方式的代码实现
4.总结

1.GRU模型介绍

GRU是一种递归神经网络的变种,用于处理序列数据的建模任务。与传统的RNN结构相比,GRU引入了门控机制,以解决长期依赖问题,并减轻了梯度消失和爆炸问题。

GRU模型的主要组成部分包括:

1.输入门(Input Gate):决定了输入信息中有哪些部分需要被更新到隐藏状态。它通过一个sigmoid函数将输入数据与先前的隐藏状态进行组合,输出一个介于0和1之间的值,表示更新的权重。

2.更新门(Update Gate):控制是否更新隐藏状态的值。它通过一个sigmoid函数评估当前输入和先前隐藏状态,以确定是否将新信息与之前的隐藏状态进行组合。

3.重置门(Reset Gate):评估当前输入和先前隐藏状态,决定隐藏状态中要保留的信息和要忽略的信息。该门可以通过一个sigmoid函数和一个tanh函数获得两个不同的输出,然后将它们相乘,得到最终的重置门结果。

4.隐藏状态(Hidden State):用于存储序列中的信息,并在每个时间步传递和更新。隐藏状态根据输入和先前的隐藏状态进行更新。通过使用输入门和重置门对先前隐藏状态进行加权组合,然后使用tanh函数得到新的候选隐藏状态。最后,更新门确定如何将新的候选隐藏状态与先前的隐藏状态进行组合来获得最终的隐藏状态。

GRU模型在序列建模任务中具有以下优势:

处理长期依赖:GRU模型通过使用门控机制可以选择性地更新和保留序列中的信息,从而更好地处理长期依赖关系。

减轻梯度问题:由于门控机制的存在,GRU模型能够有效地减轻梯度消失和梯度爆炸等问题,提高模型的训练效果和稳定性。

参数较少:相比长短时记忆网络(LSTM),GRU模型的参数更少,更容易训练和调整。
在这里插入图片描述

2.NER方式提取关键词

NER可以用于关键词抽取,通过识别文本中的命名实体,从中提取出关键词。与传统的关键词抽取方法相比,NER具有以下优势:

1.精确性:NER可以准确定位文本中的具体实体,提供更精确的关键词抽取结果。

2.上下文理解:NER不仅仅是简单地提取词语,还能够根据上下文理解实体的含义,提高关键词抽取的准确性。

3.适应多领域:由于NER对上下文的理解能力,它可以用于不同领域的关键词抽取,如新闻、医学、法律等。

NER的工作流程通常包括以下步骤:

1.数据准备:收集并准备标注好的训练数据,其中标注好的数据应包含实体的起始位置和对应的标签。

2.特征提取:从文本中选择适当的特征来表示实体,如词性、上下文等。这些特征通常用于训练模型。

3.模型训练:使用标注好的训练数据,训练一个机器学习模型,如条件随机场(Conditional Random Field, CRF)、循环神经网络(Recurrent Neural Networks, RNN)等。

4.标注预测:使用训练好的模型,对新的文本进行预测,并标注出实体的位置和类别。

5.后处理:根据任务需求,对NER的结果进行后处理,如过滤掉不相关的实体、合并相邻的实体等。

6.关键词抽取:从提取出的实体中,选择具有关键意义的实体作为关键词。

3.NER方式的代码实现

import torch
import torch.nn as nn
from torch.optim import Adam

# 定义模型
class KeywordExtractor(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(KeywordExtractor, self).__init__()
        self.hidden_size = hidden_size
        self.embedding = nn.Embedding(input_size, hidden_size)
        self.gru = nn.GRU(hidden_size, hidden_size)
        self.linear = nn.Linear(hidden_size, output_size)

    def forward(self, input):
        embedded = self.embedding(input)
        output, hidden = self.gru(embedded)
        output = self.linear(output.view(-1, self.hidden_size))
        return output.view(len(input), -1, output.size(1))


# 准备训练数据
train_data = [
    ("我 爱 北京", ["O", "O", "B-LOC"]),
    ("张三 是 中国 人", ["B-PER", "O", "B-LOC", "O"]),
    ("李四 是 美国 人", ["B-PER", "O", "B-LOC", "O"]),
    ("我 来自 北京", ["O", "O", "B-LOC"]),
    ("我 来自 广州", ["O", "O", "B-LOC"]),
    ("王五 去 英国 玩", ["B-PER", "O", "B-LOC", "O"]),
    ("我 喜欢 上海", ["O", "O", "B-LOC"]),
    ("刘东 是 北京 人", ["B-PER", "O", "B-LOC", "O"]),
    ("李明 来自 深圳", ["B-PER", "O", "B-LOC"]),
    ("我 计划 去 香港 旅行", ["O", "O","O", "B-LOC", "O"]),
    ("你 想去 法国 吗", ["O", "O", "B-LOC", "O"]),
    ("福州 是 你的 家乡 吗", ["B-LOC", "O", "O", "O", "O"]),
    ("张伟 和 王芳 一起 去 新加坡", ["B-PER", "O", "B-PER", "O", "O", "B-LOC"]),
    # 其他训练样本...
]

# 构建词汇表
word2idx = {"<PAD>": 0, "<UNK>": 1}
tag2idx = {"O": 0, "B-LOC": 1, "B-PER":2}
for sentence, tags in train_data:
    for word in sentence.split():
        if word not in word2idx:
            word2idx[word] = len(word2idx)
    for tag in tags:
        if tag not in tag2idx:
            tag2idx[tag] = len(tag2idx)
idx2word = {idx: word for word, idx in word2idx.items()}
idx2tag = {idx: tag for tag, idx in tag2idx.items()}

# 超参数
input_size = len(word2idx)
output_size = len(tag2idx)
hidden_size = 128
num_epochs = 100
batch_size = 2
learning_rate = 0.001

# 实例化模型和损失函数
model = KeywordExtractor(input_size, hidden_size, output_size)
criterion = nn.CrossEntropyLoss()

# 定义优化器
optimizer = Adam(model.parameters(), lr=learning_rate)


# 准备训练数据的序列张量和标签张量
def prepare_sequence(seq, to_idx):
    idxs = [to_idx.get(token, to_idx["<UNK>"]) for token in seq.split()]
    return torch.tensor(idxs, dtype=torch.long)

# 填充数据
def pad_sequences(data):
    # 计算最长句子的长度
    max_length = max(len(item[0].split()) for item in data)
    aligned_data = []
    for sentence, tags in data:
        words = sentence.split()
        word_s = words + ['O'] * (max_length - len(tags))
        sentence = ' '.join(word_s)
        aligned_tags = tags + ['O'] * (max_length - len(tags))
        aligned_data.append((sentence, aligned_tags))

    return aligned_data

# 训练模型
for epoch in range(num_epochs):
    for i in range(0, len(train_data), batch_size):
        batch_data = train_data[i:i + batch_size]
        batch_data = pad_sequences(batch_data)

        inputs = torch.stack([prepare_sequence(sentence, word2idx) for sentence, _ in batch_data])
        targets = torch.LongTensor([tag2idx[tag] for _, tags in batch_data for tag in tags])

        # 前向传播
        outputs = model(inputs)
        loss = criterion(outputs.view(-1, output_size), targets)

        # 反向传播和优化
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        print('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'
                  .format(epoch + 1, num_epochs, i + 1, len(train_data) // batch_size, loss.item()))

# 测试模型
test_sentence = "李明 想去 北京 游玩"
with torch.no_grad():
    inputs = prepare_sequence(test_sentence, word2idx).unsqueeze(0)
    outputs = model(inputs)
    _, predicted = torch.max(outputs.data, 2)
    tags = [idx2tag[idx.item()] for idx in predicted.squeeze()]
    print('输入句子:', test_sentence)
    print('关键词标签:', tags)

运行结果:

Epoch [99/100], Step [3/6], Loss: 0.0006
Epoch [99/100], Step [5/6], Loss: 0.0002
Epoch [99/100], Step [7/6], Loss: 0.0002
Epoch [99/100], Step [9/6], Loss: 0.0006
Epoch [99/100], Step [11/6], Loss: 0.0006
Epoch [99/100], Step [13/6], Loss: 0.0009
Epoch [100/100], Step [1/6], Loss: 0.0003
Epoch [100/100], Step [3/6], Loss: 0.0006
Epoch [100/100], Step [5/6], Loss: 0.0002
Epoch [100/100], Step [7/6], Loss: 0.0002
Epoch [100/100], Step [9/6], Loss: 0.0005
Epoch [100/100], Step [11/6], Loss: 0.0006
Epoch [100/100], Step [13/6], Loss: 0.0009

输入句子: 李明 想去 北京 游玩
关键词标签: ['B-PER', 'O', 'B-LOC', 'O']

4.总结

命名实体识别(NER)是自然语言处理中的一项技术,目的是从文本中识别和提取出具有特定意义的命名实体。这些命名实体可以是人名、地名、组织机构名、时间、日期等具有特定含义的词汇。

NER的任务是将文本中的每个词标注为预定义的命名实体类别,常见的类别有人名(PERSON)、地名(LOCATION)、组织机构名(ORGANIZATION)等。通过NER技术,可以提取出文本中的关键信息,帮助理解文本的含义和上下文。

NER的核心思想是结合机器学习和自然语言处理技术,利用训练好的模型对文本进行分析和处理。通常使用的方法包括基于规则的方法、统计方法和基于机器学习的方法。其中,基于机器学习的方法在大规模标注好的数据集上进行训练,通过学习识别命名实体的模式和规律,从而提高识别的准确性。

NER在实际应用中有广泛的应用场景,包括信息抽取、智能搜索、问答系统等。通过NER技术提取出的关键词可以被用于进一步的信息处理和分析,有助于提高对文本的理解和处理效果。

总之,命名实体识别(NER)是一项重要的自然语言处理技术,能够从文本中提取出具有特定含义的命名实体。它在各种应用场景中发挥着重要作用,为文本分析和信息提取提供了有力的支持。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

npm i babel-plugin-import -D之后报错

替换modules/.bin/XX文件 1.vue-cli-service #!/bin/sh basedir$(dirname "$(echo "$0" | sed -e s,\\,/,g)")case uname in*CYGWIN*) basedircygpath -w "$basedir";; esacif [ -x "$basedir/node" ]; then"$basedir/node"…

Audio Clip

Unity支持的音频格式&#xff1a; aiff/wav&#xff1a;适用于较短声音片段 mp3/OGG:适用于较长的音乐片段 多声道强制转为单声道&#xff0c;减小所占内存。 勾选后会对声音有优化 在后台加载声音 Load Type&#xff1a; 第一个&#xff0c;以不压缩的形式存在内存&#…

深度学习(二)

目录 一、神经网络 整体架构: 架构细节: 神经元个数的影响: 神经网络过拟合解决: 卷积网络 整体架构: 卷积层 边缘填充 特征尺寸计算 池化层 特征图变化 递归神经网络 一、神经网络 整体架构: 图中分别为输入层、隐层1、隐层2、输出层 通过输入层输入某数值&#xf…

Java版本企业电子招投标采购系统源码——功能模块功能描述+数字化采购管理 采购招投标

功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外部…

FAQ文档的重点注意事项!别踩坑了

在很多优秀的大企业中&#xff0c;FAQ文档是企业运营管理中不可或缺的重要部分。但是也仅限大企业&#xff0c;很多企业目前还是没有这个意识的。一方面原因是因为缺乏这个客户服务的意识&#xff0c;另一方面也和技术水平不足有关。但是其实现在有不少的第三方搭建平台可以帮助…

【Element-ui】学习与使用

网站快速成型工具Element&#xff0c;一套为开发者、设计师和产品经理准备的基于vue2.0的桌面端组件库 安装 npm i element-ui -S 在项目中安装element-ui&#xff0c;安装了以后查看package.json中的依赖中有没有element-ui的版本&#xff0c;如果有&#xff0c;则说明安装成功…

react 在build读取env 数据

默认会读取.env 文件 npm install dotenv --save npm install dotenv-cli --save-dev例如读取.env.test "build:test": "dotenv -e .env.test react-app-rewired build",.env.test REACT_APP_CURRENTMODE devREACT_APP_Public_Path "https://baid…

如何利用JMeter测试带有Token参数的POST接口

JMeter有一个很强大的功能就是可以用来做接口测试。 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系…

TikTok广告数据不好?收下这份常见问题自查手册!

你是一位跨境卖家吗&#xff1f;你是否在TikTok上投放过广告&#xff1f; 如果你的答案是肯定的&#xff0c;那么你可能遇到过一些困扰。比如&#xff0c;你的广告为什么不起量&#xff1f;为什么突然掉量了&#xff1f;为什么成本上升了&#xff1f;到底是哪里出了问题&#…

基于linux下的高并发服务器开发(第二章)- 2.22 setitimer 定时器函数

#include <sys/time.h> int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value); - 功能&#xff1a;设置定时器&#xff08;闹钟&#xff09;。可以替代alarm函数。精度微妙us&#xff0c;可以实现周期性定时 - 参数&#xff1a; -…

网络安全(黑客)就业分析指导

一、针对网络安全市场分析 市场需求量高&#xff1b;则是发展相对成熟入门比较容易。所需要的技术水平国家政策环境 对于国家与企业的地位愈发重要&#xff0c;没有网络安全就没有国家安全 更有为国效力的正义黑客—红客联盟 可见其重视程度。 需要掌握的知识点偏多 外围打点…

RocketMQ教程-(5)-功能特性-事务消息

事务消息为 Apache RocketMQ 中的高级特性消息&#xff0c;本文为您介绍事务消息的应用场景、功能原理、使用限制、使用方法和使用建议。 事务消息为 Apache RocketMQ 中的高级特性消息&#xff0c;本文为您介绍事务消息的应用场景、功能原理、使用限制、使用方法和使用建议。…

探索NE555:一款经典的集成电路(超详细)

NE555是一款经典的集成电路&#xff0c;它在电子领域被广泛应用于定时器、脉冲发生器、电压控制振荡器等各种应用场景。它的设计简单、易于使用&#xff0c;并且具备稳定可靠的性能&#xff0c;因此深受电子爱好者和工程师的青睐。本篇博客将详细介绍NE555的原理、工作模式和常…

微服务——统一网关Getway

为什么需要网关&#xff1f; 网关的两种实现: 网关Getway——快速入门 步骤一 网关背身也是一个微服务&#xff0c;需要注册到nacos中去 步骤二 成功运行后 可以通过网关进行请求转发到对应服务。 流程如下&#xff1a; 路由断言工厂 网关路由可以配置的东西有如下。 spri…

8.python设计模式【组合模式】

内容&#xff1a;将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。角色&#xff1a; 抽象组建&#xff08;component&#xff09;叶子组建(Leaf)复合组建(Composite)客户端 (Client) UML 图 举个例子 需求&#xf…

从原理到实践,分析 Redisson 分布式锁的实现方案(二)

上篇讲解了如何用 Redis 实现分布式锁的方案&#xff0c;它提供了简单的原语来实现基于Redis的分布式锁。然而&#xff0c;Redis作为分布式锁的实现方式也存在一些缺点。本文将引入Redisson来实现分布式锁。 一、Redisson是什么 Redisson是一个基于Redis的分布式Java框架。它提…

(一)认识InfluxDB

以下内容来自 尚硅谷&#xff0c;写这一系列的文章&#xff0c;主要是为了方便后续自己的查看&#xff0c;不用带着个PDF找来找去的&#xff0c;太麻烦&#xff01; 第 1 章 认识InfluxDB 1.1 InfluxDB的使用场景 InfluxDB是一种时序数据库&#xff0c;时序数据库通常被用在监…

day31贪心算法 用最少数量的箭引爆气球 和无重叠区间

题目描述 题目分析&#xff1a; x轴向上射箭&#xff0c;12一支&#xff0c;重叠的需要一支&#xff0c;3-8一支&#xff0c;7-16一支 返回2&#xff1b; 就是让重叠的气球尽量在一起&#xff0c;局部最优&#xff1b;用一支弓箭&#xff0c;全局最优就是最少弓箭&#xff1b…

猿人学第二题—混淆 动态cookie检测

猿人学第二题—混淆 动态cookie检测 1、代码格式化检测2、检测global和navigator.vendorSub3、检测setInterval思考 4、console.log输出检测补环境 简单的document.cookie&#xff0c;location.reload等就不写了 1、代码格式化检测 这里应该是利用了字符串正则匹配性能低的特点…

软考高项(五)信息系统工程 ★重点集萃★

&#x1f451; 个人主页 &#x1f451; &#xff1a;&#x1f61c;&#x1f61c;&#x1f61c;Fish_Vast&#x1f61c;&#x1f61c;&#x1f61c; &#x1f41d; 个人格言 &#x1f41d; &#xff1a;&#x1f9d0;&#x1f9d0;&#x1f9d0;说到做到&#xff0c;言出必行&am…