基于word2vec的文档向量模型的应用

基于word2vec的文档向量模型的应用

word2vec的原理以及训练过程具体细节就不介绍了,推荐两篇文档:《word2vec parameter learning explained》、和《word2vec中的数学》。

在《word2vec中的数学》中谈到了训练语言模型的一些方法:比如n-gram和神经网络。在使用神经网络训练语言模型时得到的"副产物",就是word2vec词向量。基于神经网络训练语言模型有2种方案:cbow和skip-gram,它们是在这篇文章《A neural probabilistic language model》基础上对训练过程提出的改进方案。这里简单讲一下cbow的训练过程:

训练过程

  • 输入层:将词w的上下文的2c个词的词向量作为输入:\(v(context(w)_1),v(context(w)_2),...v(context(w)_{2c})\)

    随机初始化这2c个词的词向量

  • 投影层:将输入层的2c 个词向量累加求和

    投影层对词向量累加求和,这丢失了词的顺序信息。比如说:“我 爱 你们” 和“你们 爱 我” 这三个词的词向量累加求和得到的词向量是相同的。

  • 输出层:赫夫曼树

    基于Huffman树进行二分类,构造目标函数,并采用梯度算法最优化目标函数得到模型参数


训练语料与训练参数

训练语料需要预先分词。所有的词组成的集合,称为词库。赫夫曼树的每个叶子结点就代表词库中的一个词。训练的话,可采用gensim或者其他工具(比如HanLP word2vec)。注意几个训练参数:

  • size 生成的词向量的维度,比如300维、100维等等,不需要太大。因为word2vec词向量并不是 one-hot representation 而是distribution representation。
  • window 参与训练的上下文词的个数(Set max skip length between words)。其实就是上面提到的 c
  • iter 迭代次数
  • min_count 训练过程会根据词出现的频率构造Huffman树,对于那些低频词(小于min_count),不参与构造Huffman树,从而减少了Huffman树的高度。This will discard words that appear less than min_count times
  • cbow 采用cbow模型训练

训练完成后,词库中每个词,都对应着一个相同维度的float数值向量。计算两个词的相似度,就是计算两个词所对应的数值向量夹角的余弦。

句向量DocVectorModel

在实际应用场景中,用户输入并不是一个个的词,而是句子(若干个词)。比如一个用户资料下的个人说明,就是一句自我介绍的话;用户的一段评论,也是一句话…

如果要计算两个句子的相似度,那怎么办呢?这个需要根据实际需求场景了。比如对句子进行关键词提取,采用word2vec计算关键词的相似度作为句子的相似度。

或者再简单一点(HanLP中的DocVectorModel实现),直接对句子分词,得到若干个词,然后对每个词的词向量累加,作为整个句子的"句向量",然后计算2个句向量的余弦相似度即可。比如计算这2个句子的相似度:docVectorModel.similarity("我爱你们", "你们爱我")

    public Vector query(String content)
    {
        if (content == null || content.length() == 0) return null;        //对句子进行分词,我爱你们--->["我"、"爱"、"你们"]
        List<Term> termList = NotionalTokenizer.segment(content);
        Vector result = new Vector(dimension());
        int n = 0;
        for (Term term : termList)
        {
            //从word2vec词典中查出这个词的 词向量
            Vector vector = wordVectorModel.vector(term.word);
            if (vector == null)
            {
                //如果这是一个oov词,则直接忽略
                continue;
            }
            ++n;
            //将 句子分词后的每个词 的词向量 相加
            result.addToSelf(vector);
        }
        if (n == 0)
        {
            return null;
        }
        //归一化
        result.normalize();
        //句子--->分词--->查询词向量--->词向量相加作为"句向量"
        return result;
    }

值得注意的是,word2vec中存在的OOV问题,有没有其他更好的处理方案?

得到句子(文档)的向量表示后,计算余弦相似度,就能比较两个句子了。

    /**
     * 文档相似度计算
     * @param what
     * @param with
     * @return
     */
    public float similarity(String what, String with)
    {
        //what 文档的 向量
        Vector A = query(what);
        if (A == null) return -1f;
        //to 文档的 向量
        Vector B = query(with);
        if (B == null) return -1f;
        //计算余弦相似度
        return A.cosineForUnitVector(B);
    }

应用

在基于ElasticSearch的文本搜索中,文档的相关性得分计算主要是基于TF-IDF或者BM25实现的:有时为了capture 查询字符串与文档之间的一些语义信息,以提高搜索的召回率,那就可以采用 DocVectorModel 来额外召回一些文档。

这里需要考虑的是:是否要训练自己的word2vec模型?还是直接采用第三方提供的(开源的基于维基百科训练的)?在把文档index到ES中去时,将文档的"句向量"计算好,存储到Mapping字段中。查询时,可基于script_score来做二次评分(对搜索的响应时间的影响?),总之算是一个尝试吧。

原文地址:https://www.cnblogs.com/hapjin/p/11389328.html

时间: 2024-10-31 05:10:06

基于word2vec的文档向量模型的应用的相关文章

