gensim 中的word2vector 有预训练好的model吗?
2013年,Google开源了一款用于词向量计算的工具——word2vec,引起了工业界和学术界的关注。
首先,word2vec可以在百万数量级的词典和上亿的数据集上进行高效地训练;其次,该工具得到的训练结果——词向量(word embedding),可以很好地度量词与词之间的相似性。
随着深度学习(Deep Learning)在自然语言处理中应用的普及,很多人误以为word2vec是一种深度学习算法。
其实word2vec算法的背后是一个浅层神经网络。
另外需要强调的一点是,word2vec是一个计算word vector的开源工具。
当我们在说word2vec算法或模型的时候,其实指的是其背后用于计算word vector的CBoW模型和Skip-gram模型。
很多人以为word2vec指的是一个算法或模型,这也是一种谬误。
接下来,本文将从统计语言模型出发,尽可能详细地介绍word2vec工具背后的算法模型的来龙去脉。
详情:网页链接
怎么用skip-gram做word2vector
优点一:One-hot形式实为索引形式,单词向量维度为词表长度,文本矩阵是一个稀疏矩阵,而word2vector可以通过指定合适的词向量维度对其进行降维,将文本矩阵压缩密集矩阵,减小了所需的存储空间;优点二:One-hot形式下不同词语之间相似度都为0,割裂了词与词之间的联系,word2vector形式通过降维提取出了低维特征,使不同词语之间有了“距离”的远近,这种内在联系可以使后续的处理效果提升。
暂时想到这两点,欢迎补充。
...
word2vector为什么可以学习词的语义信息
数据预处理 模型能聊的内容也取决于选取的语料。
如果已经具备了原始聊天数据,可以用SQL通过关键字查询一些对话,也就是从大库里选取出一个小库来训练。
从一些论文上,很多算法都是在数据预处理层面的,比如Mechanism-Aware Neural Machine for Dialogue Response Generation就介绍了,从大库中抽取小库,然后再进行融合,训练出有特色的对话来。
对于英语,需要了解NLTK,NLTK提供了加载语料,语料标准化,语料分类,PoS词性标注,语意抽取等功能。
另一个功能强大的工具库是CoreNLP,作为 Stanford开源出来的工具,特色是实体标注,语意抽取,支持多种语言。
下面主要介绍两个内容:中文分词 现在有很多中文分词的SDK,分词的算法也比较多,也有很多文章对不同SDK的性能做比较。
做中文分词的示例代码如下。
# coding:utf8''' Segmenter with Chinese ''' import jieba import langid def segment_chinese_sentence(sentence):''' Return segmented sentence.''' seg_list = jieba.cut(sentence, cut_all=False) seg_sentence = u" ".join(seg_list) return seg_sentence.strip().encode('utf8') def process_sentence(sentence):''' Only process Chinese Sentence.''' if langid.classify(sentence)[0] == 'zh':return segment_chinese_sentence(sentence) return sentence if __name__ == "__main__":print(process_sentence('飞雪连天射白鹿')) print(process_sentence('I have a pen.')) 以上使用了langid先判断语句是否是中文,然后使用jieba进行分词。
在功能上,jieba分词支持全切分模式,精确模式和搜索引擎模式。
全切分:输出所有分词。
精确:概率上的最佳分词。
所有引擎模式:对精确切分后的长句再进行分词。
jieba分词的实现 主要是分成下面三步:1、加载字典,在内存中建立字典空间。
字典的构造是每行一个词,空格,词频,空格,词性。
上诉书 3 n 上诉人 3 n 上诉期 3 b 上诉状 4 n 上课 650 v 建立字典空间的是使用python的dict,采用前缀数组的方式。
使用前缀数组的原因是树结构只有一层 - word:freq,效率高,节省空间。
比如单词"dog", 字典中将这样存储:{"d": 0,"do": 0,"dog": 1 # value为词频 } 字典空间的主要用途是对输入句子建立有向无环图,然后根据算法进行切分。
算法的取舍主要是根据模式 - 全切,精确还是搜索。
2、对输入的语句分词,首先是建立一个有向无环图。
有向无环图, Directed acyclic graph (音 /?d?ɡ/)。
【图 3-2】 DAG DAG对于后面计算最大概率路径和使用HNN模型识别新词有直接关系。
3、按照模式,对有向无环图进行遍历,比如,在精确模式下,便利就是求最大权重和的路径,权重来自于在字典中定义的词频。
对于没有出现在词典中的词,连续的单个字符也许会构成新词。
然后用HMM模型和Viterbi算法识别新词。
精确模型切词:使用动态规划对最大概率路径进行求解。
最大概率路径:求route = (w1, w2, w3 ,.., wn),使得Σweight(wi)最大。
Wi为该词的词频。
更多的细节还需要读一下jieba的源码。
自定义字典 jieba分词默认的字典是:1998人民日报的切分语料还有一个msr的切分语料和一些txt小说。
开发者可以自行添加字典,只要符合字典构建的格式就行。
jieba分词同时提供接口添加词汇。
Word embedding 使用机器学习训练的语言模型,网络算法是使用数字进行计算,在输入进行编码,在输出进行解码。
word embedding就是编解码的手段。
【图 3-3】 word embedding, Ref. #7 word embedding是文本的数值化表示方法。
表示法包括one-hot,bag of words,N-gram,分布式表示,共现矩阵等。
Word2vec 近年来,word2vec被广泛采用。
Word2vec输入文章或者其他语料,输出语料中词汇建设的词向量空间。
详细可参考word2vec数学原理解析。
使用word2vec 安装完成后,得到word2vec命令行工具。
word2vec -train "data/review.txt" \-output "data/review.model" \-cbow 1 \-size 100 \-window 8 \-negative 25 \-hs 0 \-sample 1e-4 \-threads 20 \-binary 1 \-iter 15-train "data/review.txt" 表示在指定的语料库上训练模型-cbow 1 表示用cbow模型,设成0表示用skip-gram模型-size 100 词向量的维度为100-window 8 训练窗口的大小为8 即考虑一个单词的前八个和后八个单词-negative 25 -hs 0 是使用negative sample还是HS算法-sample 1e-4 采用阈值-threads 20 线程数-binary 1 输出model保存成2进制-iter 15 迭代次数 在训练完成后,就得到一个model,用该model可以查询每个词的词向量,在词和词之间求距离,将不同词放在数学公式中计算输出相关性的词。
比如:vector("法国") - vector("巴黎) + vector("英国") = vector("伦敦")" 对于训练不同的语料库,可以单独的训练词向量模型,可以利用已经训练好的模型。
其它训练词向量空间工具推荐:Glove。
Seq2Seq2014年,Sequence to Sequence Learning with Neural Networks提出了使用深度学习技术,基于RNN和LSTM网络训练翻译系统,取得了突破,这一方法便应用在更广泛的领域,比如问答系统,图像字幕,语音识别,撰写诗词等。
Seq2Seq完成了【encoder + decoder -...
如何通过词向量技术来计算2个文档的相似度
最近正好组内做了一个文档相似度的分享。
决定回答一发。
首先,如果不局限于NN的方法,可以用BOW+tf-idf+LSI/LDA的体系搞定,也就是俗称的01或one hot representation。
其次,如果楼主指定了必须用流行的NN,俗称word-embedding的方法,当然首推word2vec(虽然不算是DNN)。
然后得到了word2vec的词向量后,可以通过简单加权/tag加权/tf-idf加权等方式得到文档向量。
这算是一种方法。
当然,加权之前一般应该先干掉stop word,词聚类处理一下。
还有,doc2vec中的paragraph vector也属于直接得到doc向量的方法。
特点就是修改了word2vec中的cbow和skip-gram模型。
依据论文《Distributed Representations of Sentences and Documents》(ICML 2014)。
还有一种根据句法树加权的方式,是ICML2011提出的,见论文《Parsing Natural Scenes and Natural Language with Recursive Neural Networks》,后续也有多个改编的版本。
当然,得到词向量的方式不局限于word2vec,RNNLM和glove也能得到传说中高质量的词向量。
ICML2015的论文《From Word Embeddings To Document Distances, Kusner, Washington University》新提出一种计算doc相似度的方式,大致思路是将词之间的余弦距离作为ground distance,词频作为权重,在权重的约束条件下,求WMD的线性规划最优解。
最后,kaggle101中的一个word2vec题目的tutorial里作者如是说:他试了一下简单加权和各种加权,不管如何处理,效果还不如01,归其原因作者认为加权的方式丢失了最重要的句子结构信息(也可以说是词序信息),而doc2vec的方法则保存了这种信息。
在刚刚结束的ACL2015上,似乎很多人提到了glove的方法,其思想是挖掘词共现信息的内在含义,据说是基于全局统计的方法(LSI为代表)与基于局部预测的方法(word2vec为代表)的折衷,而且输出的词向量在词聚类任务上干掉了word2vec的结果,也可以看看。
《GloVe: Global Vectors forWord Representation》
转载请注明出处51数据库 » word2vector模型