【人工智能原理自学】LSTM网络:自然语言处理实践

news2024/11/26 7:42:14

😊你好,我是小航,一个正在变秃、变强的文艺倾年。
🔔本文讲解LSTM网络:自然语言处理实践,一起卷起来叭!

目录

  • 一、“RNN”
  • 二、编程实验

在这里插入图片描述

一、“RNN”

上节课我们利用词嵌入把句子转化为词向量序列的详细过程,但忽略了语言数据在时间上的关联性,这节课来让我们的神经网络具有处理这种关联的能力

我们不考虑预处理这一过程,假设都已经处理成了合适的300维词向量,现在我们开始改造一下神经网络的工作模式:

我们将每次的输出值保存起来,与下一个词向量一起作为下一次的输入,直到得到最后的预测输出。

在这里插入图片描述

这样一个句子的每个词对最后预测输出的影响就在每一次的保存和下一步的数据的共同作用中持续到了最后,我们把这样的神经网络称为:RNN 循环神经网络

在这里插入图片描述
不过一般便于我们把网络在时间上逐步的行为在空间上展示,我们常常这样作图:
在这里插入图片描述
现在我们来看一句话,单看后面,我们会认为“老虎”、“扬子鳄”、“袋鼠”等等都是合理的。
在这里插入图片描述
但是根据前面的四川,我会认为这个词大概率是“熊猫”,而不是其他动物。
在这里插入图片描述
此时我们发现,“四川”这个词距离后面填空非常远,换句话说:依赖的路径十分的长,标准的RNN结构在这种“长依赖”问题上表现并不好。所以人们又对神经网络进行了改造,其中比较著名的便是:LSTM
在这里插入图片描述
这是一个标准的RNN结构的某一步:

在这里插入图片描述
我们再来看看LSTM结构:
LSTM结构中的输出再次经过一个tanh函数,而原先的输出则变成了一个叫细胞状态的东西,这个细胞状态就是LSTM结构能应对长依赖问题的关键,这个结构的输入相应的变成了上一个细胞状态和上一步的输出。为了实现记忆和遗忘,LSTM结构使用了两个门来实现:遗忘门、更新门。最终的输出也有一个输出门,根据输出的内容的重要性进行强弱输出。

在这里插入图片描述
🔗有关LSTM的更多理解,可以参考这篇博客:《Understanding LSTM Networks》

在这里插入图片描述
大家可以了解一下,相比于LSTM,GRU做了哪些改变和简化。

在这里插入图片描述

二、编程实验

🔗参考链接:关于第三方预训练词向量的下载方法

项目演示为红框内容(这个1.7G的预训练词向量文件的加载过程十分的长):

在这里插入图片描述

🔨词向量处理工具:chinese_vec.py

import os
import numpy as np


def load_word_vecs():
    embeddings_index = {}
    f = open(os.path.dirname(os.path.abspath(__file__)) + '/sgns.target.word-word.dynwin5.thr10.neg5.dim300.iter5',
             encoding='utf8')
    f.readline()  # escape first line
    for line in f:
        values = line.split()
        word = values[0]
        coefs = np.asarray(values[1:], dtype='float32')
        embeddings_index[word] = coefs
    f.close()

    print('Found %s word vectors.' % len(embeddings_index))
    return embeddings_index

🔨一份网购评论数据:online_shopping_10_cats.csv

