词向量
欧式距离和余弦相似度的方法是无法表达单词之间的语义相似度
归为one-hot方式无法表达单词间的语义相似度
one-hot的表达方式,如果词典大小是指数级的,那么一个句子的向量表示中,只有少数位置是1,其他位置都是0
这就导致了向量稀疏
归结one-hot缺点:1、无法表达语义相似度,2、稀疏问题
词向量表示法
分布式表示法
每个单词表示的向量维度不再是等于词典长度,而是自定义的
向量中每个位置都有一个非0数值
欧式距离的方式在分布式表示方法中可以来比较单词之间的相似度
词向量只是分布式表示法中的一种
分布式表示法的容量空间远大于one-hot表示法,100维one-hot最多只能表示100个单词,
分布式表示法可表示的单词无限个,即使限定每个位置是0或1,也能表示2的100次方个单词
词向量的训练
训练词向量需要将所有文章或者句子拼接成一个很长的字符串作为输入
这个字符串要保证大量的数据
将字符串送入模型训练,得到词向量这种分布式的表示
模型有:skip-gram
Glowe\CBOW、RNN/LSTM、MF等
模型中最重要的参数是dim,也就是训练出来的词向量维度,一般不超过300维
但是训练100B这种量级的词是很有挑战性的,所有我们一般是使用一些机构训练出来的词向量结果
当然不同的领域,比如金融医疗领域,则需要搜集出这么一个语料库去训练出词向量
词向量从某种意义上理解为词的意思
我们希望训练出来的词向量,相近意思的词在空间中是聚集在一起的。
当我们训练完之后,就可以将这些词向量放在一个二维空间看一下,如果可以看出效果则继续使用研究
如果效果不好则需要调整模型训练。
one-hot是达不到这种效果的,只有词向量才能这样查看
句子向量
句子向量是由词向量得来的
第一种方法可以使用平均法则
将句子中的词向量先做加法,然后平均,得到的向量作为句子向量
这样我就可以通过欧式距离,余弦相似度计算句子之间的相似度
第二种方法是LSTM/RNN
知识问答系统
采用句子相似度匹配的方式来进行知识问答,首先比较输入的句子和词库中第一个句子的相似度,然后比较下一个句子
如此复杂度就是O(N)*每次相似度比较的复杂度
如果知识库中有10的5次方这种量级的句子,那这种问答系统显然是不符合实际应用需要的。
核心思想:层次过滤
当得到一个输入的问题后,不急于去比较知识库中句子相似度,而是先通过过滤器进行过滤,最终得到一个小量级的句子集
然后在这些少量的问题中通过余弦相似度比较得到最好的匹配问题。
之所以是层次过滤,是因为要保证过滤的复杂度是递增的。
过滤器1复杂度小于过滤器2,小于余弦相似度的复杂度,只有这样才算降低了复杂度,层次过滤起到了效果
倒排表
搜索引擎中的核心架构就是倒排表
从所有文档中进行统计,得到每个单词存在于哪个文档这样一个倒排表
这样,用户在输入后不再需要到所有文档去查找单词,只需要搜索倒排表,返回单词所在文档即可
如果是输入的两个词没有同时存在于一个文档,那么就把出现两个单词的文档都返回
然后将返回的文档进行相似度计算,根据相似度来返回搜索结果给用户