基于浏览器的文档处理控件TX Text Control .NET Server for WP

TX Text Control .NET Server for WPF控件为用于ASP.NET服务器环境提供一个完全可编程的文字处理引擎,并且包含一个WPF客户端版本 具体功能: 合并Microsoft Word模板,生成打印就绪的PDF文件 在浏览器中以所见即所得模式编辑处理文档 从同一个文档的每一页中生成图片或meta文件 使用来自不同源的数据从零开始通过编程生成文档 在所有支持的格式之间转换文档 完全独立于 Microsoft Word, Adobe Acrobat,及其他第三方软件 一台

使用LiveDocx和Zend Framework生成基于模板的文档

使用PHP生成打印良好的格式良好的PDF文档并非易事.传统上,使用PHP生成PDF有两种主要方法.如果有足够的时间和耐心,两者都可以完成工作,但仍然有很多不足之处: HTML-to-PDF:这种方法广泛用于主流应用程序.这里使用众多开源库之一以编程方式创建HTML文档并将其转换为PDF.但是,由于HTML不是面向页面的格式(如PDF),因此无法在HTML和PDF之间执行1对1映射.典型的文字处理文件格式功能,例如页眉和页脚,孤儿和寡妇甚至页码都不能用HTML表示. 程序化:此方法可以完全控制生成

基于hash的文档判重——simhash

本文环境: python3.5 ubuntu 16.04 第三方库: jieba 文件寄于github: https://github.com/w392807287/angelo_tools.git simhash介绍 没多久就要写毕业论文了,据说需要查重,对文档重复判定还挺好奇的所以看了下相关的东西.发现simhash比较好用,实现简单. 顾名思义 simhash是一种hash算法,以前在我印象中hash算法是将一个对象映射成一个hash值,一般只要求当两个对象完全相同时才有相同的hash值,

文本情感分析(二):基于word2vec和glove词向量的文本表示

上一篇博客用词袋模型,包括词频矩阵.Tf-Idf矩阵.LSA和n-gram构造文本特征,做了Kaggle上的电影评论情感分类题. 这篇博客还是关于文本特征工程的,用词嵌入的方法来构造文本特征,也就是用word2vec词向量和glove词向量进行文本表示,训练随机森林分类器. 一.训练word2vec词向量 Kaggle情感分析题给出了三个数据集,一个是带标签的训练集,共25000条评论,一个是测试集,无标签的,用来做预测并提交结果,这两个数据集是上一篇文章里我们用过的. 此外还有一个无标签的数据

基于FlashPaper的文档播放器

本文主要讨论.描述了使用Adobe公司的Flex与FlashPaper产品完成对发布到网上的文档资料进行只读控制,也就是说只允许浏览操作.对下载.打印进行控制. FlashPaper FlashPaper是Macromedia的一款用于将操作系统所识别的文档的内容通过虚拟打印机制将内容转换为swf文件的工具, Flex Flex是Adobe公司的一款推动RIA应用的技术,它可以使我们通过编码MXML方式产生swf,它的基础是ActionScript,ActionScript可以理解为别一门编程语

VTK基于MFC单文档的开发

目录 项目的搭建 相关头文件的引用 添加成员变量vtkRenderer, vtkMFCWindow CXxxView()中实例化变量vtkRenderer CXxxView::OnInitialUpdate()中初始化变量vtkMFCWindow CXxxView::OnDraw(), 实现vtkMFCWindow的绘制 CXxxView::OnSize(), 窗口大小重绘 CXxxView::OnDestroy()中释放变量vtkRenderer CXxxView::~CXxxView()中释

如何使用向量代表文档doc或者句子sentence

1."句向量"简介word2vec提供了高质量的词向量,并在一些任务中表现良好. 关于word2vec的原理可以参考这几篇论文: https://arxiv.org/pdf/1310.4546.pdfhttps://arxiv.org/pdf/1301.3781.pdf关于如何使用第三方库gensim训练word2vec可以参考这篇博客: http://blog.csdn.net/john_xyz/article/details/54706807尽管word2vec提供了高质量的词汇向

OneThink视图模型进行组合查询!文档组合文档详情

测试方法:twoCate: public function twoCate(){ $where = array( 'category_id'=>43 ); $list = D('TwoView')->where($where)->select(); p($list); } 模型: <?php namespace Home\Model; use Think\Model\ViewModel; /** * 文档基础模型 */ class TwoViewModel extends View

基于Noootes/Dooomino的文档工作流系统(转)

(流程样例应用程序终于整理上传好可供下载了http://download.csdn.net/download/starrow/8422299) 上文分析了我们的流程配置使用三类对象,分别对应三类文档:工作流配置文档.节点配置文档和操作配置文档.本文介绍三类配置文档的内容,也可以看作本流程系统的设置教程. 这些配置文档的共同点包括: 处于编辑状态时,必填字段的右边会显示红色星号(这实际也是整个系统的共同设计),保存文档时会对这些字段进行校验. 许多字段既能输入静态值,也可输入公式以计算动态值.输入