tnblog
首页
视频
资源
登录

python 循环:序列依赖问题(学习笔记)

3124人阅读 2023/5/10 22:09 总访问:3532950 评论:0 收藏:0 手机
分类: AI

python 循环:序列依赖问题(学习笔记)

循环:序列依赖问题


当我们要机器识别语言时,不以字符为单位,而是以词为单位通过查词典的方式进行。以Nice to meet you举例,通过查词典的方式我们得到它的序列并形成一个向量[6787 2845 5898 9032]


中文相比英文来讲多一步分词操作举例:


当然这样处理会出现一个问题,当学习到开除与开心的时候,由于二者第一个字母是一样的再进行归一化处理,这两个数值差异极小但概念不同,这样的数据就会有所偏差。


如果我们进行One-hot操作,让所有的序列都变成如下一样的矩阵,这样减少了词汇之间的关联性同样也减少了上面的问题。
但仍然不是很好的办法。


再比如下面猫狗应该是比较接近的,苹果和西瓜也是比较接近的,但这里one-hot无法识别会把它们看成四类。
这样难以训练和泛化,并且还会让输入的数据非常大。


为了解决这个问题,我们可以提取出一个物体或动物的多个特征,比如它是否是名词?是否是动物?…等;多个特征值组成一个向量。


我们给一个词添加多个特征的值,当有句子对应到相关的词时候我们进行One-hot处理,得出新的矩阵再进行铺开后得出一组向量并进行全连接神经网络的计算运行。前面W与X相乘的过程被称为嵌入层。


一般使用别人的海量数据上训练好的词向量数据,应用到自己的工程中,常见的词向量训练算法有word2vec和GloVe。


除此之外还需要注意的是:时间序列上的不一样,会导致机器学习的不正确。举例这个视频非常好看、这个视频非常不好看由于非常好看的词汇导致正面评论关系比较大,但由于一个不值就会进行反转,而机器学习更需要注意的是其中的关联性。

编程实践


再此之前我们准备了一个online_shopping_10_cats.csv的数据。
里面每行有三列不同的数据:类型,是否是正面评价(1代表是,0表不是),评论文本。


添加新的py工具文件shopping_data.py.

  1. import os
  2. import keras
  3. import numpy as np
  4. import keras.preprocessing.text as text
  5. import re
  6. import jieba
  7. import random
  8. def load_data():
  9. xs = []
  10. ys = []
  11. with open(os.path.dirname(os.path.abspath(__file__))+'/online_shopping_10_cats.csv','r',encoding='utf-8') as f:
  12. line=f.readline()#escape first line"label review"
  13. while line:
  14. line=f.readline()
  15. if not line:
  16. break
  17. contents = line.split(',')
  18. # if contents[0]=="书籍":
  19. # continue
  20. label = int(contents[1])
  21. review = contents[2]
  22. if len(review)>20:
  23. continue
  24. xs.append(review)
  25. ys.append(label)
  26. xs = np.array(xs)
  27. ys = np.array(ys)
  28. #打乱数据集
  29. indies = [i for i in range(len(xs))]
  30. random.seed(666)
  31. random.shuffle(indies)
  32. xs = xs[indies]
  33. ys = ys[indies]
  34. m = len(xs)
  35. cutpoint = int(m*4/5)
  36. x_train = xs[:cutpoint]
  37. y_train = ys[:cutpoint]
  38. x_test = xs[cutpoint:]
  39. y_test = ys[cutpoint:]
  40. print('总样本数量:%d' % (len(xs)))
  41. print('训练集数量:%d' % (len(x_train)))
  42. print('测试集数量:%d' % (len(x_test)))
  43. return x_train,y_train,x_test,y_test
  44. def createWordIndex(x_train,x_test):
  45. x_all = np.concatenate((x_train,x_test),axis=0)
  46. #建立词索引
  47. tokenizer = text.Tokenizer()
  48. #create word index
  49. word_dic = {}
  50. voca = []
  51. for sentence in x_all:
  52. # 去掉标点
  53. sentence = re.sub("[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。?、~@#¥%……&*()]+", "", sentence)
  54. # 结巴分词
  55. cut = jieba.cut(sentence)
  56. #cut_list = [ i for i in cut ]
  57. for word in cut:
  58. if not (word in word_dic):
  59. word_dic[word]=0
  60. else:
  61. word_dic[word] +=1
  62. voca.append(word)
  63. word_dic = sorted(word_dic.items(), key = lambda kv:kv[1],reverse=True)
  64. voca = [v[0] for v in word_dic]
  65. tokenizer.fit_on_texts(voca)
  66. print("voca:"+str(len(voca)))
  67. return len(voca),tokenizer.word_index
  68. def word2Index(words,word_index):
  69. vecs = []
  70. for sentence in words:
  71. # 去掉标点
  72. sentence = re.sub("[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。?、~@#¥%……&*()]+", "", sentence)
  73. # 结巴分词
  74. cut = jieba.cut(sentence)
  75. #cut_list = [ i for i in cut ]
  76. index=[]
  77. for word in cut:
  78. if word in word_index:
  79. index.append(float(word_index[word]))
  80. # if len(index)>25:
  81. # index = index[0:25]
  82. vecs.append(np.array(index))
  83. return np.array(vecs)


