我的目标是利用tenserflow得到一个可以对新闻标题进行准确分类的分类器。
首先我需要有新闻标题的原始数据,因此我从今日头条抓取了近十万条新闻标题用于接下来的训练工作。
得到原始标题数据后,我需要对其进行分词构建语料库,分词我使用 jieba 这个第三方库。
之后要通过语料库用Word2vec算法对分词进行训练,这里我使用 gensim 的 word2vec 。
梳理下准备条件:
我抓取的数据存放在MYSQL,因此我将查询出标题进皮陆行分词后写入语料文件: yuliao.txt 。
虽然 jieba 分词已经很不错了,但是对于某些热门前乎新词和人名等还是不够准确,所以有必要自定义一些词汇提供给 jieba 。
我在 user_dict.txt 中定义了一燃悔顷些 jieba 没有正确分出来的词:
然后加载到我们的程序中:
执行 load_data 方法便会生成语料文件。
导入 gensim ,加载我们的语料文件,开始训练模型:
训练好模型保存为文件,下次可以直接从文件导入,不必再进行训练。
我们看下模型的效果,运行 print_most_similar 测试方法,输出:
效果还可以,如果语料再多一点会更好。
训练好的模型相近意思的词在向量空间中的位置也是相似的,这样我们依据词向量做分类训练,本质上是将相近意思的句子归类。
当然最终我们要得到某个词的向量表示形式:
word2vec是google在2013年开源的一个获取词向量的工具包,word2vec中用到的两个重要模型为CBOW模型(Continuous Bag-of-Words Moedl)和Skip-gram模型(Continuous Skip-gram Model)。他还包含两个提速手段:分旅缓瞎层softmax和负采样
网络结构
cbow的图
网络结构包括三层:输入层、投影层和输出层
中心词 的前后共 个词的词向量 ,
是词向量的长度【这里就是词的个数,即词的one-hot向量】
将每个输入的词向量全连接为长度 的向量
然后将 个向量做求和累加,即
将 全连接为长度 的向量,最后用softmax作为激活函数,计算交叉熵损失
缺点:求softmax的时候需要对每个词、字向量都计算一遍输出概率并进行归一化,在几十万词汇量的语料上是令人头疼的
用哈夫曼树【一种带权路径长度最短的二叉树,也称为最优二叉树】按照词频组织词库中的所有词汇,每个词拆空在都在树的叶子节点上,他哪族们的权重由词频得来
word2vec(cbow+skip-gram+hierarchical softmax+Negative sampling)模型深度解析
word2vec中的数学
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)