tensorflow在文本处理中的使用——Word2Vec预测

代码来源于:tensorflow机器学习实战指南(曾益强 译,2017年9月)——第七章:自然语言处理

代码地址:https://github.com/nfmcclure/tensorflow-cookbook

数据:http://www.cs.cornell.edu/people/pabo/movie-review-data/rt-polaritydata.tar.gz

问题:加载和使用预训练的嵌套,并使用这些单词嵌套进行情感分析,通过训练线性逻辑回归模型来预测电影的好坏

步骤如下:

  • 必要包
  • 声明模型参数
  • 读取并转换文本数据集,划分训练集和测试集
  • 构建图
  • 训练


step1:必要包

import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import random
import os
import pickle
import string
import requests
import collections
import io
import tarfile
import urllib.request
import text_helpers
from nltk.corpus import stopwords
from tensorflow.python.framework import ops
ops.reset_default_graph()

os.chdir(os.path.dirname(os.path.realpath(__file__)))

# Start a graph session
sess = tf.Session()


step2:声明模型参数

# Declare model parameters
embedding_size = 200
vocabulary_size = 2000
batch_size = 100
max_words = 100

# Declare stop words
stops = stopwords.words(‘english‘) 


step3:读取并转换本文数据集,划分训练集和测试集

参考:tensorflow在文本处理中的使用——辅助函数

# Load Data
print(‘Loading Data‘)
data_folder_name = ‘temp‘
texts, target = text_helpers.load_movie_data(data_folder_name)

# Normalize text
print(‘Normalizing Text Data‘)
texts = text_helpers.normalize_text(texts, stops)

# Texts must contain at least 3 words
target = [target[ix] for ix, x in enumerate(texts) if len(x.split()) > 2]
texts = [x for x in texts if len(x.split()) > 2]

# Split up data set into train/test
train_indices = np.random.choice(len(target), round(0.8*len(target)), replace=False)
test_indices = np.array(list(set(range(len(target))) - set(train_indices)))
texts_train = [x for ix, x in enumerate(texts) if ix in train_indices]
texts_test = [x for ix, x in enumerate(texts) if ix in test_indices]
target_train = np.array([x for ix, x in enumerate(target) if ix in train_indices])
target_test = np.array([x for ix, x in enumerate(target) if ix in test_indices])

# Load dictionary and embedding matrix加载CBOW嵌套中保存的单词字典
dict_file = os.path.join(data_folder_name, ‘movie_vocab.pkl‘)
word_dictionary = pickle.load(open(dict_file, ‘rb‘))

# Convert texts to lists of indices根据单词字典将加载的句子转化为数值型numpy数组
text_data_train = np.array(text_helpers.text_to_numbers(texts_train, word_dictionary))
text_data_test = np.array(text_helpers.text_to_numbers(texts_test, word_dictionary))

# Pad/crop movie reviews to specific length电影影评长度不一,不满100维的用0凑满,超过100维的取前100维
text_data_train = np.array([x[0:max_words] for x in [y+[0]*max_words for y in text_data_train]])
text_data_test = np.array([x[0:max_words] for x in [y+[0]*max_words for y in text_data_test]])


step4:构建图

print(‘Creating Model‘)
# Define Embeddings:创建嵌套变量,用于之后加载CBOW训练好的嵌套向量
embeddings = tf.Variable(tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))

# Define model:
# Create variables for logistic regression变量
A = tf.Variable(tf.random_normal(shape=[embedding_size,1]))
b = tf.Variable(tf.random_normal(shape=[1,1]))

# Initialize placeholders数据占位符
x_data = tf.placeholder(shape=[None, max_words], dtype=tf.int32)
y_target = tf.placeholder(shape=[None, 1], dtype=tf.float32)

# Lookup embeddings vectors
embed = tf.nn.embedding_lookup(embeddings, x_data)
# Take average of all word embeddings in documents计算句子中所有单词的平均嵌套
embed_avg = tf.reduce_mean(embed, 1)