cat,label,review
书籍,1,做父母一定要有刘墉这样的心态,不断地学习,不断地进步,不断地给自己补充新鲜血液,让自己保持一颗年轻的心。我想,这是他能很好的和孩子沟通的一个重要因素。读刘墉的文章,总能让我看到一个快乐的平易近人的父亲,他始终站在和孩子同样的高度,给孩子创造着一个充满爱和自由的生活环境。很喜欢刘墉在字里行间流露出的做父母的那种小狡黠,让人总是忍俊不禁,父母和子女之间有时候也是一种战斗,武力争斗过于低级了,智力较量才更有趣味。所以,做父母的得加把劲了,老思想老观念注定会一败涂地,生命不息,学习不止。家庭教育,真的是乐在其中。
书籍,1,作者真有英国人严谨的风格,提出观点、进行论述论证,尽管本人对物理学了解不深,但是仍然能感受到真理的火花。整本书的结构颇有特点,从当时(本书写于八十年代)流行的计算机话题引入,再用数学、物理学、宇宙学做必要的铺垫——这些内容占据了大部分篇幅,最后回到关键问题:电脑能不能代替人脑。和现在流行的观点相反,作者认为人的某种“洞察”是不能被算法模拟的。也许作者想说,人的灵魂是无可取代的。
书籍,1,作者长篇大论借用详细报告数据处理工作和计算结果支持其新观点。为什么荷兰曾经县有欧洲最高的生产率?为什么在文化上有着深刻纽带关系的中国和日本却在经济发展上有着极大的差异?为什么英国的北美殖民地造就了经济强大的美国,而西班牙的北美殖民却造就了范后的墨西哥?……很有价值,但不包括【中国近代史专业】。
书籍,1,作者在战几时之前用了"拥抱"令人叫绝.日本如果没有战败,就有会有美军的占领,没胡官僚主义的延续,没有战后的民发反思,没有~,就不会让日本成为一个经济强国.当然,美国人也给日本人带来了耻辱.对日中关系也造成了深远的影响.文中揭露了"东京审判"中很多鲜为人知的东西.让人惊醒.唉!中国人民对日本的了解是不是太少了.
书籍,1,作者在少年时即喜阅读,能看出他精读了无数经典,因而他有一个庞大的内心世界。他的作品最难能可贵的有两点,一是他的理科知识不错,虽不能媲及罗素,但与理科知识很差的作家相比,他的文章可读性要强;其二是他人格和文风的朴实,不造作,不买弄,让人喜欢。读他的作品,犹如听一个好友和你谈心,常常唤起心中的强烈的共鸣。他的作品90年后的更好些。衷心祝愿周国平健康快乐,为世人写出更多好作品。
书籍,1,作者有一种专业的谨慎,若能有幸学习原版也许会更好,简体版的书中的印刷错误比较多,影响学者理解,全书结构简单,但内容详实,学起来如鱼得水非常轻松。这只是一项技术而已,若可以结合本专业,将会得到更高的学习快乐,家财万贯不如一技在身,一技在身不如一念在心,本书有不仅有技,而且有念。书中佳品。
...
完整版在文末
每条数据有三个部分:商品分类、情感标签数据(1正面、0负面)、评论文本

🔨数据操作工具:shopping_data.py

import os
import keras
import numpy as np
import keras.preprocessing.text as text
import re
import jieba
import random



def load_data():
	xs = []
	ys = []
	with open(os.path.dirname(os.path.abspath(__file__))+'/online_shopping_10_cats.csv','r',encoding='utf-8') as f:
		line=f.readline()#escape first line"label review"
		while line:
			line=f.readline()
			if not line:
				break
			contents = line.split(',')

			# if contents[0]=="书籍":
			# 	continue

			label = int(contents[1])
			review = contents[2]
			if len(review)>20:
				continue

			xs.append(review)
			ys.append(label)

	xs = np.array(xs)
	ys = np.array(ys)

	#打乱数据集
	indies = [i for i in range(len(xs))] 
	random.seed(666)
	random.shuffle(indies)
	xs = xs[indies]
	ys = ys[indies]

	m = len(xs)
	cutpoint = int(m*4/5)
	x_train = xs[:cutpoint]
	y_train = ys[:cutpoint]

	x_test = xs[cutpoint:]
	y_test = ys[cutpoint:]

	

	print('总样本数量:%d' % (len(xs)))
	print('训练集数量:%d' % (len(x_train)))
	print('测试集数量:%d' % (len(x_test)))

	return x_train,y_train,x_test,y_test


