词向量

目前词向量主要用的技术

  • word2vec
  • fasttext
  • glove

1 one-host编码

one-hot编码,又称独热编码、一位有效编码。其方法是使用N位状态寄存器对N个状态进行编码,每个状态都有他独立的寄存器位,并且在任意时刻,其中只有一位有效。
one-hot编码在特征提取上属于词袋模型(bag of words)。

优点:

  • 解决了分类器不好处理离散数据的问题;
  • 在一定程度上也起到了扩充特征的作用;

缺点:

  • 是一个词袋模型,未考虑词与词之间的顺序;
  • 假设词与词之间是相互独立的,而实际词与词之间是有影响的;
  • 得到的特征向量是离散稀疏的,容易出现维度灾难;

one-hot编码手动实现

import numpy as np
samples = ["我 毕业 于 北京 理工大学", "我 就职 于 中国科学院技术研究所"]

token_index = {}
for sample in samples:
    for word in sample.split(" "):
        if word not in token_index:
            token_index[word] = len(token_index) + 1
print(token_index)

print("{},{},{}".format(len(samples), len(token_index)+1, max(token_index.values())+1))
results = np.zeros(shape=(len(samples), len(token_index)+1, max(token_index.values())+1))
print(results.shape)

for i, sample in enumerate(samples):
    for j, word in list(enumerate(sample.split())):
        index = token_index.get(word)
        results[i, j, index] = 1
        print(i, j, index, word)
print(results)

results2 = np.zeros(shape=(len(samples), max(token_index.values())+1))
for i, sample in enumerate(samples):
    for _, word in list(enumerate(sample.split())):
        index = token_index.get(word)
        results2[i, index] = 1
print(results2)

Keras中one-hot编码的实现

from keras.preprocessing.text import Tokenizer
samples = ["我 毕业 于 北京 理工大学", "我 就职 于 中国科学院技术研究所"]

# 构建单词索引
tokenizer = Tokenizer()
tokenizer.fit_on_texts(samples)
word_index = tokenizer.word_index
print(word_index)

sequences = tokenizer.texts_to_matrix(samples)
print(sequences)

2 word2vec

word embedding的相关文章

  • Efficient Estimation of Word Representation in Vector Space
  • Distributed Representations of Sentences and Documents
  • Enriching Word Vectors with Subword Information

word2vec是什么?

  • word2vec是词的一种表示,它将词以固定维数的向量表示出来。
  • 传统的基于词袋模型,one-hot representation在判定同义词,相似句子的时候很无力。而Word2vec充分利用上下文信息,对上下文进行训练,每个词不再只是一个位置1,其余位置都为0的稀疏向量,word2vec是一个稠密的固定维数的向量。
  • 经过训练之后的词向量,能够利用上下文信息,找出相似的词语。

word2vec有哪几种实现方式?

  • 方式1:用上下文预测中心词,cbow(continue bag of word)
  • 方式2:利用中心词预测上下文信息,skip-gram

word2vec本质是什么

  • 无监督学习,因为输出并没有label
  • 词向量的本质可以看出是一个只有一层的神经网络,因此必须有输入、输出,训练的目的不是为了得到预测的结果,而是对单词进行分类。最关键的就是获得hidden layer的中的权重。
  • 也就是借助sequnece2sequence模型训练过程,得到hidden layer的权重。

sigmoid和softmax

  • sigmoid也就是logistic函数;
  • softmax要解决这样一个问题:给定一个向量,用数学方法把向量中的所有元素归一化为一个概率分布,也就是说该向量中的元素在[0,1]范围内,且所有元素的和为1;
  • softmax就是这个数学方法,本质就是一个函数;
  • 每个元素都是对向量z内的元素求指数,再除以所有元素求指数后的和。所以softmax函数也叫做归一化指数函数(normalized exponential function)。

huffman树和Huffman编码

  • 给定n个叶子节点,构建一棵二叉树,若它的带权路径长度达到最小,则称这样的二叉树为最优二叉树,也称为Huffman树。
  • 利用Huffman树设计的二进制前缀编码,称为Huffman编码。不等长编码,将频率高的字或者词用短码编码,频率出现低的词或者字用长码编码。【最初目的就是减少网络上传送报文的长度】
  • 文本领域中,把训练语料中的词当成叶子节点,其在语料中出现的次数当作权值,通过构造相应的Huffman树来对每个词进行Huffman编码。

