论文原文:A simple but tough-to-beat baseline for sentence embedding

算法介绍

  • 先对一个句子vsv_svs中所有词的词向量进行加权平均,其中每个词向量的权重可以表示为aa+p(wi)\frac{a}{a+p(w_i)}a+p(wi)a,其中a为超参数,p(w)为词w的频率,∣s∣|s|s为句长, vwiv_{w_i}vwi为词向量。
      vs=1∣s∣∑i∣s∣aa+p(wi)vwiv_s = \frac{1}{|s| }\sum_{i}^{|s|} \frac{a}{a+p(w_i)} v_{w_i}vs=s1isa+p(wi)avwi
  • 使用PCA/SVD对向量值进行修改。
    • 去除公共部分(也就是每个成分在主成分上的投影为uTVsu^TV_suTVs, 再乘以主成分u,得到uTVsuu^TV_suuTVsu即为common部分,再用VsV_sVs减去公共部分得到最终的句向量),注意u是单位向量

注:pca算法推导和基础知识

代码

import numpy as np
from typing import Iterable, List
from gensim.models.keyedvectors import BaseKeyedVectors
from sklearn.decomposition import PCASentence = List[str]def word_vec(wv: BaseKeyedVectors, s: str):try:return wv.get_vector(s)except KeyError:return np.zeros(wv.vector_size)class SentenceVec:wv: BaseKeyedVectorsu: np.arraya: floatdef __init__(self, sentences: Iterable[Sentence], wv: BaseKeyedVectors, a: float = 1e-3):self.wv = wvself.a = aembedding_size = wv.vector_sizesentence_set = []for sentence in sentences:vs = self.weighted_average(sentence)sentence_set.append(vs)  # add to our existing re-calculated set of sentences# calculate PCA of this sentence setpca = PCA(n_components=embedding_size)pca.fit(np.array(sentence_set))u = pca.components_[0]  # the PCA vectoru = np.multiply(u, np.transpose(u))  # u x uT# pad the vector?  (occurs if we have less sentences than embeddings_size)if len(u) < embedding_size:for i in range(embedding_size - len(u)):u = np.append(u, 0)  # add needed extension for multiplication below# resulting sentence vectors, vs = vs -u x uT x vssentence_vecs = []for vs in sentence_set:sub = np.multiply(u, vs)sentence_vecs.append(np.subtract(vs, sub))self.u = uself.vec = sentence_vecsdef feature(self, sentence: Sentence):vs = self.weighted_average(sentence)return vs - vs * self.udef get_word_frequency(self, s) -> float:vocab = self.wv.vocab.get(s)return vocab.count / 10000000 if vocab else 0def weighted_average(self, sentence: Sentence):dim = self.wv.vector_sizea = self.avs = np.zeros(dim)  # add all word2vec values into one vector for the sentencefor word in sentence:a_value = a / (a + self.get_word_frequency(word))  # smooth inverse frequency, SIFvs = np.add(vs, np.multiply(a_value, word_vec(self.wv, word)))  # vs += sif * word_vectorvs = np.divide(vs, len(sentence))  # weighted averagereturn vs

