热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

TensorFlow中的自然语言处理(吴恩达视频)

TensorFlow中的自然语言处理(吴恩达视频)TensorFlow中的自然语言处理1简单短例子2tensorflow.keras实现IMDB情感分类

TensorFlow 中的自然语言处理 (吴恩达视频)

  • TensorFlow 中的自然语言处理
    • 1 简单短例子
    • 2 tensorflow.keras实现IMDB情感分类实战
      • 2.1 数据准备
      • 2.2 数据预处理
      • 2.3 模型训练
      • 2.4 可视化训练效果
      • 2.5 结果预测


TensorFlow 中的自然语言处理

【吴恩达团队Tensorflow2.0实践系列课程第三课】TensorFlow2.0中的自然语言处理

这个暑假计划学习NLP,看的是吴恩达老师的视频,已经看到第三课,大家有兴趣的可以看看之前的视频,我觉得讲得非常好。写博客是为了更好的学习,将其中一些细节写下来避免遗忘。


1 简单短例子


Tokenizer是一个用于向量化文本,或将文本转换为序列(即单词在字典中的下标构成的列表,从1算起)的类。

构造参数

  • num_words:None或整数,处理最大单词数量。若被设置为整数,则分词器将被限制为待处理数据集中最常见的num_words个单词
  • filters&#xff1a;需要滤除的字符的列表或连接形成的字符串&#xff0c;例如标点符号。默认值为 ‘!"#$%&()*&#43;,-./:;<&#61;>?&#64;[]^_&#96;{|}~\t\n’&#xff0c;包含标点符号&#xff0c;制表符和换行符等
  • lower&#xff1a;布尔值&#xff0c;是否将序列设为小写形式
  • split&#xff1a;字符串&#xff0c;单词的分隔符&#xff0c;如空格
  • char_level&#xff1a;如果为True&#xff0c;每个字符将被视为一个标记
  • oov_token &#xff1a;如果给出&#xff0c;会添加到词索引中&#xff0c;用来替换超出词表的字符。

类方法

  • fit_on_texts(texts)
    • texts&#xff1a;要用以训练的文本序列
  • texts_to_sequences(texts)
    • texts&#xff1a;待转为序列的文本列表
    • 返回值&#xff1a;序列的列表&#xff0c;列表中每个序列对应于一段输入文本
  • fit_on_sequences(sequences)
    • sequences&#xff1a;要用以训练的序列列表
  • sequences_to_matrix(sequences)
    • sequences&#xff1a;待向量化的序列列表
    • mode&#xff1a;‘binary’&#xff0c;‘count’&#xff0c;‘tfidf’&#xff0c;‘freq’之一&#xff0c;默认为’binary’
    • 返回值&#xff1a;形如(len(sequences), nb_words)的numpy array

属性

  • word_counts:字典&#xff0c;将单词&#xff08;字符串&#xff09;映射为它们在训练期间出现的次数。仅在调用fit_on_texts之后设置。
  • word_docs: 字典&#xff0c;将单词&#xff08;字符串&#xff09;映射为它们在训练期间所出现的文档或文本的数量。仅在调用fit_on_texts之后设置。
  • word_index: 字典&#xff0c;将单词&#xff08;字符串&#xff09;映射为它们的排名或者索引。仅在调用fit_on_texts之后设置。
  • document_count: 整数。分词器被训练的文档&#xff08;文本或者序列&#xff09;数量。仅在调用fit_on_texts或fit_on_sequences之后设置

代码

import tensorflow as tf
from tensorflow import keras
from keras.preprocessing.text import Tokenizer
sentences &#61; [&#39;I love my dog&#39;,&#39;I love my cat&#39;,&#39;You love my dog! &#39;]
tokenizer &#61; Tokenizer(num_words &#61; 100,filters&#61;&#39;!"#$%&()*&#43;,-./:;<&#61;>?&#64;[]^_&#96;{|}~tn&#39;,lower&#61;True,split&#61;&#39; &#39;,oov_token&#61;&#39;<00f>&#39;,char_level&#61;False)
tokenizer.fit_on_texts(sentences)
word_index &#61; tokenizer.word_index
print(word_index)

输出&#xff1a;