语言模型

  • 语言模型就是用来计算一个句子的概率模型,也就是判断一句话是否是人话的概率?
  • 那如何计算一个句子出现的概率呢?最大似然估计,但是这种方法又有致命的缺陷,一是可能性太大无法估算,二是数据稀疏验证?如何解决上述问题呢?马尔科夫假设
  • 马尔科夫假设:为了解决参数空间过大的问题,引入了:任意一个词出现的概率只与它前面的一个或者几个词有关。
  • 根据大数定律,当样本量很大的时候,一个短语或者词语出现的概率可以用其频率来表示。
  • 一元语言模型(unigram)
  • 二元语言模型(bigram)
  • 三元语言模型(trigram)
  • 某个词出现的概率只和其前N个词有关系。

神经网络语言模型

  • 上述的n-gram模型一般只考虑前面2-3个词的信息,不方便考虑更多的词提供的信息,同时也未考虑词与词之间的相似性。
  • 神经网络语言模型,将词汇表中的每个词表示成一个在m维空间里的实数形式的分布式特征向量,使用序列中词语的分布式特征向量来表示连续概率函数,同时学习特征向量和概率函数的参数。

3 word2vec实现方式及优化方式

skip-gram(跳字模型)

  • 用一个词来预测它正在文本序列周围的词。
  • 跳字模型需要最大化给定任一中心词生成所有背景词的概率
  • 中心词向量
  • 问题=》数学=》最大化=》最小化=》梯度下降

CBOW模型,连续词袋模型

  • CBOW模型用一个中心词在文本序列前后的背景词来预测该中心词

负采样

层序softmax

  • 二叉树

4 word2vec实战

读取停用词

文本预处理

  • 去掉文本中的空格、回车、换行、空白行
  • rules = u"([\u4e00-\u9fa5]+)",去掉标点符号

分词

  • " ".join(jieba.cut(line))
  • 分词之后去掉标点符号

5 word2vec之gensim工具包的使用

gensim中word2vec相关API的说明

在gensim中,word2vec相关的API都在包gensim.models.word2vec中。和算法相关的参数都在类 gensim.models.word2vec.Word2Vec中。

算法中主要的参数:

  • sentences,要分析的语料,可以是一个列表,或者文件中遍历读出
  • size,词向量的维度,默认是100。这个维度的取值一般与语料库的大小相关,如果不大的语料库,如小于100M的预料,则使用默认值,如果用的语料库较大,建议增大维度。
  • window,即词向量上下文最大距离,windows越大就和较远的词也会产生上下文关系。默认值是5。在实际使用中,可以根据实际需求动态调整windows的大小。如果语料库较小,这个值可以设置的更小。对于一般的语料,通常设置为[5,10]之间。
  • sg:用于cbow和skip-gram模型之间选择,sg=0,选择cbow模型;sg=1,则选择skip-gram模型,默认sg=0。
  • hs:用于选择Word2vec求解方法,hs=0,选择Negative Sampling,即负采样;hs=1,且负采样个数negative大于0,选择Hoierarchical Softmax求解方式。默认hs=0。
  • negative,即Negative Sampling时,负采样的个数,默认是5,推荐在[3,10]之间。
  • cbow_mean,仅用于CBOW在做投影的时候,若cbow_mean=0,则为上下文向量之和,若cbow_mean=1,则为上下文的向量的平均值。默认若cbow_mean=1。
  • min_count,需要计算词向量的最小词频,这个值可以去掉一些很生僻的低频次,默认是5。如果小语料,可以调低这个值。
  • iter,随机梯度下降法中迭代的最大次数,默认是5,对于大语料,可以增大这个值。
  • alpha,随机梯度下降法中迭代初始的步长,默认是0.025。
  • min_alpha,迭代最小的步长值。

注意:对于通用领域可以直接使用已经训练好的词向量