上代码。

  1. import shopping_data
  2. from keras.preprocessing import sequence
  3. from keras.models import Sequential
  4. from keras.layers import Dense, Embedding
  5. from keras.layers import Flatten
  6. # 获取数据
  7. x_train, y_train, x_test, y_test = shopping_data.load_data()
  8. # 打印向量的长度
  9. print('x_train.shape:',x_train.shape) # 13276
  10. print('y_train.shape:',y_train.shape) # 13276
  11. print('x_test.shape:',x_test.shape) # 3319
  12. print('y_test.shape:',y_test.shape) # 3319
  13. # 打印出第一组数据
  14. print(x_train[0])
  15. print(y_train[0])
  16. # 统计全体词汇
  17. # 做one hot编码
  18. # 使用Embedding来专门做嵌入层这件事。
  19. # vocalen 是这个词典的词汇数量
  20. # word_index 训练集和测试集全部语言的词典
  21. vocalen, word_index = shopping_data.createWordIndex(x_train, x_test)
  22. print(vocalen)
  23. print('词典总词数:',word_index)
  24. # 转换成向量
  25. # 举例:x_train 今天天气不错
  26. # # ()
  27. # x_train_index=
  28. x_train_index = shopping_data.word2Index(x_train, word_index)
  29. x_test_index =shopping_data.word2Index(x_test, word_index)
  30. maxlen = 25
  31. # 把序列按照maxlen进行对齐
  32. # 把长度不足25的补齐为25
  33. x_train_index = sequence.pad_sequences(x_train_index, maxlen=maxlen)
  34. x_test_index = sequence.pad_sequences(x_test_index, maxlen=maxlen)
  35. # 设置训练层以及神经元数量
  36. model = Sequential()
  37. # 添加嵌入层
  38. # input_dim 输入维度
  39. # output_dim 输出维度
  40. # input_length 序列长度
  41. # trainable 是否在这一层训练的时候更新参数。
  42. model.add(Embedding(trainable=False,input_dim=vocalen,output_dim=300,input_length=maxlen))
  43. # 平铺数据
  44. model.add(Flatten())
  45. # 三个隐藏层
  46. model.add(Dense(256, activation='relu'))
  47. model.add(Dense(256, activation='relu'))
  48. model.add(Dense(256, activation='relu'))
  49. # 加一个sigmoid函数
  50. model.add(Dense(1, activation='sigmoid'))
  51. # compile模型
  52. # loss binary_crossentropy 交叉熵代价函数
  53. # optimizer adam 动量自适应优化器 比sgd快
  54. model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
  55. # 200回合批尺寸为512
  56. model.fit(x_train_index, y_train, batch_size=512,epochs=200)
  57. # 进行训练
  58. score, acc = model.evaluate(x_test_index, y_test)
  59. print('Test score:', score)
  60. print('Test accuracy:', acc)


最后训练的结果为0.79不是很高,然后我们改一下嵌入层更新词汇,再次训练就会明显高很多。

  1. model.add(Embedding(trainable=True,input_dim=vocalen,output_dim=300,input_length=maxlen))


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

python学习 1-安装

Ptyhon非常简单易用的面向对象的脚本语言,跨平台 入门简单python分2个版本 Python2、Python3。Python 2.7 将于 2020 年结...

python学习 2-基本语法

基础:python脚本语言,不需要编译(像C#、Java、PHP、C++需要编译成机器可识别的语言), 而直接由解释器解释,很多地方类似...

python学习 3-爬虫基本介绍 及简单实例

爬虫爬虫就是一只猪,蜘蛛。。 网络蜘蛛。互联网是一个网由各个网站组成。无数的蜘蛛就在网上到处爬,根据网址从一个网站爬...

python实例 1-日志抓取处理 补错附日志小技巧

有时候数据出了问题,可以从日志中恢复数据(如果你没记日志..没备份..→_→..)一、日志展示介绍个平常自己用的小方法,如...

python实例 2-12306抢票(一) 登陆

开坑年关将近,终于对12306下手了,,平安夜撸代码,攻克了12306的登陆 2018-12-24 22:16:00没错 这篇博客就写从零开始的异...

python安装pip以及使用pip安装requests等模块

pip很简单的介绍pip 是一个现代的,通用的 Python 包管理工具。提供了对 Python 包的查找、下载、安装、卸载的功能。如果想...

python数据集合区别

列表(list):可读写,值可以重复,有序排列,初始化语法:['tom',‘jerry’]元组(tuple):只读,值可以重复,...

python实例 2-12306抢票(二) 下单

第二篇 刷票与下单1.记住登陆上一篇写了登陆:http://www.tnblog.net/cz/article/details/162 为了方便调试 不让每次登陆都...

使用VS Code开发python

Vs Code开发Python可以很好的支持代码调试、智能提示、代码对齐等1:下载VS Codehttps://code.visualstudio.com/Downloadvs ...

python变量与命名

Python使用等号 ( = ) 作为赋值运算符,例如a = 66 就是一条赋值语句,作用就是将66赋值给变量a。Python是弱类型语言,弱类...

python关键字和内置函数

Python中包含了如下所示的关键字:上面这些关键字都不能作为变量名。另外,Python 3还提供了如下表所示的内置函数:也不能...

python基础输入和输出

Python使用print()函数向打印程序输出,采用input()函数接收程序输入。print()函数的语法格式如下:print(value,...,sep=&#...

python基本数据类型

Python包含两大类基本数据类型:数值类型、字符串类型,三大类组合数据类型:集合类型、序列类型和字典类型.数值类型:整型...

python中通过fake_useragent生成随机UserAgent

fake_useragent第三方库,来实现随机请求头的设置;GitHub ---> https://github.com/hellysmile/fake-useragent安...

python 升级pip

一条命令即可: python -m pip install --upgrade pip 安装成功后,一般是在python目录下面的Scripts里边的

python html编码解码

使用方法:html.escape(s)与html.unescape即可 import html s="<div>jsdlfjsl</div>" #html编...
这一世以无限游戏为使命!
排名
2
文章
647
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术