词向量

TextCNN原理、结构、代码

戏子无情 提交于 2019-12-02 06:11:44
文章目录 原理 网络 embedding convolution and pooling 模型图 代码 有个需求,给短文本分类,然后看了下文本分类的算法 传统机器学习算法:分为特征提取、分类两部分 深度学习算法:融合特征提取和分类,fastText、TextCNN、TextRNN、TextRCNN以及最近很火的bert算法,本文主要记录一下TextCNN。 参考 深度学习:TextCNN TextCNN模型原理和实现 原理 将卷积神经网络CNN应用到文本分类任务,利用多个不同size的kernel来提取句子中的关键信息(类似于多窗口大小的ngram),从而能够更好地捕捉局部相关性。 网络 TextCNN包含四部分:词嵌入、卷积、池化、全连接+softmax,其实结构相比于图像领域简单很多。 Embedding:第一层是图中最左边的7乘5的句子矩阵,每行是词向量,维度=5,这个可以类比为图像中的原始像素点。 Convolution:然后经过 kernel_sizes=(2,3,4) 的一维卷积层,每个kernel_size 有两个输出 channel。 MaxPolling:第三层是一个1-max pooling层,这样不同长度句子经过pooling层之后都能变成定长的表示。 FullConnection and Softmax:最后接一层全连接的 softmax 层

CNN在句子相似性建模的应用续--基于attention的多角度CNN模型

扶醉桌前 提交于 2019-12-01 08:31:17
今天我们来介绍一下“UMD-TTIC-UW at SemEval-2016 Task 1: Attention-Based Multi-Perspective Convolutional Neural Networks for Textual Similarity Measurement”这篇论文。其实本篇论文和之前所说的Multi-Perspective CNN原理是一样的。只不过做了一些小的改进。接下来,我们来讲一下。 首先看一下让他的模型架构, 其实就是在embedding层和Multi-Perspective句子建模层之间加入了一个Attention-Based输入层: 这么做的原因在于,MPCNN模型中,两个句子被相互独立的处理,直到full-connected层二者的信息才有了交互,这样会丢失很多有用的信息。而Attention-based层通过对两个句子的词嵌入矩阵进行融合,获得的新的“词向量”具有二者的信息,可以更好的表征句子的相互关系。其计算方法如下所示: 1,计算attention matrix D(m*n维矩阵,m和n分别代表sent1和sent2的长度)。 Dij代表sent1中第i个单词的词向量与sent2中第j个单词的词向量的余弦距离 2,计算每个句子的attention weight vector Ai(长度为对应句子长度)。其计算方法为:

tzhlucene 文件格式

别等时光非礼了梦想. 提交于 2019-11-30 18:45:20
https://www.cnblogs.com/forfuture1978/archive/2009/12/14/1623599.html 四、具体格式 上面曾经交代过,Lucene保存了从Index到Segment到Document到Field一直到Term的正向信息,也包括了从Term到Document映射的反向信息,还有其他一些Lucene特有的信息。下面对这三种信息一一介绍。 4.1. 正向信息 Index –> Segments (segments.gen, segments_N) –> Field(fnm, fdx, fdt) –> Term (tvx, tvd, tvf) 上面的层次结构不是十分的准确,因为segments.gen和segments_N保存的是段(segment)的元数据信息(metadata),其实是每个Index一个的,而段的真正的数据信息,是保存在域(Field)和词(Term)中的。 4.1.1. 段的元数据信息(segments_N) 一个索引(Index)可以同时存在多个segments_N(至于如何存在多个segments_N,在描述完详细信息之后会举例说明),然而当我们要打开一个索引的时候,我们必须要选择一个来打开,那如何选择哪个segments_N呢? Lucene采取以下过程: 其一,在所有的segments_N中选择N最大的一个

深入理解wmd算法