# Declare logistic model (sigmoid in loss function)
model_output = tf.add(tf.matmul(embed_avg, A), b)

# Declare loss function (Cross Entropy loss)
loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(model_output, y_target))

# Actual Prediction
prediction = tf.round(tf.sigmoid(model_output))
predictions_correct = tf.cast(tf.equal(prediction, y_target), tf.float32)
accuracy = tf.reduce_mean(predictions_correct)

# Declare optimizer
my_opt = tf.train.AdagradOptimizer(0.005)
train_step = my_opt.minimize(loss)


step5:训练

# Intitialize Variables
init = tf.initialize_all_variables()
sess.run(init)

# Load model embeddings加载CBOW训练好的嵌套矩阵
model_checkpoint_path = os.path.join(data_folder_name,‘cbow_movie_embeddings.ckpt‘)
saver = tf.train.Saver({"embeddings": embeddings})
saver.restore(sess, model_checkpoint_path)

# Start Logistic Regression
print(‘Starting Model Training‘)
train_loss = []
test_loss = []
train_acc = []
test_acc = []
i_data = []
for i in range(10000):
    rand_index = np.random.choice(text_data_train.shape[0], size=batch_size)
    rand_x = text_data_train[rand_index]
    rand_y = np.transpose([target_train[rand_index]])
    sess.run(train_step, feed_dict={x_data: rand_x, y_target: rand_y})

    # Only record loss and accuracy every 100 generations
    if (i+1)%100==0:
        i_data.append(i+1)
        train_loss_temp = sess.run(loss, feed_dict={x_data: rand_x, y_target: rand_y})
        train_loss.append(train_loss_temp)

        test_loss_temp = sess.run(loss, feed_dict={x_data: text_data_test, y_target: np.transpose([target_test])})
        test_loss.append(test_loss_temp)

        train_acc_temp = sess.run(accuracy, feed_dict={x_data: rand_x, y_target: rand_y})
        train_acc.append(train_acc_temp)

        test_acc_temp = sess.run(accuracy, feed_dict={x_data: text_data_test, y_target: np.transpose([target_test])})
        test_acc.append(test_acc_temp)
    if (i+1)%500==0:
        acc_and_loss = [i+1, train_loss_temp, test_loss_temp, train_acc_temp, test_acc_temp]
        acc_and_loss = [np.round(x,2) for x in acc_and_loss]
        print(‘Generation # {}. Train Loss (Test Loss): {:.2f} ({:.2f}). Train Acc (Test Acc): {:.2f} ({:.2f})‘.format(*acc_and_loss))

可视化结果展示:

# Plot loss over time
plt.plot(i_data, train_loss, ‘k-‘, label=‘Train Loss‘)
plt.plot(i_data, test_loss, ‘r--‘, label=‘Test Loss‘, linewidth=4)
plt.title(‘Cross Entropy Loss per Generation‘)
plt.xlabel(‘Generation‘)
plt.ylabel(‘Cross Entropy Loss‘)
plt.legend(loc=‘upper right‘)
plt.show()

# Plot train and test accuracy
plt.plot(i_data, train_acc, ‘k-‘, label=‘Train Set Accuracy‘)
plt.plot(i_data, test_acc, ‘r--‘, label=‘Test Set Accuracy‘, linewidth=4)
plt.title(‘Train and Test Accuracy‘)
plt.xlabel(‘Generation‘)
plt.ylabel(‘Accuracy‘)
plt.legend(loc=‘lower right‘)
plt.show()

原文地址:https://www.cnblogs.com/helloworld0604/p/9009871.html

时间: 2024-11-05 14:52:02

tensorflow在文本处理中的使用——Word2Vec预测的相关文章

tensorflow在文本处理中的使用——skip-gram模型

代码来源于:tensorflow机器学习实战指南(曾益强 译,2017年9月)--第七章:自然语言处理 代码地址:https://github.com/nfmcclure/tensorflow-cookbook 数据来源:http://www.cs.cornell.edu/people/pabo/movie-review-data/rt-polaritydata.tar.gz 理解互相关联的单词:king - man + woman = queen 如果已知man和woman语义相关联,那我们可

tensorflow在文本处理中的使用——CBOW词嵌入模型

代码来源于:tensorflow机器学习实战指南(曾益强 译,2017年9月)--第七章:自然语言处理 代码地址:https://github.com/nfmcclure/tensorflow-cookbook 数据:http://www.cs.cornell.edu/people/pabo/movie-review-data/rt-polaritydata.tar.gz CBOW概念图: 步骤如下: 必要包 声明模型参数 读取数据集 创建单词字典,转换句子列表为单词索引列表 生成批量数据 构建

tensorflow在文本处理中的使用——skip-gram & CBOW原理总结

摘自:http://www.cnblogs.com/pinard/p/7160330.html 先看下列三篇,再理解此篇会更容易些(个人意见) skip-gram,CBOW,Word2Vec 词向量基础 CBOW与Skip-Gram用于神经网络语言模型 词向量基础 用词向量来表示词并不是word2vec的首创,在很久之前就出现了.最早的词向量是很冗长的,它使用是词向量维度大小为整个词汇表的大小,对于每个具体的词汇表中的词,将对应的位置置为1.比如我们有下面的5个词组成的词汇表,词"Queen&q

js数据显示在文本框中(页面加载显示和按钮触动显示)

web代码如下: <!DOCTYPE html> <html> <head> <title>jsTest02.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is

jsp利用cookie记住用户名,下次登录时显示在文本框中(仅仅一个Cookie就整了将近三个小时,⊙﹏⊙b汗)

<%@page import="java.net.URLDecoder"%> <%@page import="sun.security.util.Length"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html

怎么去掉WIN7窗口文本框中淡绿色的底色

重装系统后突然发现,浏览器中URL位置,word文本框中到处都充满这种淡绿色的东西,突然就好怀念白色的底色.就想把他改过来.原来是这样的: 下面是亲测有用的教程. 1 . 回到桌面,单击右键选择个性化! 2 . 进入如下页面,选择高级外观设置: 3.进行如下设置,设置完后单击确定,就完成完成了更改,所有的文本底色都改为白色的啦! 4 .最后是如下的效果,都改成功啦

JavaScript实现在页面上的文本框中输入小写字母自动变为大写字母

<script language="javascript" type="text/javascript"> $(function () { $("input[type=text]").keyup(function () { $(this).val($(this).val().toUpperCase()); }); }); </script> $("input[type=text]") 处可为文本框ID,

Flex控制用户可输入到文本字段中的字符集

指示用户可以输入到控件的字符集.如果 restrict 属性的值为 null,则可以输入任何字符.如果 restrict 属性的值为空字符串,则不能输入任何字符.此属性只限制用户交互:脚本可以将任何文本放入文本字段中.如果 restrict 属性的值为字符串,则只能在文本字段中输入该字符串中的字符. Flex 按从左到右的顺序浏览字符串.可以使用连字符 (-) 指定一个范围.如果字符串以尖号 (^) 开头,则先接受所有字符,然后从接受字符集中排除字符串中 ^ 之后的字符.如果字符串不以尖号 (^

微信学习总结 08 文本消息中使用网页超链接

1 文本消息中使用网页超链接 网页超链接的作用以及如何在文本消息中使用网页超链接 2. 具体实现 刘峰博主的博文已经分析的很清楚了,直接去看就行了 .http://blog.csdn.net/lyq8479/article/details/9157455 3 补充 视频请求消息 Video.java /** * 视频 */ public class Video { // 媒体文件id private String MediaId; // 缩略图的媒体id private String Thumb