我们如何确定Latent语义分析的维数?

CTs*_*rth 8 java theory svd lsa latent-semantic-indexing

我最近一直致力于潜在的语义分析.我已经使用Jama包在java中实现了它.

这是代码:

    Matrix vtranspose ; 
    a = new Matrix(termdoc);  
    termdoc = a.getArray(); 
    a = a.transpose() ; 
    SingularValueDecomposition sv =new SingularValueDecomposition(a) ; 
    u = sv.getU();
    v = sv.getV(); 
    s = sv.getS();
    vtranspose = v.transpose() ; // we obtain this as a result of svd 

    uarray = u.getArray();
    sarray = s.getArray(); 
    varray = vtranspose.getArray(); 
    if(semantics.maketerms.nodoc>50)
    {

        sarray_mod = new double[50][50]; 
        uarray_mod = new double[uarray.length][50];
        varray_mod = new double[50][varray.length]; 
        move(sarray,50,50,sarray_mod); 
        move(uarray,uarray.length,50,uarray_mod); 
        move(varray,50,varray.length,varray_mod); 
        e = new Matrix(uarray_mod); 
        f = new Matrix(sarray_mod);
        g = new Matrix(varray_mod);
        Matrix temp  =e.times(f); 
        result = temp.times(g);  

    }
    else 
    {
        Matrix temp = u.times(s); 
        result = temp.times(vtranspose); 
    }
    result = result.transpose(); 
    results = result.getArray() ; 

    return results ; 
Run Code Online (Sandbox Code Playgroud)

但是我们如何确定尺寸的数量?是否有方法确定系统应减少的尺寸数量以获得最佳结果?对于LSA的有效性能,我们还考虑了哪些其他参数?

Fra*_*urt 15

关于尺寸数量的选择:

1)http://en.wikipedia.org/wiki/Latent_semantic_indexing:

LSI的另一个挑战是所谓的难以确定用于执行SVD的最佳维数.作为一般规则,较少的维度允许对文本集合中包含的概念进行更广泛的比较,而更多维度允许更具体(或更相关)的概念比较.可以使用的实际维度数受集合中文档数量的限制.研究表明,大约300个维度通常会为中等大小的文档集合(数十万个文档)提供最佳结果,对于较大的文档集合(数百万个文档)可能提供400个维度.然而,最近的研究表明,根据文件集的大小和性质,50-1000维度是合适的.

在计算SVD之后检查数据中的方差量可用于确定要保留的最佳维数.可以通过在碎石图中绘制奇异值(S)来查看数据中包含的方差.一些LSI从业者选择与曲线拐点相关的维度作为要保留的维数的截止点.其他人认为必须保留一定数量的方差,数据的方差量应决定保留的适当维度.百分之七十经常被提及为应该用于选择重新计算SVD的最佳维度的数据中的方差量.



2)http://www.puffinwarellc.com/index.php/news-and-articles/articles/33-latent-semantic-analysis-tutorial.html?showall=1:

使用SVD的技巧在于确定在近似矩阵时要使用多少维或"概念".太多的维度和重要的模式被遗漏,太多,随机单词选择引起的噪音将会重新进入.SVD算法有点牵扯,但幸运的是Python有一个库函数,使其易于使用.通过在我们的LSA类中添加下面的一行方法,我们可以将矩阵分解为3个其他矩阵.U矩阵给出了我们"概念"空间上每个单词的坐标,Vt矩阵给出了我们"概念"空间中每个文档的坐标,奇异值的S矩阵给出了一个关于多少维度的线索或者我们需要包括的"概念".

def calc(self): self.U, self.S, self.Vt = svd(self.A)

为了选择要使用的正确维数,我们可以制作奇异值的平方的直方图.这描绘了每个奇异值对近似我们的矩阵的重要性.这是我们示例中的直方图.

在此输入图像描述

对于大量文档,使用的维度数量在100到500之间.在我们的小例子中,由于我们想要绘制图形,我们将使用3个维度,抛出第一个维度,并绘制第二个和第三个维度.

我们抛弃第一个维度的原因很有趣.对于文档,第一个维度与文档的长度相关.对于单词,它与在所有文档中使用该单词的次数相关.如果我们将矩阵居中,通过从每列中减去平均列值,那么我们将使用第一维.作为类比,考虑高尔夫比分.我们不想知道实际得分,我们希望在从标准杆中减去它之后知道得分.这告诉我们玩家是否制作了小鸟,转向架等.



3)Landauer,TK,Foltz,PW,Laham,D.,(1998),"潜在语义分析导论",话语过程,25,259-284:

在此输入图像描述