{&#39;love&#39;: 1, &#39;my&#39;: 2, &#39;i&#39;: 3, &#39;dog&#39;: 4, &#39;ca&#39;: 5, &#39;you&#39;: 6}

我的理解&#xff1a;

将文本中每个词进行编码&#xff0c;然后每个词就有唯一一个索引&#xff0c;这个文本就转换为了数字。


2 tensorflow.keras实现IMDB情感分类实战

数据文件下载
口令&#xff1a;hygu9z

2.1 数据准备

import numpy as np
import tensorflow as tf
import tensorflow.keras as keras
import os
origin_dir &#61; &#39;E:\\黑马课程\\数据集&#39;
train_dir &#61; origin_dir &#43; &#39;\\aclImdb\\train&#39;
test_dir &#61; origin_dir &#43; &#39;\\aclImdb\\test&#39;
texts &#61; []
labels &#61; []
for fname in os.listdir(train_dir&#43;&#39;\\neg&#39;):with open(train_dir&#43;&#39;\\neg\\&#39;&#43;fname,&#39;r&#39;,encoding&#61;&#39;utf8&#39;) as f:texts.append(f.read())labels.append(0)
for fname in os.listdir(train_dir&#43;&#39;\\pos&#39;):with open(train_dir&#43;&#39;\\pos\\&#39;&#43;fname,&#39;r&#39;,encoding&#61;&#39;utf8&#39;) as f:texts.append(f.read())labels.append(1)from sklearn.model_selection import train_test_split
training_sentences,testing_sentences, training_labels,testing_labels &#61; train_test_split(texts,labels, test_size&#61;0.2)

2.2 数据预处理


分词与编码&#xff1a;用 keras.preprocessing.text.Tokenizer 匹配文本 texts. 再用 tokenizer 将文本列表转化为数字列表 sequences&#xff08;列表中的每个元素都是由整数构成的列表&#xff09;。
word_index 是将单词对应到整数的字典&#xff1a;{‘the’:1, ‘and’:2, ‘a’:3, … }
再用 keras.preprocessing.pad_sequences 将列表中每个元素都变成长为 200的整数列表。 返回值是 ndarray&#xff0c;形状为 (25000,200)

vocab_size &#61; 10000 #每个评论加载的最大数据
max_length &#61; 200
trunc_type&#61;&#39;post&#39;
oov_tok &#61; ""from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequencestokenizer &#61; Tokenizer(num_words &#61; vocab_size, oov_token&#61;oov_tok)
tokenizer.fit_on_texts(training_sentences)
word_index &#61; tokenizer.word_index
sequences &#61; tokenizer.texts_to_sequences(training_sentences)
# 填充或者截断评论
padded &#61; pad_sequences(sequences,maxlen&#61;max_length, truncating&#61;trunc_type)testing_sequences &#61; tokenizer.texts_to_sequences(testing_sentences)
testing_padded &#61; pad_sequences(testing_sequences,maxlen&#61;max_length)
# 将键值对换&#xff0c;数字标识在前
reverse_word_index &#61; dict([(value, key) for (key, value) in word_index.items()])
# 查看处理后的数据和之前的数据
def decode_review(text):return &#39; &#39;.join([reverse_word_index.get(i, &#39;?&#39;) for i in text])

2.3 模型训练


简单地建立一个Sequential模型&#xff0c;由三层构成&#xff1a;Embedding,Flatten , Dense.
模型输入参数形状是 (batch_size, 200)&#xff0c;表示由 batch_size 个长度200的整数向量构成。
Embedding层的设定参数是(10000,16)&#xff0c;表示将10000个整数映射到10000个长度为16的向量。
Flatten将向量转换为一维
Dense全连接层用sigmoid激活函数输出一个值&#xff0c;将其二分类。
训练模型10个epoch&#xff0c;batch_size&#61;32

embedding_dim &#61; 16
model &#61; tf.keras.Sequential([tf.keras.layers.Embedding(vocab_size, embedding_dim, input_length&#61;max_length),tf.keras.layers.Flatten(),tf.keras.layers.Dense(6, activation&#61;&#39;relu&#39;),tf.keras.layers.Dense(1, activation&#61;&#39;sigmoid&#39;)
])
model.compile(loss&#61;&#39;binary_crossentropy&#39;,optimizer&#61;&#39;adam&#39;,metrics&#61;[&#39;accuracy&#39;])
model.summary()
# 转换数据&#xff0c;放入模型训练
training_labels_final &#61; np.array(training_labels)
testing_labels_final &#61; np.array(testing_labels)
num_epochs &#61; 10
model.fit(padded, training_labels_final, epochs&#61;num_epochs, validation_data&#61;(testing_padded, testing_labels_final))

2.4 可视化训练效果

import matplotlib.pyplot as plt
acc &#61; history.history[&#39;acc&#39;]
val_acc &#61; history.history[&#39;val_acc&#39;]
plt.plot(np.arange(1,len(acc)&#43;1), acc)
plt.plot(np.arange(1,len(acc)&#43;1), val_acc)
plt.legend([&#39;acc&#39;,&#39;val_acc&#39;])
plt.title(&#39;Accuracy (Non-pretrained embedding & LSTM)&#39;)
plt.figure()loss &#61; history.history[&#39;loss&#39;]
val_loss &#61; history.history[&#39;val_loss&#39;]
plt.plot(np.arange(1,len(loss)&#43;1), loss)
plt.plot(np.arange(1,len(val_loss)&#43;1), val_loss)
plt.legend([&#39;loss&#39;,&#39;val_loss&#39;])
plt.title(&#39;Loss (Non-pretrained embedding & LSTM)&#39;)
plt.show()

在这里插入图片描述
在这里插入图片描述

2.5 结果预测

预测测试集中前10个&#xff0c;如果需要预测新的文本&#xff0c;需要处理格式为向量

print(model.predict(testing_padded[:10]))


推荐阅读
author-avatar
拍友2602924913
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有