分别基于SVD分解以及基于SGNS两种方法构建词向量并进行评测的代码

时间: 2024-05-07 10:22:41 浏览: 10
1. 基于SVD分解构建词向量的代码 ```python import numpy as np from sklearn.decomposition import TruncatedSVD class SVDWordEmbedding: def __init__(self, corpus, dim=100, window_size=5): self.corpus = corpus self.dim = dim self.window_size = window_size self.vocab = {} self.vectors = [] self.build_vocab() self.build_vectors() def build_vocab(self): words = [] for sentence in self.corpus: words.extend(sentence) for word in words: if word not in self.vocab: self.vocab[word] = len(self.vocab) def build_vectors(self): co_matrix = np.zeros((len(self.vocab), len(self.vocab))) for sentence in self.corpus: for i, word in enumerate(sentence): if word in self.vocab: for j in range(max(0, i - self.window_size), min(len(sentence), i + self.window_size + 1)): if i != j and sentence[j] in self.vocab: co_matrix[self.vocab[word]][self.vocab[sentence[j]]] += 1 svd = TruncatedSVD(n_components=self.dim) self.vectors = svd.fit_transform(co_matrix) def get_vector(self, word): if word in self.vocab: return self.vectors[self.vocab[word]] else: return np.zeros(self.dim) def most_similar(self, word, topn=10): if word not in self.vocab: return [] vec = self.get_vector(word) sims = self.vectors.dot(vec) most_similar_idx = np.argsort(sims)[::-1][:topn] return [(list(self.vocab.keys())[i], sims[i]) for i in most_similar_idx] ``` 2. 基于SGNS构建词向量的代码 ```python import numpy as np import tensorflow as tf class SGNSWordEmbedding: def __init__(self, corpus, dim=100, window_size=5, neg_samples=5, batch_size=128, learning_rate=0.01, epochs=10): self.corpus = corpus self.dim = dim self.window_size = window_size self.neg_samples = neg_samples self.batch_size = batch_size self.learning_rate = learning_rate self.epochs = epochs self.vocab = {} self.build_vocab() self.build_model() def build_vocab(self): words = [] for sentence in self.corpus: words.extend(sentence) for word in words: if word not in self.vocab: self.vocab[word] = len(self.vocab) def build_model(self): self.graph = tf.Graph() with self.graph.as_default(): self.input_word = tf.placeholder(tf.int32, [None]) self.output_word = tf.placeholder(tf.int32, [None, 1]) self.neg_word = tf.placeholder(tf.int32, [None, self.neg_samples]) self.embedding = tf.Variable(tf.random_uniform([len(self.vocab), self.dim], -1.0, 1.0)) self.input_embed = tf.nn.embedding_lookup(self.embedding, self.input_word) self.output_embed = tf.nn.embedding_lookup(self.embedding, self.output_word) self.neg_embed = tf.nn.embedding_lookup(self.embedding, self.neg_word) self.weights = tf.Variable(tf.truncated_normal([len(self.vocab), self.dim], stddev=1.0 / np.sqrt(self.dim))) self.biases = tf.Variable(tf.zeros([len(self.vocab)])) self.loss = tf.reduce_mean(tf.nn.sampled_softmax_loss(weights=self.weights, biases=self.biases, inputs=self.input_embed, labels=self.output_word, num_sampled=self.neg_samples, num_classes=len(self.vocab))) self.optimizer = tf.train.GradientDescentOptimizer(self.learning_rate).minimize(self.loss) self.init = tf.global_variables_initializer() def train(self): with tf.Session(graph=self.graph) as sess: sess.run(self.init) for epoch in range(self.epochs): total_loss = 0.0 for i, sentence in enumerate(self.corpus): word_pairs = self.build_word_pairs(sentence) for j in range(0, len(word_pairs), self.batch_size): batch_pairs = word_pairs[j:j + self.batch_size] inputs, outputs = zip(*batch_pairs) neg_words = self.generate_neg_samples(inputs) _, loss = sess.run([self.optimizer, self.loss], feed_dict={ self.input_word: inputs, self.output_word: np.array(outputs)[:, np.newaxis], self.neg_word: neg_words }) total_loss += loss print('Epoch %d, Loss: %f' % (epoch, total_loss)) self.vectors = sess.run(self.embedding) def build_word_pairs(self, sentence): word_pairs = [] for i, word in enumerate(sentence): if word in self.vocab: for j in range(max(0, i - self.window_size), min(len(sentence), i + self.window_size + 1)): if i != j and sentence[j] in self.vocab: word_pairs.append((self.vocab[word], self.vocab[sentence[j]])) return word_pairs def generate_neg_samples(self, inputs): neg_words = [] for _ in range(len(inputs)): neg_samples = [] while len(neg_samples) < self.neg_samples: word = np.random.choice(list(self.vocab.keys())) if self.vocab[word] not in inputs and self.vocab[word] not in neg_samples: neg_samples.append(self.vocab[word]) neg_words.append(neg_samples) return np.array(neg_words) def get_vector(self, word): if word in self.vocab: return self.vectors[self.vocab[word]] else: return np.zeros(self.dim) def most_similar(self, word, topn=10): if word not in self.vocab: return [] vec = self.get_vector(word) sims = self.vectors.dot(vec) most_similar_idx = np.argsort(sims)[::-1][:topn] return [(list(self.vocab.keys())[i], sims[i]) for i in most_similar_idx] ```