情到浓时终转凉″ 提交于 2019-11-29 02:29:26
深入理解wmd算法 WMD(Word Mover’s Distance) 1 是2015年提出的一种衡量文本相似度的方法。它具有以下几个优点: 效果出色:充分利用了 word2vec 的领域迁移能力 无监督:不依赖标注数据,没有冷启动问题 模型简单:仅需要词向量的结果作为输入,没有任何超参数 可解释性:将问题转化成线性规划,有全局最优解 灵活性:可以人为干预词的重要性 当然它也有一些缺点: 词袋模型 ,没有保留语序信息 不能很好的处理词向量的OOV(Out of vocabulary)问题 处理否定词能力偏差 处理领域同义词互斥词的能力偏差 时间复杂度较高:O(p3logp)O(p3log⁡p)(其中,p代表两篇文本分词去重后词表的大小) 在利用WMD计算两条文本的相似度时,会进行以下步骤: 利用word2vec将词编码成词向量 去掉停用词 计算出每个词在文本中所占权重,一般用词频来表示 对于每个词,找到另一条文本中的词,确定移动多少到这个词上。如果两个词语义比较相近,可以全部移动或移动多一些。如果语义差异较大,可以少移动或者不移动。用词向量距离与移动的多少相乘就是两个词的转移代价 保证全局的转移代价加和是最小的 文本1的词需要全部移出,文本2的词需要全部移入 我们先把文档看成词的一个分布(比如使用归一化的词频特征)。首先考虑如何令“文档 1

中文情感分类

China☆狼群 提交于 2019-11-29 00:49:23
本小结是对中文评论进行处理,利用word2vec工具获得特征数据,进而完成情感分析的目的 注意:本文重点是如何获得特征向量 根据项目本身的语料情况,一条评论就是一个txt文档,有两个语料文件:pos文件下包含1000条积极的评论,neg文件下包含1000条消极的评论 1-初始语料的预处理-把正向和负向评论分别规整到一个txt文件中,实施代码如下 import logging import os , os . path import codecs , sys #设置读取文件内容的函数 def getContent ( fullname ) : f = codecs . open ( fullname , "r" ) #需要注意的时在原始语料中一个txt文档中只有一句评论 content = f . readline ( ) f . close ( ) return content if __name__ == "__main__" : #得到文件名 program = os . path . basename ( sys . argv [ 0 ] ) logger = logging . getLogger ( program ) logging . basicConfig ( format = '%(asctime)s: %(levelname)s: %(message)s' )

word2vec模型cbow与skip-gram的比较

ぃ、小莉子 提交于 2019-11-28 17:31:37
cbow和skip-gram都是在word2vec中用于将文本进行向量表示的实现方法,具体的算法实现细节可以去看word2vec的原理介绍文章。我们这里大体讲下两者的区别,尤其注意在使用当中的不同特点。 在 cbow方法中,是用周围词预测中心词 ,从而利用中心词的预测结果情况,使用GradientDesent方法,不断的去调整周围词的向量。当训练完成之后,每个词都会作为中心词,把周围词的词向量进行了调整,这样也就获得了整个文本里面所有词的词向量。 要注意的是, cbow的对周围词的调整是统一的:求出的gradient的值会同样的作用到每个周围词的词向量当中去。 可以看到,cbow预测行为的次数跟整个文本的词数几乎是相等的(每次预测行为才会进行一次backpropgation, 而往往这也是最耗时的部分),复杂度大概是O(V); 而 skip-gram是用中心词来预测周围的词 。在skip-gram中,会利用周围的词的预测结果情况,使用GradientDecent来不断的调整中心词的词向量,最终所有的文本遍历完毕之后,也就得到了文本所有词的词向量。 可以看出,skip-gram进行预测的次数是要多于cbow的:因为每个词在作为中心词时,都要使用周围词进行预测一次。这样相当于比cbow的方法多进行了K次(假设K为窗口大小),因此时间的复杂度为O(KV),训练时间要比cbow要长。

四步理解GloVe!(附代码实现)

