PPMI和SVD都是很传统的模型。在word2vec之前很早就出现了。PPMI这种高维稀疏的单词表示一般认为比word2vec要差,尤其是在analogy问题上面。word2vec引起人注意的一个很重要的点就在于在analogy上面远远超过了传统的词向量模型。实际上,这个工具包的作者发现,当我们吧word2vec中的一些超参数引进传统的方法中,并且使用新的公式去做analogy这个任务,PPMI,SVD这种传统的模型也会去得很好的效果。实际上,word2vec,GloVe这些词向量模型本质上就是在利用共现矩阵进行训练。下面介绍如何从counts中生成PPMI矩阵。PPMI全称是positive pointwise mutual information。PMI大家应该比较熟悉,之前word2phrase中找phrase也利用的是PMI。这个东西实际上就是对共现矩阵的一个加权。用python代码几行就写好了。所以其实我们不需要用word2vec,GloVe那样复杂的训练,调参什么的,就用传统经典的bag-of-contexts加权,就能得到很高质量的词向量。而且,这个词向量很容易解释,每一维度都有清楚的含义。counts2pmi生成的是PMI矩阵,PPMI矩阵就是把PMI中的负数变成0。我们先看看counts2pmi的main函数。实际上就两步,首先从文件中读入共现矩阵,然后加权得到PMI矩阵
def main():
args = docopt("""
Usage:
counts2pmi.py [options] <counts> <output_path>
Options:
--cds NUM Context distribution smoothing [default: 1.0]
""")
counts_path = args['<counts>']
vectors_path = args['<output_path>']
cds = float(args['--cds'])//从word2vec中借鉴的超参
counts, iw, ic = read_counts_matrix(counts_path)