相关推荐

最新推荐

recommend-type

安全隐患台账(模版).xls

安全隐患台账(模版).xls
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

优化MATLAB分段函数绘制:提升效率,绘制更快速

![优化MATLAB分段函数绘制:提升效率,绘制更快速](https://ucc.alicdn.com/pic/developer-ecology/666d2a4198c6409c9694db36397539c1.png?x-oss-process=image/resize,s_500,m_lfit) # 1. MATLAB分段函数绘制概述** 分段函数绘制是一种常用的技术,用于可视化不同区间内具有不同数学表达式的函数。在MATLAB中,分段函数可以通过使用if-else语句或switch-case语句来实现。 **绘制过程** MATLAB分段函数绘制的过程通常包括以下步骤: 1.
recommend-type

SDN如何实现简易防火墙

SDN可以通过控制器来实现简易防火墙。具体步骤如下: 1. 定义防火墙规则:在控制器上定义防火墙规则,例如禁止某些IP地址或端口访问,或者只允许来自特定IP地址或端口的流量通过。 2. 获取流量信息:SDN交换机会将流量信息发送给控制器。控制器可以根据防火墙规则对流量进行过滤。 3. 过滤流量:控制器根据防火墙规则对流量进行过滤,满足规则的流量可以通过,不满足规则的流量则被阻止。 4. 配置交换机:控制器根据防火墙规则配置交换机,只允许通过满足规则的流量,不满足规则的流量则被阻止。 需要注意的是,这种简易防火墙并不能完全保护网络安全,只能起到一定的防护作用,对于更严格的安全要求,需要
recommend-type

JSBSim Reference Manual

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

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

揭秘MATLAB分段函数绘制技巧:掌握绘制分段函数图的精髓

![揭秘MATLAB分段函数绘制技巧:掌握绘制分段函数图的精髓](https://img-blog.csdnimg.cn/direct/3821ea2a63d44e65925d8251196d5ca9.png) # 1. MATLAB分段函数的概念和基本语法** 分段函数是一种将函数域划分为多个子域,并在每个子域上定义不同函数表达式的函数。在MATLAB中,可以使用`piecewise`函数来定义分段函数。其语法为: ``` y = piecewise(x, x1, y1, ..., xn, yn) ``` 其中: * `x`:自变量。 * `x1`, `y1`, ..., `xn`,
recommend-type

如何用python运行loam算法

LOAM (Lidar Odometry and Mapping) 是一种基于激光雷达的SLAM算法,可以用于室内或室外环境的建图和定位。下面是一个基本的步骤来在Python中运行LOAM算法: 1. 安装ROS (Robot Operating System)和LOAM的ROS包 ``` sudo apt-get install ros-<distro>-loam-velodyne ``` 2. 安装Python的ROS客户端库rospy: ``` sudo apt-get install python-rospy ``` 3. 创建ROS工作空间并编译 ``` mkdir -p ~/ca
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。