写一篇word2vec的实现代码

时间: 2023-07-07 17:03:05 浏览: 53
Word2Vec是一种常用的词向量表示方法,它通过神经网络模型将单词映射到向量空间中,从而可以直接使用向量进行文本处理和分析。下面是一个简单的Word2Vec实现代码,使用Python语言和TensorFlow框架。 首先需要准备一个文本数据集,这里使用了一个小型的英文新闻文本数据集作为示例。代码需要先对数据进行预处理,将文本中的单词转换成数值表示。 ```python import tensorflow as tf import numpy as np import collections import os # 读取数据 def read_data(filename): with open(filename, 'r') as f: data = f.read().split() return data # 构建词汇表 def build_vocab(data, vocab_size): # 统计单词出现频次 word_count = [['UNK', -1]] word_count.extend(collections.Counter(data).most_common(vocab_size - 1)) # 创建词汇表 vocab_dict = {} for word, count in word_count: vocab_dict[word] = len(vocab_dict) # 将数据集中的单词转换为数值表示 data_vocab = [] unk_count = 0 for word in data: if word in vocab_dict: index = vocab_dict[word] else: index = 0 # UNK unk_count += 1 data_vocab.append(index) word_count[0][1] = unk_count return data_vocab, vocab_dict, word_count # 生成训练数据 def generate_train_data(data, window_size): train_data = [] for i in range(len(data)): for j in range(1, window_size+1): if i-j >= 0: train_data.append([data[i], data[i-j]]) if i+j < len(data): train_data.append([data[i], data[i+j]]) return train_data # 读取数据集 data = read_data('news.txt') vocab_size = 5000 data, vocab_dict, word_count = build_vocab(data, vocab_size) train_data = generate_train_data(data, window_size=2) ``` 接下来就是Word2Vec模型的构建,这里使用了Skip-gram模型。模型的输入是一个单词的数值表示,输出是它周围的单词的数值表示,即使用一个单词预测它的上下文。模型的核心是一个嵌入层,将每个单词映射到一个向量空间中,然后使用点积计算相似度。 ```python # 定义Word2Vec模型 class Word2Vec: def __init__(self, vocab_size, embed_size): self.vocab_size = vocab_size self.embed_size = embed_size self.inputs = tf.placeholder(tf.int32, [None]) self.labels = tf.placeholder(tf.int32, [None, 1]) # 定义嵌入层 with tf.variable_scope('embed'): self.embeddings = tf.Variable(tf.random_uniform([vocab_size, embed_size], -1.0, 1.0)) embed = tf.nn.embedding_lookup(self.embeddings, self.inputs) # 定义输出层 with tf.variable_scope('output'): self.weights = tf.Variable(tf.truncated_normal([vocab_size, embed_size], stddev=1.0 / np.sqrt(embed_size))) self.biases = tf.Variable(tf.zeros([vocab_size])) self.logits = tf.matmul(embed, tf.transpose(self.weights)) + self.biases # 定义损失函数和优化器 self.loss = tf.reduce_mean(tf.nn.sampled_softmax_loss(self.weights, self.biases, self.labels, embed, num_sampled=1000, num_classes=vocab_size)) self.optimizer = tf.train.AdagradOptimizer(learning_rate=0.1).minimize(self.loss) # 定义训练函数 def train_word2vec(train_data, vocab_size, embed_size, num_epochs, batch_size, save_path): tf.reset_default_graph() model = Word2Vec(vocab_size, embed_size) with tf.Session() as sess: sess.run(tf.global_variables_initializer()) total_loss = 0.0 for epoch in range(num_epochs): np.random.shuffle(train_data) for i in range(0, len(train_data), batch_size): batch_inputs, batch_labels = [], [] for j in range(i, min(i+batch_size, len(train_data))): batch_inputs.append(train_data[j][0]) batch_labels.append([train_data[j][1]]) loss, _ = sess.run([model.loss, model.optimizer], feed_dict={model.inputs: batch_inputs, model.labels: batch_labels}) total_loss += loss if epoch % 10 == 0: print('Epoch %d, average loss: %.4f' % (epoch, total_loss / len(train_data))) total_loss = 0.0 # 保存模型 if not os.path.exists(save_path): os.mkdir(save_path) model_file = os.path.join(save_path, 'word2vec.ckpt') saver = tf.train.Saver() saver.save(sess, model_file) # 训练Word2Vec模型 embed_size = 100 num_epochs = 100 batch_size = 512 save_path = 'model' train_word2vec(train_data, vocab_size, embed_size, num_epochs, batch_size, save_path) ``` 训练完成后,就可以使用训练好的模型进行单词向量的表示和相似度计算了。代码如下: ```python # 加载模型 def load_word2vec(vocab_dict, embed_size, save_path): tf.reset_default_graph() model = Word2Vec(len(vocab_dict), embed_size) with tf.Session() as sess: model_file = os.path.join(save_path, 'word2vec.ckpt') saver = tf.train.Saver() saver.restore(sess, model_file) embeddings = sess.run(model.embeddings) # 创建词向量字典 word_vectors = {} for word, index in vocab_dict.items(): word_vectors[word] = embeddings[index] return word_vectors # 计算单词相似度 def calc_similarity(word1, word2, word_vectors): vec1 = word_vectors[word1] vec2 = word_vectors[word2] sim = np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2)) return sim # 加载模型并计算相似度 word_vectors = load_word2vec(vocab_dict, embed_size, save_path) print(calc_similarity('man', 'woman', word_vectors)) ``` 以上就是一个简单的Word2Vec实现代码,可以用于生成单词向量并计算相似度。实际应用中,可以根据需求对模型进行优化和改进。

相关推荐

最新推荐

recommend-type

Python实现word2Vec model过程解析

主要介绍了Python实现word2Vec model过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
recommend-type

在python下实现word2vec词向量训练与加载实例

项目中要对短文本进行相似度估计,word2vec是一个很火的工具。本文就word2vec的训练以及加载进行了总结。 word2vec的原理就不描述了,word2vec词向量工具是由google开发的,输入为文本文档,输出为基于这个文本文档...
recommend-type

python gensim使用word2vec词向量处理中文语料的方法

主要介绍了python gensim使用word2vec词向量处理中文语料的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

python使用Word2Vec进行情感分析解析

python实现情感分析(Word2Vec) ** 前几天跟着老师做了几个项目,老师写的时候劈里啪啦一顿敲,写了个啥咱也布吉岛,线下自己就瞎琢磨,终于实现了一个最简单的项目。输入文本,然后分析情感,判断出是好感还是反感...
recommend-type

深度学习word2vec学习笔记.docx

深度学习word2vec博文的文档,整理了各位的意见,把错误的地方修改过了。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

如何用python编写api接口

在Python中编写API接口可以使用多种框架,其中比较流行的有Flask和Django。这里以Flask框架为例,简单介绍如何编写API接口。 1. 安装Flask框架 使用pip命令安装Flask框架: ``` pip install flask ``` 2. 编写API接口 创建一个Python文件,例如app.py,编写以下代码: ```python from flask import Flask, jsonify app = Flask(__name__) @app.route('/api/hello', methods=['GET']) def hello():
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。