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

时间:2012-03-06 10:58:33

标签: 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 ; 

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

1 个答案:

答案 0 :(得分:14)

关于维数的选择:

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)

     

为了   选择合适的尺寸数量,我们可以制作直方图   奇异值的平方。这描绘了每个人的重要性   奇异值有助于逼近矩阵。这里是   在我们的例子中直方图。

enter image description here

  

对于大型文档集合,使用的维度数量为   在100到500范围内。在我们的小例子中,因为我们想要绘制图形   它,我们将使用3个维度,抛出第一个维度和图表   第二和第三维。

     

我们抛弃第一个维度的原因很有趣。对于   文件,第一个维度与长度相关   文献。对于单词,它与单词的次数相关   已被用于所有文件。如果我们将矩阵集中在一起   从每列中减去平均列值,然后我们会   使用第一个维度。作为类比,考虑高尔夫比分。我们没有   想知道实际分数,我们想知道之后的分数   从标准杆中减去它。这告诉我们玩家是否做了   小鸟,转向架等。



3)Landauer,T.K.,Foltz,P.W.,Laham,D。,(1998),“潜在语义简介” 分析',话语过程,25,259-284:

enter image description here