基于长短期记忆网络 LSTM 的下一个单词预测

news2024/11/15 19:25:53

前言

系列专栏:【深度学习:算法项目实战】✨︎
涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记忆、自然语言处理、深度强化学习、大型语言模型和迁移学习。

下一个单词预测是一个引人入胜的问题,它涉及开发一种模型,能够预测句子中给定单词序列之后最有可能出现的单词。这种预测模型利用算法和语言模式的力量来预测下一个单词,从而实现各种应用,如预测性键盘建议、写作辅助和内容生成。这就像在应用程序中内置了一个功能,可以在您输入或说话时建议下一个单词。下一个单词预测模型可用于信息应用、搜索引擎、虚拟助手和智能手机的自动更正功能等应用中。

在这项任务中,我们将使用一个文本数据集,该数据集基于以杰出侦探夏洛克-福尔摩斯为主角的著名系列丛书。该数据集由阿瑟-柯南-道尔爵士撰写的引人入胜的故事组成,让我们沉浸在惊心动魄的调查和雄辩的散文世界中。这些故事是丰富的文本数据源,使我们能够深入研究福尔摩斯世界中的语言模式和上下文关系。

本文的任务是开发一个强大的下一个单词预测模型,该模型可以准确预测给定单词序列之后最合适的单词。通过分析受福尔摩斯启发的数据集,该模型应能学习到支配单词进展的语言模式和关系。

要构建下一个单词预测模型:

  1. 首先收集各种文本文档数据集、
  2. 通过清理和标记化对数据进行预处理、
  3. 通过创建输入输出对来准备数据、
  4. 设计词嵌入等特征、
  5. 选择合适的模型,如 LSTM 或 GPT、
  6. 在数据集上训练模型,同时调整超参数、
  7. 通过试验不同的技术和架构来改进模型。

通过这种迭代过程,企业可以开发出准确、高效的下一个单词预测模型,并将其应用于各种应用中。

单词预测

import numpy as np
import tensorflow as tf
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Input, Embedding, LSTM, Dense
# Read the text file
with open('sherlock-holm.es_stories_plain-text_advs.txt', 'r', encoding='utf-8') as file:
    text = file.read()

现在,让我们对文本进行标记化,创建一个词序列:

tokenizer = Tokenizer()
tokenizer.fit_on_texts([text])
total_words = len(tokenizer.word_index) + 1

在上述代码中,文本被标记化,这意味着文本被分割成单个单词或标记。创建的 “Tokenizer ”对象将处理标记化过程。调用标记化器的 fit_on_texts 方法,将 “文本 ”作为输入。该方法会分析文本并建立一个包含唯一单词的词汇表,同时为每个单词分配一个数字索引。然后,total_words 变量被赋值为单词索引的长度加一,代表文本中不同单词的总数。

现在,让我们通过将文本分割成词组序列并从序列中形成 n-gram 来创建输入输出对:

input_sequences = []
for line in text.split('\n'):
    token_list = tokenizer.texts_to_sequences([line])[0]
    for i in range(1, len(token_list)):
        n_gram_sequence = token_list[:i+1]
        input_sequences.append(n_gram_sequence)

在上述代码中,文本数据使用“\n ”字符作为分隔符被分成几行。对于文本中的每一行,标记化器的 text_to_sequences 方法都会根据之前创建的词汇表将该行转换为数字标记序列。然后使用 for 循环对生成的标记列表进行迭代。每次迭代都会提取一个从标记列表开头到当前索引 “i ”的标记子序列(或 n-gram)。

这个 n-gram 序列代表输入上下文,最后一个标记是目标词或预测词。然后,这个 n-gram 序列会被添加到 input_sequences 列表中。对文本中的所有行重复这一过程,生成多个输入-输出序列,用于训练下一个单词预测模型。

现在,让我们对输入序列进行等长填充:

max_sequence_len = max([len(seq) for seq in input_sequences])
input_sequences = np.array(pad_sequences(input_sequences, maxlen=max_sequence_len, padding='pre'))

在上述代码中,输入序列被填充,以确保所有序列具有相同的长度。变量 max_sequence_len 被指定为所有输入序列的最大长度。pad_sequences 函数用于填充或截断输入序列,以匹配最大长度。

