目前词向量主要用的技术
- 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可以考虑同时使用
网友评论