计算大规模稀疏向量余弦相似度(开源项目)
简介
本项目的目的是用于计算大规模向量的余弦相似度,其核心的设计思想请查看我博客中的文章http://www.cnblogs.com/zz-boy/archive/2012/12/15/2819401.html,在这篇文章中我阐述了使用外排序的思想设计计算余弦相似度的算法,本项目的SVN检出地址为http://largescalecosinsim.googlecode.com/svn/trunk/,下面我将具体阐述该项目的使用方法。
使用方法
代码的包结构如下图所示:
org.similarity
org.similarity.core
org.similarity.extension
org.similarity.io
org.similarity.util
org.test
用户主要需要关心的是org.similarity.extension包下的扩展接口,以及org.similarity.CosinSimilarity类。
org.similarity.extension包中的接口如下图所示:
org.similarity.extension.ICosinSimDenominat<T>
org.similarity.extension.IDataPool<T,V>
org.similarity.extension.ISimilarityDealLogic<T>
org.similarity.extension.VectorSimilarity<T>
ICosinSimDenominat:是取余弦相似度计算的分母的接口,这样做的主要目的是我们处理大规模数据,如果分母的计算采用线上计算的话会很费时,所以我们假设用户已经事先计算好了所有的分母,当然如果向量规模不是很大,也可以使用线上计算的方式提供分母,这取决于用户实现接口的方式。
IDataPool:此接口提供了两个函数
public List<V> getAllColumnkKey();
public List<Pair<T,Double>> getColumnVector(V column);
两个函数的概念请对应到我博客中的矩阵来理解。矩阵如下图所示
d1 |
d2 |
d3 |
d4 |
… |
dn |
|
u1 |
r11 |
r12 |
r13 |
r14 |
… |
r1n |
u2 |
r21 |
r22 |
r23 |
r24 |
… |
r2n |
u3 |
r31 |
r32 |
r33 |
r34 |
… |
r3n |
… |
… |
… |
… |
… |
… |
… |
um |
rm1 |
rm2 |
rm3 |
rm4 |
… |
rmn |
getAllColumnkKey返回的是{d1,…,dn},也就是维度名的集合。
getColumnVector返回的是某个维度对应的列,其中r为0的已经被剔除了。
用户必须实现这个接口,因为程序需要调用此接口的方法生成初始化排序文件。
ISimilarityDealLogic:此接口是用于描述排序结果的处理逻辑。接口中的方法如下
public boolean deal(T t),T就是相似度对象,用户需要实现该接口,一般此接口被用作向数据库中写入向量相似度。
VectorSimilarity:此抽象类需要用户继承,并将模板参数实例化,ISimilarityDealLogic接口处理的对象类型就是此类的派生,具体使用可以参考程序中给出的代码。
用户实现好上述几个接口之后可以调用org.similarity.CosinSimilarity中的Compute函数来实现相似度计算,在调用之前,用户可以通过修改该类中几个公开的静态属性来实现对计算过程的控制。静态属性如下所示:
public static String TMP_DIR_PATH = "./tmp/";// 计算过程中产生的临时文件的存放位置
public static int BUFFER_SIZE = 1024*1024*1;// 一次缓冲读取(1M)
public static int FILE_RECORD_COUNT = 100000;// 归并排序初始归并段中的记录数量
public static int K = 10;// 定制归并路数
参考用例
程序中我写了一个测试用例在org.test包下,请用户参考。