pad_sequences 函数接收 input_sequences 列表,将最大长度设置为 max_sequence_len,并使用 padding=pre 参数指定在每个序列的开头添加填充。最后,输入序列被转换成一个 numpy 数组,以便进一步处理。

现在,让我们将序列分为输入和输出:

X = input_sequences[:, :-1]
y = input_sequences[:, -1]

在上述代码中,输入序列被分成 “X ”和 “y ”两个数组,以创建用于训练下一个单词预测模型的输入和输出。"X "数组分配了 input_sequences 数组中除最后一列外所有行的值。这意味着 “X ”包含了每个序列中除最后一列外的所有词块,代表输入上下文。

另一方面,“y ”数组分配的是 input_sequences 数组中最后一列的值,它代表目标词或预测词。

现在,让我们将输出转换为 one-hot 编码向量:

y = np.array(tf.keras.utils.to_categorical(y, num_classes=total_words))

在上述代码中,我们将输出数组转换为适合训练模型的格式,其中每个目标词都表示为二进制向量。

神经网络

现在,让我们构建一个神经网络架构来训练模型:

model = Sequential()
model.add(Input(shape=(max_sequence_len-1,)))
model.add(Embedding(total_words, 100,))
model.add(LSTM(150))
model.add(Dense(total_words, activation='softmax'))
print(model.summary())
Model: "sequential"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓
┃ Layer (type)                         ┃ Output Shape                ┃         Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩
│ embedding (Embedding)(None, 17, 100)820,000 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ lstm (LSTM)(None, 150)150,600 │
├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤
│ dense (Dense)(None, 8200)1,238,200 │
└──────────────────────────────────────┴─────────────────────────────┴─────────────────┘
 Total params: 2,208,800 (8.43 MB)
 Trainable params: 2,208,800 (8.43 MB)
 Non-trainable params: 0 (0.00 B)
None

上面的代码定义了下一个单词预测模型的模型结构。创建的序列模型是一个线性层栈。添加到模型中的第一层是嵌入层,它负责将输入序列转换为固定大小的密集向量。它需要三个参数:

  1. total_words,表示词汇表中不同单词的总数;
  2. “100”,表示词嵌入的维度;
  3. 以及 “input_length”,指定输入序列的长度。

下一层是 LSTM 层,这是一种递归神经网络(RNN)层,用于捕捉数据中的顺序依赖关系。它有 150 个单元,这意味着它将学习 150 个内部表示或记忆单元。

最后,添加密集层,这是一个全连接层,用于生成输出预测。它有 “total_words ”单元,使用 softmax 激活函数将预测得分转换为概率,表示每个单词成为序列中下一个单词的可能性。

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X, y, epochs=100, verbose=1, batch_size = 64,)
Epoch 1/100
1505/1505 ━━━━━━━━━━━━━━━━━━━━ 30s 19ms/step - accuracy: 0.0561 - loss: 6.6592
Epoch 2/100
1505/1505 ━━━━━━━━━━━━━━━━━━━━ 28s 19ms/step - accuracy: 0.1005 - loss: 5.7390
Epoch 3/100
1505/1505 ━━━━━━━━━━━━━━━━━━━━ 28s 19ms/step - accuracy: 0.1305 - loss: 5.3347
Epoch 4/100
1505/1505 ━━━━━━━━━━━━━━━━━━━━ 28s 19ms/step - accuracy: 0.1495 - loss: 5.0435
Epoch 5/100
1505/1505 ━━━━━━━━━━━━━━━━━━━━ 29s 19ms/step - accuracy: 0.1625 - loss: 4.7998
...
Epoch 100/100
1505/1505 ━━━━━━━━━━━━━━━━━━━━ 31s 20ms/step - accuracy: 0.8825 - loss: 0.4746

在上述代码中,模型正在进行编译和训练。编译方法配置模型进行训练。损失参数设置为 categorical_crossentropy,这是多类分类问题常用的损失函数。优化器参数设置为 adam,这是一种在训练过程中调整学习率的优化算法。

度量参数设置为准确度,用于监测训练过程中的准确度。编译模型后,调用 “fit ”方法对输入序列 “X ”和相应的输出 “y ”进行训练。epochs 参数用于指定训练过程在整个数据集上迭代的次数。verbose 参数设置为 1 以显示训练过程。

模型评估