Sentence2Vec理解相关推荐

  1. 词向量、句子向量、篇章向量的一些理解(转)

    2019独角兽企业重金招聘Python工程师标准>>> 词向量.句子向量.篇章向量的一些理解(转) (转自)http://blog.csdn.net/sinat_26917383/a ...

  2. 通用解题法——回溯算法(理解+练习)

    积累算法经验,积累解题方法--回溯算法,你必须要掌握的解题方法! 什么是回溯算法呢? 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就&quo ...

  3. stream流对象的理解及使用

    我的理解:用stream流式处理数据,将数据用一个一个方法去 . (点,即调用) 得到新的数据结果,可以一步达成. 有多种方式生成 Stream Source: 从 Collection 和数组 Co ...

  4. Linux shell 学习笔记(11)— 理解输入和输出(标准输入、输出、错误以及临时重定向和永久重定向)

    1. 理解输入和输出 1.1 标准文件描述符 Linux 系统将每个对象当作文件处理.这包括输入和输出进程.Linux 用文件描述符(file descriptor)来标识每个文件对象.文件描述符是一 ...

  5. java局部变量全局变量,实例变量的理解

    java局部变量全局变量,实例变量的理解 局部变量 可以理解为写在方法中的变量. public class Variable {//类变量static String name = "小明&q ...

  6. 智能文档理解:通用文档预训练模型

    预训练模型到底是什么,它是如何被应用在产品里,未来又有哪些机会和挑战? 预训练模型把迁移学习很好地用起来了,让我们感到眼前一亮.这和小孩子读书一样,一开始语文.数学.化学都学,读书.网上游戏等,在脑子 ...

  7. 熵,交叉熵,散度理解较为清晰

    20210511 https://blog.csdn.net/qq_35455503/article/details/105714287 交叉熵和散度 自己给自己编码肯定是最小的 其他的编码都会比这个 ...

  8. mapreduce理解_大数据

    map:对不同的数据进行同种操作 reduce:按keys 把数据规约到一起 看这篇文章请出去跑两圈,然后泡一壶茶,边喝茶,边看,看完你就对hadoop 与MapReduce的整体有所了解了. [前言 ...

  9. 文件句柄和文件描述符的区别和理解指针

    句柄是Windows用来标识被应用程序所建立或使用的对象的唯一整数,Windows使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等.Windows句柄有点象C语言中的文件句柄. ...

  10. 通俗理解条件熵-数学

    就是决策树里面选划分属性用到的计算 条件熵越小表示划分之后各个集合越纯净 前面我们总结了信息熵的概念通俗理解信息熵 - 知乎专栏,这次我们来理解一下条件熵. 我们首先知道信息熵是考虑该随机变量的所有可 ...

最新文章

  1. 中国电子学会青少年编程能力等级测试图形化四级编程题:打篮球
  2. 谭浩强c语言第六章兔子数列,谭浩强 C语言 第6章_循环.ppt
  3. Java面试总结系列之Collections.sort()
  4. [转载]Hot Door CADtools (实战篇)
  5. 把男朋友变成儿子你只需要一秒
  6. vscode中如何运行git
  7. android github 评分控件_「开源」Arcgis for Android测量工具更新至V1.9,新增绘制控件...
  8. UVa 642 - Word Amalgamation
  9. python json库函数_Python JSON
  10. 聚焦强化学习,AAAI 2019杰出论文公布:CMU、斯坦福等上榜
  11. Android开发里的自定义View的实现
  12. dsoframer.ocx java_dsoframer.ocx(java web 操作word) 总结一下
  13. Echarts实现双y轴(不同刻度)
  14. 判断合法标识符(c语言或c++)
  15. python金融分析培训课程_Python金融分析相关书籍推荐
  16. 云服务器 共享文件,云服务器 共享文件
  17. python 如何创建文件夹(新建文件夹)
  18. C++中左移运算符<<、右移运算符>>、以及位与运算符
  19. 二叉树(Binary Tree):先序遍历、中序遍历、后序遍历和层次遍历
  20. 0基础小学生做的网站

热门文章

  1. 安装MATLAB2016a的完整步骤
  2. 精读CSS权威指南第四版(1)
  3. shell 命令返回值判断
  4. stm32g474芯片手册_STM32芯片资料-STM32F4 选型手册.pdf
  5. 编码器正反转识别方法
  6. uandroidtool使用教程_apktool反编译详细使用教程_图文教程
  7. 2018数学建模国赛A题《高温作业专用服装设计》优秀论文(本文由西南民族大学白白不加糖、薄荷CC糖原创)
  8. 数学建模算法体系分类
  9. PHP如何使用换行符?(代码示例)
  10. java heapdump 分析工具_Java Heap dump文件分析工具jhat简介