def createWordIndex(x_train,x_test):
	x_all = np.concatenate((x_train,x_test),axis=0)
	#建立词索引
	tokenizer = text.Tokenizer()
	#create word index
	word_dic = {}
	voca = []
	for sentence in x_all:
	    # 去掉标点
	    sentence = re.sub("[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。?、~@#¥%……&*()]+", "", sentence)
	    # 结巴分词
	    cut = jieba.cut(sentence)
	    #cut_list = [ i for i in cut ]

	    for word in cut:
	    	if not (word in word_dic):
	    		word_dic[word]=0
	    	else:
	    		word_dic[word] +=1
	    	voca.append(word)
	word_dic = sorted(word_dic.items(), key = lambda kv:kv[1],reverse=True)

	voca = [v[0] for v in word_dic]
	
	tokenizer.fit_on_texts(voca)
	print("voca:"+str(len(voca)))
	return len(voca),tokenizer.word_index

def word2Index(words,word_index):
	vecs = []
	for sentence in words:
	    # 去掉标点
	    sentence = re.sub("[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。?、~@#¥%……&*()]+", "", sentence)
	    # 结巴分词
	    cut = jieba.cut(sentence)
	    #cut_list = [ i for i in cut ]
	    index=[]

	    for word in cut:
	    	if word in word_index:
	    		index.append(float(word_index[word]))

	    # if len(index)>25:
	    # 	index = index[0:25]
	    vecs.append(np.array(index))

	return np.array(vecs)

🔨模型训练:comments_lstm.py

import shopping_data
# 数据对齐
from keras.utils import pad_sequences

from keras.models import Sequential
from keras.layers import Dense, Embedding
# 导入LSTM
from keras.layers import LSTM
# 读取中文词向量工具
import chinese_vec
import numpy as np

x_train, y_train, x_test, y_test = shopping_data.load_data()
# 打印数据集
# print('x_train.shape:', x_train.shape)
# print('y_train.shape:', y_train.shape)
# print('x_test.shape:', x_test.shape)
# print('y_test.shape:', y_test.shape)
# print(x_train[0])
# print(y_train[0])

vocalen, word_index = shopping_data.createWordIndex(x_train, x_test)
# print(word_index)
# print('词典总词数:', vocalen)

# 转化为索引向量
x_train_index = shopping_data.word2Index(x_train, word_index)
x_test_index = shopping_data.word2Index(x_test, word_index)
# 每一句话的索引向量个数不一样,我们需要把序列按照maxlen对齐
maxlen = 25
x_train_index = pad_sequences(x_train_index, maxlen=maxlen)
x_test_index = pad_sequences(x_test_index, maxlen=maxlen)

# 自行构造词嵌入矩阵
word_vecs = chinese_vec.load_word_vecs()
embedding_matrix = np.zeros((vocalen, 300))

for word, i in word_index.items():
    embedding_vector = word_vecs.get(word)
    if embedding_vector is not None:
        embedding_matrix[i] = embedding_vector

# 神经网络模型
model = Sequential()
model.add(
    Embedding(
        trainable=False, # 冻结这一层,不要让它预训练
        weights=[embedding_matrix],
        input_dim=vocalen, # 输入维度
        output_dim=300, # 输出维度
        input_length=maxlen # 序列长度
    )
)
model.add(LSTM(
        128, # 输出数据的维度
        return_sequences=True # 每一个都输出结果
))
model.add(LSTM(128))

# 二分类问题,使用sigmoid激活函数
model.add(Dense(1, activation='sigmoid'))
model.compile(
    loss='binary_crossentropy', # 适用于二分类问题的交叉熵代价函数
    optimizer='adam', # adam是一种使用动量的自适应优化器,比普通的sgd优化器更快
    metrics=['accuracy']
)
# 训练
model.fit(x_train_index, y_train, batch_size=512, epochs=200)
score, acc = model.evaluate(x_test_index, y_test)
# 评估
print('Test score:', score)
print('Test accuracy:', acc)

🚩训练结果与评估结果:
在这里插入图片描述

📌 [ 笔者 ]   文艺倾年
📃 [ 更新 ]   2023.1.27
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!
🔍 [ 代码 ]   https://github.com/itxaiohanglover/ai_lesson

