之前一个系列介绍了hyperwords工具包。这个工具包相对于word2vec和GloVe,有了很多新的特性,比如支持任意形式的上下文,比如加入了PPMI这样的稀疏的单词表示。这种稀疏的表示甚至在很多情况下的表现都超过了word2vec和GloVe。当然这个工具包还有不少的问题。首先是在大语料上面会有问题。比如在构建共现矩阵部分效率很低,在大语料上面跑不通。再比如构建词典是代码也没有考虑内存大小等等。然后这个工具包并没有GloVe模型。此外这个工具包bug有些多。我之前也联系过作者,这个工具包算是一个半成品。当然这些缺点并不妨碍这个工具包带给我们的启示。
针对这些缺点,一个在hyperwords的加强版本出现了。这个就是ngram2vec工具包,地址在ngram2vec(https://github.com/zhezhaoa/ngram2vec)。首先的一个改进是加上了ngram作为特征。我们知道词向量和语言模型的关系非常密切。语言模型中最重要的的特征就是ngram。因此在词向量中加入ngram是一个非常非常自然的事情,而ngram的加入也大大的提升了词向量的性质。当然这个工具包支持很随意的加入各种各样的特征。另外一个很重要的改进就是效率的提升。这个工具包比较好的对内存进行监控,能在有限的内存下生成词向量。这个工具包对hyperwords的几乎所有环节进行了优化。比如corpus2pairs中多线程提取pairs,pairs2counts中利用了mixed机制和stripes机制加速共现矩阵的构建,counts2ppmi中加速稀疏共现矩阵的建立等等等等。此外,这个工具包加入了glove模型,提供了glovef,在glove上面支持不同形式的上下文。在流程上面,ngram2vec基本上继承了hyperwords的思想