两盒软妹~` 提交于 2019-11-28 09:52:32
1. 说说GloVe 正如GloVe论文的标题而言, GloVe的全称叫Global Vectors for Word Representation,它是一个基于全局词频统计(count-based & overall statistics)的词表征(word representation)工具,它可以把一个单词表达成一个由实数组成的向量,这些向量捕捉到了单词之间一些语义特性,比如相似性(similarity)、类比性(analogy)等。 我们通过对向量的运算,比如欧几里得距离或者cosine相似度,可以计算出两个单词之间的语义相似性。 2. GloVe的实现步骤 2.1 构建共现矩阵 什么是共现矩阵? 共现矩阵顾名思义就是共同出现的意思,词文档的共现矩阵主要用于发现主题(topic),用于主题模型,如LSA。 局域窗中的word-word共现矩阵可以挖掘语法和语义信息, 例如: I like deep learning. I like NLP. I enjoy flying 有以上三句话,设置滑窗为2,可以得到一个词典: {"I like","like deep","deep learning","like NLP","I enjoy","enjoy flying","I like"} 。 我们可以得到一个共现矩阵(对称矩阵):

NLP系列文章:子词嵌入(fastText)的理解!(附代码)

耗尽温柔 提交于 2019-11-28 07:07:50
1. 什么是fastText 英语单词通常有其内部结构和形成⽅式。例如,我们可以从“dog”“dogs”和“dogcatcher”的字⾯上推测它们的关系。这些词都有同⼀个词根“dog”,但使⽤不同的后缀来改变词的含义。而且,这个关联可以推⼴⾄其他词汇。 在word2vec中,我们并没有直接利⽤构词学中的信息。⽆论是在跳字模型还是连续词袋模型中,我们都将形态不同的单词⽤不同的向量来表⽰。例如, “dog”和“dogs”分别⽤两个不同的向量表⽰,而模型中并未直接表达这两个向量之间的关系。鉴于此,fastText提出了⼦词嵌⼊(subword embedding)的⽅法,从而试图将构词信息引⼊word2vec中的CBOW。 这里有一点需要特别注意,一般情况下,使用fastText进行文本分类的同时也会产生词的embedding,即embedding是fastText分类的产物。除非你决定使用预训练的embedding来训练fastText分类模型,这另当别论。 2. n-gram表示单词 word2vec把语料库中的每个单词当成原子的,它会为每个单词生成一个向量。这忽略了单词内部的形态特征,比如:“book” 和“books”,“阿里巴巴”和“阿里”,这两个例子中,两个单词都有较多公共字符,即它们的内部形态类似,但是在传统的word2vec中

【NLP】彻底搞懂BERT

不打扰是莪最后的温柔 提交于 2019-11-27 23:33:37
# 好久没更新博客了,有时候随手在本上写写,或者Evernote上记记,零零散散的笔记带来零零散散的记忆o(╥﹏╥)o。。还是整理到博客上比较有整体性,也方便查阅~ 自google在2018年10月底公布BERT在11项nlp任务中的卓越表现后,BERT(Bidirectional Encoder Representation from Transformers)就成为NLP领域大火、整个ML界略有耳闻的模型,网上相关介绍也很多,但很多技术内容太少,或是写的不全面半懂不懂,重复内容占绝大多数 (这里弱弱吐槽百度的搜索结果多样化。。) 一句话概括,BERT的出现,彻底改变了 预训练产生词向量 和 下游具体NLP任务 的关系,提出龙骨级的训练词向量概念。 目录:   词向量模型:word2vec, ELMo, BERT比较   BERT细则:Masked LM, Transformer, sentence-level   迁移策略:下游NLP任务调用接口   运行结果:破11项NLP任务最优纪录 一、词向量模型 这里主要横向比较一下word2vec,ELMo,BERT这三个模型,着眼在模型亮点与差别处。 传统意义上来讲,词向量模型是一个工具,可以把真实世界抽象存在的文字转换成可以进行数学公式操作的向量,而对这些向量的操作,才是NLP真正要做的任务。因而某种意义上,NLP任务分成两部分,