在这里插入图片描述

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

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

相关文章

手把手本地搭建服务器笔记1

需要的下载的东西: vmware (百度网盘)银河麒麟镜像xshell,xftp安装vmware: 下载的包里有密钥,安装的时候就直接把密钥扔里面就好了 镜像处理: vmware左上角文件-新建虚拟机-典型,下一步 -安装程序光盘映像文件&am…

基于嵌入式物联网技术的智慧病房方案设计

文章目录前言1、要求2、系统设计3、功能模块3、系统功能模块图一、stm32控制模块原理图二、各功能模块的实现1、整个系统的基本配置2、RTOS多任务1、设计线程2、配置主函数代码3、温湿度读取模块(I2C)4、LED定时开关灯(pwm)5、按键实现报警信号6、脉搏&血氧数据读取7、UART…

【HTML】基础的入门学习

HTML 菜鸟教程 简介 一般结构&#xff1a; <!DOCTYPE html> 声明为 HTML5 文档<html> 元素是 HTML 页面的根元素<head> 元素包含了文档的元&#xff08;meta&#xff09;数据&#xff0c;如 <meta charset"utf-8"> 定义网页编码格式为 ut…

proteus仿真软件中芯片的命名规则与封装方法(详细版)

第一&#xff1a;PCB封装库命名规则 1、集成电路&#xff08;直插&#xff09; 用DIP-引脚数量尾缀来表示双列直插封装​ 尾缀有N和W两种,用来表示器件的体宽​ 为体窄的封装&#xff0c;体宽300mil,引脚间距2.54mm​ 为体宽的封装, 体宽600mil,引脚间距2.54mm​ 如&#…

11、关联数据库

文章目录11、关联数据库11.1 常规方式11.2 常规操作【尚硅谷】idea实战教程-讲师&#xff1a;宋红康 生活是属于每个人自己的感受&#xff0c;不属于任何别人的看法 11、关联数据库 11.1 常规方式 找到数据库选项&#xff1a; 添加指定数据库&#xff1a; 配置MySQL数据库…

5. 网络编程之UDP编程

1. UDP协议的特点 相比与TCP协议来说&#xff0c;UDP协议就显得相对比较简单了。 (1) UDP是无连接的   即发送数据之前不需要建立连接(当然&#xff0c;发送数据结束时也没有连接可释放)&#xff0c;因此减少了开销和发送数据之前的时延。 (2) UDP使用尽最大努力交付   即…

78、Points2NeRF: Generating Neural Radiance Fields from 3D point cloud

简介 github&#xff1a;https://github.com/gmum/points2nerf 由于点云的大小和复杂性&#xff0c;处理这些点云具有挑战性&#xff0c;现有的方法通过将网格拟合到点云并渲染来解决这个问题&#xff0c;这种方法导致结果可视化的保真度降低&#xff0c;并遗漏了在计算机图形…

HashTable HashMap ConcurrentHashMap 的介绍以及区别

目录 &#x1f407;今日良言:投资自己才是最好的投资 &#x1f409;一.HashMap. &#x1f415;二.HashTable &#x1f40d;三.ConcurrentHashMap &#x1f402;四.三者的区别 &#x1f407;今日良言:投资自己才是最好的投资 时隔四十多天,今天博主要更新了. 后续内容也是精…

[机器学习]损失函数DLC

一、损失函数的概念 损失函数(Loss Function)是用于评估预测结果和真实结果之间差距的一个公式&#xff0c;为模型优化指明方向。在模型优化过程中一般表述为&#xff1a;或 与针对整个训练集的代价函数(Cost Function)不同&#xff0c;损失函数通常仅针对单个训练样本。可以归…

RK3568平台开发系列讲解(驱动基础篇)Linux 内核源码介绍

🚀返回专栏总目录 文章目录 一、目录树概览二、快速确定主板关联代码2.1、基础代码2.2、驱动代码沉淀、分享、成长,让自己和他人都能有所收获!😄 📢进行嵌入式 Linux 产品开发,往往需要对内核进行裁剪和定制,以满足嵌入式产品的功能和性能需求。 一、目录树概览 解压…