# evaluate the keras model
_, accuracy = model.evaluate(X, y)
print('Accuracy: %.2f' % (accuracy*100))
3010/3010 ━━━━━━━━━━━━━━━━━━━━ 17s 5ms/step - accuracy: 0.8882 - loss: 0.4568
Accuracy: 88.87

执行代码后,我们就可以使用模型生成下一个单词的预测结果了:

seed_text = "I will leave if they"
next_words = 3

for _ in range(next_words):
    token_list = tokenizer.texts_to_sequences([seed_text])[0]
    token_list = pad_sequences([token_list], maxlen=max_sequence_len-1, padding='pre')
    predicted = np.argmax(model.predict(token_list), axis=-1)
    output_word = ""
    for word, index in tokenizer.word_index.items():
        if index == predicted:
            output_word = word
            break
    seed_text += " " + output_word

print(seed_text)
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 142ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 16ms/step
1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 16ms/step
I will leave if they are going to

上述代码根据给定的种子文本生成下一个单词的预测结果。seed_text 变量保存初始文本。next_words 变量决定要生成的预测字数。在 for 循环中,seed_text将使用标记化器转换为标记序列。标记序列会进行填充,以符合最大序列长度。

模型通过调用带有填充标记序列的模型上的预测 方法来预测下一个单词。预测单词是通过使用 np.argmax 找到概率分数最高的单词得到的。然后,将预测的单词添加到 seed_text 中,并重复该过程以获得所需的 next_words 数量。最后,seed_text 将被打印出来,其中包含初始文本和生成的预测词。

这就是如何使用深度学习和 Python 编程语言构建下一个单词预测模型。

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

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

相关文章

Parallels Desktop 19虚拟机助你一机多用

Parallels Desktop 19 mac虚拟机是一款功能强大且易于使用的虚拟化软件,它允许用户在Mac电脑上同时运行Windows、Linux和其他多种操作系统,为用户提供了极大的灵活性和兼容性。 Parallels Desktop 19获取 这款虚拟机软件具有直观易用的界面,…

云动态摘要 2024-06-11

给您带来云厂商的最新动态,最新产品资讯和最新优惠更新。 最新优惠与活动 [低至1折]腾讯混元大模型产品特惠 腾讯云 2024-06-06 腾讯混元大模型产品特惠,新用户1折起! 云服务器ECS试用产品续用 阿里云 2024-04-14 云服务器ECS试用产品续用 最新产品更新 云服务器运维监…

您的计算机时间有误

问题 使用 apt update 更新软件时报错,提示 Release 文件已过期。 另外还发现,命令行 Ping 百度是通的,但是通过浏览器无法访问百度网站 解决 浏览器已经有很明确的的提示了:您的计算机时间有误。 所以,同步一下…

【总线】设计fpga系统时,为什么要使用总线?

目录 为什么用总线 为什么选择AMBA 总结 系列文章 【总线】AMBA总线架构的发展历程-CSDN博客 【总线】设计fpga系统时,为什么要使用总线?-CSDN博客 为什么用总线 在FPGA系统设计中,使用总线是为了实现组件间的高效互联与通信&#xff0c…

鸿蒙轻内核A核源码分析系列四(2) 虚拟内存

本文我们来熟悉下OpenHarmony鸿蒙轻内核提供的虚拟内存(Virtual memory)管理模块。 本文中所涉及的源码,以OpenHarmony LiteOS-A内核为例,均可以在开源站点 https://gitee.com/openharmony/kernel_liteos_a 获取。如果涉及开发板…

超详细十大排序算法

一、排序总结 性能指标:稳定性,时间复杂度,空间复杂度 排序算法的稳定性是指当排序的元素中存在相同的值时,排序算法能够保持它们原先的相对顺序。如果一个排序算法是稳定的,那么在排序后,相同值的元素在原…

uni-admin:基于uni-app与uniCloud的云端管理后台开发神器

随着移动互联网和云计算技术的飞速发展,越来越多的企业和开发者开始寻求一种快速、高效且灵活的解决方案来构建自己的管理后台系统。在这样一个背景下,uni-admin应运而生,它基于uni-app和uniCloud,为开发者提供了一个功能强大、易…

YOLO检测环境安装配置

YOLO介绍 YOLO学习手册:YOLO教程 YOLO [ˈjoʊloʊ](You Only Look Once)是一种快速而准确的目标检测算法,由Joseph Redmon等人在2016年提出。YOLO被广泛应用于计算机视觉领域,包括实时视频分析、自动驾驶、安防监控、…

