10

我最近一直在研究潜在语义分析。我通过使用 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 的有效性能,我们还考虑了哪些其他参数?

4

1 回答 1

19

关于维数的选择:

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

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

在计算 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), '潜在语义分析导论', Discourse Processes, 25, 259-284:

在此处输入图像描述

于 2012-03-18T14:41:54.410 回答