Python---学生管理系统(pyinstaller)

专栏&#xff1a;python 个人主页&#xff1a;HaiFan. 专栏简介&#xff1a;本专栏主要更新一些python的基础知识&#xff0c;也会实现一些小游戏和通讯录&#xff0c;学时管理系统之类的&#xff0c;有兴趣的朋友可以关注一下。 学生管理系统前言创建入口函数新增学生insert展…

行为型模式-迭代器模式

1.概述 定义&#xff1a;提供一个对象来顺序访问聚合对象中的一系列数据&#xff0c;而不暴露聚合对象的内部表示。 2.结构 迭代器模式主要包含以下角色&#xff1a; 抽象聚合&#xff08;Aggregate&#xff09;角色&#xff1a;定义存储、添加、删除聚合元素以及创建迭代器…

实战案例:Python批量识别银行卡号码并且写入Excel,初学者也可以轻松使用~

大家好&#xff0c;这里是程序员晚枫&#xff0c; 今天我们继续学习Python自动化办公&#xff1a;每次有新员工入职&#xff0c;都要收集大量的工资卡信息&#xff0c;并且生成Excel文档&#xff0c;能不能用Python准确、快速地解决呢&#xff1f; 今天我们就来学习一下&…

【CCNA | 网络模拟器CPT系列】Cisco Packet Tracer 8.2.0 的安装 Ⅰ

目录1. 下载 Cisco Packet Tracer2. 安装 Cisco Packet Tracer&#xff08;1&#xff09;许可协议界面&#xff08;2&#xff09;选择安装目录&#xff08;3&#xff09;选择开始菜单文件夹&#xff08;4&#xff09;选择附加任务&#xff08;5&#xff09;确认设置选择&#x…

K8S环境安装

K8S环境安装 下面是环境的主机名和IP 主机名ipk8smaster192.168.68.150k8snode1192.168.68.151k8snode2192.168.68.152 1、安装docker 配置yum源 sudo yum install -y yum-utils sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/d…

不受支持的 Mac 上的通用控制(现已支持 macOS Ventura)

现已支持 macOS Ventura 请访问原文链接&#xff1a;不受支持的 Mac 上的通用控制&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;www.sysin.org 本文为 在不受支持的 Mac 上安装 macOS Ventura、Monterey、Big Sur (OpenCore Legacy Pa…

【Effective_Objective-C_5内存管理】

文章目录前言29.理解引用计数引用计数的工作原理关闭ARC模式引用计数的增减理解一下引用计数存在属性存取方法中的内存管理自动释放池保留环要点30.以ARC简化引用计数使用ARC时必须遵循的方法和命名规则-变量的内存管理语法意义ARC如何清理实例变量覆写内存管理的方法要点31.在…

eclipse调试没反应,没有Debug窗口弹出

用eclipse调试&#xff0c;点击“Run”“Debug as”没有反应&#xff0c;debug视图没有弹出一、打开Preferences点击“Windows”&#xff0c;点击“Preferences”&#xff0c;找到“Run/Debug”下面的“Perspectives”&#xff0c;我的打开是这个样子&#xff0c;要修改一些选项…

【JavaSE成神之路】一文搞定static关键字

哈喽&#xff0c;我是兔哥呀&#xff0c;今天就让我们继续这个JavaSE成神之路&#xff01; 这一节啊&#xff0c;咱们要学习的内容是Java的static关键字。 1. 我们是怎么使用static关键字的 我们其实一直在用static关键字&#xff0c;比如main方法&#xff1a; public stati…

CSS样式基础内容3

目录 CSS三大特性 层叠性 继承性 行高的继承性 优先级 权重的叠加 CSS盒子模型 border边框 边框的复合写法 表格的细线边框 边框会影响盒子的实际大小 内边距 padding会影响盒子实际大小 网页导航案例 外边距 外边距合并 相邻块元素垂直外边距的合并 清除内外…