在经过了文本处理步骤(可参考自然语言处理之文本处理步骤)后有下列几种方法可以进行特征提取。
Bag of word
将这些词变成一个索引放入一个表格中,然后每个文档作为一行,统计文档中的词出现的次数。
如何计算两个文档之间的相似度呢?
一种方法是计算两个文章的点积,但是点积有个缺陷,只能捕捉重叠部分的,它不受其他不同值的影响,因此差别很大的两行,这两行比较长,和差别很小的两行,这两行比较短,他们的重叠的长度可能是一样的,这样的话他们的点积就是一样的。
一个更好的计算方法是计算余弦相似度。 余弦相似度表示的是两行之间向量的余弦值,如果方向完全相同(此时等于1),则说明词意相同,方向完全相反(此时等于-1),则说明词义完全相反。
TF-IDF
bag of word 有一个缺陷在于它把所有的单词的重要性等同,但是在日常的文本当中,每个单词的重要程度是不一致的,表现在某些词出现的频率高一点,某些词出现的频率低一些,这样的话我们就可以用每个词出现的频率来表示一个词的重要程度了。TF-IDE就是这样的一种方法。首先统计单词在整个语料库中出现的次数。
然后用文档中的单词在语料库中的占比来表示原有的值。
这里的count(t,d)表示词条t在文档d中出现的次数, |d|表示词条在d中的总数(这里不是明白),|D|表示预料中文档的总数,|{d<D: t < d}|表示包含t的文档数量的结果。
one-hot
one-hot将每个词条表示为唯一值,这里就不详细展开。
word Embedding
当词条量特别巨大的时候,one-hot表示的向量将会很长,word Embedding可以将词条向量表示在一个相同的长度中,然后相同词性的词的距离应该是一样的,例如“男”,“女”和“国王”,"皇后"他们之间的距离应该是一样的,也可以表示词性正负等,如“好”,“坏”他们的方向恰好相反。
Word2Vec
【转】Word2Vec原理之层次Softmax算法 - imsuhxz的博客 - CSDN博客
这篇文章讲的霍夫曼算法和层次softmax很好理解。
Word2Vec是当前最广泛应用的方法,它的核心思想是一个模型能够根据相邻词预测中心词,反之也可以用中心词来预测它的相邻词,前者的方法叫Continuous Bag of Word(CBoW),后者称为Skip-gram.
skip-gram的原理如图所示,首先将词条用one-hot方法来表示,将它输入到神经网络或者其他的模型当中用来预测周围的词的概率,使用适当的损失函数,优化模型的权重和参数,一直训练到模型能够尽可能的学会预测周围的词语。将神经网路中的的隐藏层作为这个词的词向量。CBoW的做法也类似,只不过它的输入变成了多个词语的one-hot表示,然后去预测一个词语,也是用隐藏层向量表示词向量。
Word2Vec的优点:
- 鲁棒性:由于每个词分布在整个向量中,而不是像one-hot一样只用某一个特定值来表示,这样的话会有很强的鲁棒性。
- 词向量大小一致:神经网络的隐藏层的长度是固定的,所以词向量的长度也固定了。
- 只需要训练一次,无需多次的变换,只需要将他们储存在查找表中之后查找用起来就好了。
- 可以直接用于深度学习框架:例如可以直接作为rnn的输入,我们也可以用rnn来训练中更好的词向量表示。
Word2Vec在训练过程中有很多的训练技巧如Hierarchical Softmax,降采样等。关于CBoW和skip-gram详细的原理介绍可以参考网上很多的文章,这里推荐“word2vec Parameter Learning Explained”这篇论文,是我见过的最好的材料。有时间也可以专门写一篇介绍Wrod2Vec的文章详细介绍。
GloVe
GloVe首先对语料库中所有的词语计算了一个共现矩阵,即词语之间共同出现的次数,之后将这个共现矩阵转换为概率,也就是两个词语之间出现的概率,之后我们用向量来表示词语的时候,共现矩阵中这两个词的条件概率比值应该和向量表示的比值近似相等,也就是两个向量的内积应该是等于共现矩阵中的概率,那我们一次为目标构造平方误差损失函数来进行训练得到最后的词向量。
理解GloVe模型(+总结)这篇文章详细的介绍了GloVe,有兴趣的可以看看,写的很好,很容易理解。
t-SNE
t-SNE是一种降维技术,它能够将高维词向量降维到二维的空间,但是保持词向量之间的相对距离,使相同对象之间相互靠近,不同对象之间远离,所以我们可以利用t-SNE能够很好的可视化词向量。