使用Lee corpus来介绍Gensim中Doc2vec模型的使用
Doc2vec模型是用来将每一篇文档转换成向量的模型,注意,是将整篇文档转换为向量!
Le and Mikolov 在2014年介绍了Doc2Vec 算法,这个算法虽然仅仅是使用了Word2Vec的向量进行了平均化操作,但是效果却很好。
gensim库的Doc2vec模型实现了这个算法
这有两种实现:
1、Paragraph Vector-Distributed Memory(PV-DM)
2、Paragraph Vector-Distributed Bag of Words(PV-DBOW)
两种实现的不同:
PV-DM类似于Word2vec模型的CBOW,文档的向量表示是通过在基于词向量的上下文均值和整个文档的向量来预测中心词的任务上,训练神经网络。
PV-DBOW模型类似于Word2vec模型的 SG,文档的向量是通过训练一个神经网络,从全部的文档向量(doc-vector)中预测目标词的任务上进行训练。
通过使用在gensim中自带的LeeBackground Corpus语料库来训练模型,这个语料库包含314篇选自澳大利亚广播公司的新闻邮件服务的文档,提供标题故事的文本电子邮件,覆盖很广泛的主题。
模型的测试则是使用LeeCorpus,这个语料库只包含50篇文档。
定义读取与处理文本的函数
接下来需要定义一个函数,用来
1:打开训练/测试文件(使用latin编码)
2、一行一行的读取文件
3、对每一行进行预处理(将文本标记化成单个的单词,移除标点符号,转小写等等)
注意:读取的整个文件就是一个语料库,这个文件里面的每一行就是一篇文档
可以打印一下训练语料库和测试语料库
接下来将实例化Doc2vec模型,设置向量的大小为50维,并且迭代训练40次。设置最小的单词数目为2,来过滤掉那些出现了很少次的单词。
迭代次数越多,花费的时间就越多,最终会在一个收益减少的点返回。
由于这个数据集很小(只有300篇文档)而且文档也比较短(每篇只有几百个单词)增加训练通道可以帮助训练这种小数据集
建立单词表
最后,字典是一个列表(可以通过model.wv.index_to_key来访问)保存了唯一的从个训练语料库中抽取的单词。
每一个单词的额外的属性可以使用model.wv.get_vecattr()方法。
举个例子来说,想要看一下单词penalty在语料库里面出现了多少次:
#目前出现错误
猜测可能是版本更新,不提供这种方式了
接下来在语料库上对模型进行训练,分别要指明总的样例数目(300)和训练轮次(epochs)
接下来进行训练
现在,我们可以通过把需要得到向量的一段文本送入训练好的模型,通过使用model.infer_vector()函数,来获取对应文本片段的向量
注意:在使用infer_vector时,不要送入字符串,要送入经过token化的列表。
为了评估我们的新模型,我们将首先为训练语料库中的每个文档推断新的向量,将推断的向量与训练语料库进行比较,然后基于自相似性返回文档的排名。
基本上,我们假装训练语料库是一批没见过的新的数据,然后观察它们与训练语料库的比较情况。
可以看到,对每一篇文档找最相似的文档,291篇都是在最相似排行第一的找到,只有9篇在最相似排行第二的找到。
基本上超过了95%的正确率!
接下来还有一个例子
查看一下第1篇文档的最相似的文档,第二相似的文档,中间相似的文档,和最不相似的
本文地址:http://nhjcxspj.xhstdz.com/quote/1771.html 物流园资讯网 http://nhjcxspj.xhstdz.com/ , 查看更多