git地址:https://github.com/aiweiw/fasttext-PVDM
train:
./fasttext PVDM -input train.txt -output model
infer
./fasttext predictPVDM model.bin test.txt output k
在原版的基础上新增了段落向量的功能,参考的论文是Distributed Representations of Sentences and Documents,https://arxiv.org/abs/1405.4053
文章里提出,除了词向量外,大家还期待得到phrase-level或者是 sentence-level的表示,比较常见的是通过weighted vector的叠加得到(缺失word顺序),还有一种比较复杂的,是通过解析树得到(只对sentence-level的有效,因为是要依靠解析树)。
PV-DM
Distributed Representations of Sentences and Documents(PV-DM,下同)的做法是在原先的预测任务中新增一个表示段落的向量,原先的模型是用前三个单词预测第四个单词,后面改为表示段落的向量+前三个单词一起预测第四个向量。整个段落中对应的段落向量是相同的,随着滑动窗口一起滑动,但是段落对应的向量不在段落间共享,但是词汇对应的向量是在段落间共享的,也就是说,所有段落对应的同一个词汇的向量是一致的。
这个算法一共分为2步,对于已知的段落,在训练过程中得到词向量W,层次softmax参数U,b,和段落向量D,对于未知段落,保持W,U,b不变的情况下,增加在D中的新的column,并且梯度下降至收敛。
PVDBOW
另一种做法就是在输入中不使用word,但是让模型去预测从段落中随机采样出来的词。从text window中随机采样出一个词,然后根据段落向量做分类任务。这有点类似于skip-gram。
效果的话:PV-DM的结果已经非常好了,但是如果加上PVDBOW的话,效果就更好了,因此强烈推荐。
实验结果:
1.使用PV-DM的结果比PVDBOW结果好,但是两者结合起来效果更好
2.concat比sum结果更好
3.调整window size,会使得结果表现更好
4.段落向量虽然费时,但是可以在测试的时候并行跑出来。