理解 Bearer Token:什么是它以及如何运作?

在当前数字化时代,网络安全尤为关键。随着技术快速进步,需求日益增长,保障应用程序中用户数据的安全成为开发者们的首要任务。其中,Bearer Token 作为一种高效的验证策略,在防止未授权访问中发挥着不可或缺的作用。 解…

高清实拍类型视频素材去哪里找?高清实拍素材网站分享

在这篇文章中,我将为大家介绍一些高清实拍类型的视频素材资源,这些资源对于我们新媒体创作者来说至关重要。优质的视频素材能显著提升作品的吸引力,因此选择合适的视频素材平台非常关键。下面我将详细介绍几个非常实用的视频素材平台&#xf…

CV技术指南 | 其实Mamba是一种线性注意力?清华大学黄高团队揭秘开视觉Mamba的真实面目!

本文来源公众号“CV技术指南”,仅用于学术分享,侵权删,干货满满。 原文链接:其实Mamba是一种线性注意力?清华大学黄高团队揭秘开视觉Mamba的真实面目! 前言 本文揭示了 Mamba 模型与 Linear Attention …

shell脚本和变量

一、shell脚本 脚本就是可运行的代码的集合,脚本语言(计算机语言)的特点:从上到下,按行执行。 Python:脚本语言,格式更严谨,严格地执行缩进。也是从上到下按行执行。 shell脚本运…

Linux文件权限信息和Linux文件与文件夹的管理

目录 前言一、系统环境二、Linux文件权限信息2.1 查看Linux文件权限信息2.2 修改Linux文件权限信息2.2.1 chmod命令2.2.2 chown命令 三、Linux文件与目录的管理3.1 查看文件或文件夹3.1.1 查看文件内容3.1.2 查看文件夹内容 3.2 新增文件或文件夹3.2.1 新增文件3.2.2 新增文件夹…

从零开始利用MATLAB进行FPGA设计(七)固化程序

FPGA开发板:AX7020;Xilinx 公司的 Zynq7000 系列的芯片XC7Z020-2CLG400I,400引脚 FBGA 封装。 HARDWARE PLATFORM在2019以后的vivado中已经没有了。本期实际上已经与MATLAB无关,主要介绍通过VITIS等方法进行程序固化。 目录 ZY…

光伏+储能,势在必行!

随着全球对可再生能源需求的不断增长,光伏行业正迎来前所未有的发展机遇。然而,光伏发电的间歇性和不稳定性特点,使得储能技术成为解决其并网难题、提高能源利用效率的关键。因此,“光伏储能”的组合,已成为行业发展的…

老生常谈!程序员为什么要阅读源代码?

大家好,我是码农先森。 阅读源码这是一个老生常谈的话题了,但又是很多人想做又没有付出行动的事情。前段时间我研究了 Swoole 的源代码,并且输出了系列的源码分析文章「感兴趣的朋友可以翻阅以前的文章」。虽然这个过程很枯燥和艰难&#xf…

c++ 6.11

作业: 思维导图: 作业题: 搭建一个货币的场景,创建一个名为 RMB 的类,该类具有整型私有成员变量 yuan(元)、jiao(角)和 fen(分),并且…

VMware Workstation虚拟机进入U盘PE系统

注意事项 VMware Workstation虚拟机版本不能高于16.1.2版本!!! 本实验使用的版本如下 实际操作 在已安装好的虚拟机处右键,点击设置。虚拟机安装win10教程请参考VMware Workstation安装win10操作系统-CSDN博客 在弹出的窗口点击…

卷产品 、卷生态,百度这款AI产品卷到了第一

万万没想到,最先跑出来的AI杀手级应用竟然是百度文库。 6月7日,“AI产品榜”(aicpb.com)发布了最新的5月国内总榜榜单,百度文库AI功能以6536万的月访问量一骑绝尘,连续两个月霸榜第一。 乍看有些不可思议&…

2-1基于matlab的拉普拉斯金字塔图像融合算法

基于matlab的拉普拉斯金字塔图像融合算法,可以使部分图像模糊的图片清楚,也可以使图像增强。程序已调通,可直接运行。 2-1 图像融合 拉普拉斯金字塔图像融合 - 小红书 (xiaohongshu.com)