6 fasttext理论部分

  • FastText是FAIR(Facebook AIResearch)在2016年推出的一款文本分类工具与向量化工具。
  • 官网:https://fasttext.cc/
  • fasttext高效的文本分类和表示工具。
  • 对模型进行裁剪和压缩之后,可以轻松跑在移动设备上。
  • 惊艳的地方:和前沿的深度网络模型相比,在分类精度等指标相同的情况下,fasttext把训练和推断速度降低了几个数量级。
  • 对比的模型:char-CNN、VDCNN、fasttext
  • fasttext速度快的两个主要秘密武器:
    • 利用了词内的n-gram信息(subword n-gram information)
    • 利用了层次化softmax(hierarachical softmax)回归的训练技巧

在fasttext出现之前,大部分的文本向量化工作都是以词汇表中的独立单词作为基本单元来进行训练的,但是这种处理方式有以下两个缺点:

  • 低频词、罕见词,由于在语料库中出现的次数少,得不到足够的训练,效果不佳。
  • 未登录词,如遇到未在词典中收录的词或者拼写错误的词时,模型的变现就比较差。

subword n-gram

subword n-gram的引入解决了词变形(morphology)的问题。直观上,subword n-gram将一个单词打散到字符级别,并且利用字符级别的n-gram信息来捕获字符间的顺序关系,依次丰富单词内部更细微的语义。

分层softmax

softmax就是logistic regerssion在多分类任务上的推广,一般是神经网络的最后一层。
层次化softmax实质上是将一个全局多分类问题,转化成若干个二元分类问题,从而降低计算的复杂度。

7 fasttext文本分类实战

fasttext模型目前在windows平台上不能使用

  • 可以实现文本的分类【主要用于文本分类】
  • 可以构造一个词向量

8 Glove讲解

Glove简介

Glove (Global vectors for word representation),2014年由Stanford NLP Group组织提出,它是一个基于全局词频统计(cont-based & over statistics)的词表示工具,它可以把一个单词表示成一个由实数组成的向量,这些向量捕捉到了单词之间一些语义特性,比如相似性、类比性等。
通过对象量的运算,如欧几里得距离或者cosine相似度,可以计算出两个单词之间的语义相似性。

Glove是一种更别致的词向量表示。

Glove实现分为以下三步:

  • 构建一个共现矩阵 co-ocurrence matrix
  • 构建词向量和共现矩阵之间的关系
  • 构造 loss function

Co-ocurrence Matrix

  • Co-occurrence: 协同出现指的是两个单词w1和w2在一个context window范围内共同出现的次数。
  • Context Windows:指的是某个单词w的上下文范围的大小,也就是前后多少个单词以内的才算是上下文。

优点:

  • 比字数统计和tfidf都要进步一点。因为它不再认为单词是独立的,而考虑单词所在附近的上下文。

Glove的实现

构造共现矩阵 Co-ocurrence Matrix,矩阵中每一个元素Xij代表单词i和上下文单词j在特定大小的上下文窗口内共同出现的次数。
构建词向量和共现矩阵之间的近似关系
构造损失函数。单词的权重要大于哪些很少在一起出现的单词,所以这个函数应该是非递减函数。权重不过大,当达到一定程度之后不再增加。如果两个单词没有在一起出现,则Xij=0。

Glove是如何实现训练的?

虽然很多人声称Glove是一种无监督学习,但其是它还是有label的,只不过这个label是自动标记的。

Glove与LSA、Word2vec的比较?

  • LSA是一种比较早的count-based词向量表示工具,计算量大。
  • word2vec,可以分为skip-gram和cbow两类,但都是基于局部滑动窗口计算的,即利用了局部的上下文特征(Local Context)。
  • Glove结合了LSA的优点,即利用了全局的特征,减少了计算量,也使用了局部上下文的特征。

从工程的角度看,word2vec和Glove可以考虑同时使用

参考:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,757评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,478评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,540评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,593评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,903评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,329评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,659评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,383评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,055评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,337评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,864评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,227评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,820评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,999评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,750评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,365评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,260评论 2 258

推荐阅读更多精彩内容