什么是向量空间?

时间:2015-02-23 00:01:23

标签: java information-retrieval term word-frequency

  1. 此代码中的稀疏向量是什么?

    public **SparseVector** normalizeVector(SparseVector vector) {
         IntArrayList indexes = new IntArrayList(vector.cardinality());
         DoubleArrayList dbls = new DoubleArrayList(vector.cardinality());
        double norm = vector.getEuclidNorm();
        vector.getNonZeros(indexes, dbls);
         }
    

1 个答案:

答案 0 :(得分:0)

问题1 很简单:sparse vector的行为与法线向量相同,但当向量包含大量零时,空间效率更高。对于大量的推文,您可能会遇到几千个术语(比方说10k)。如果您将推文的术语频率存储在

  • 标准向量,每个可能的术语需要1个int;因此,每条推文10k字。在正面,使用标准向量,术语 i 的频率将始终显示在 i 的位置。
  • 稀疏向量,每个实际项需要1个int。每个字平均5个字符,30x5 = 150个字符;因此,推文的实际条款通常少于30个。稀疏向量将索引值存储在实际值旁边,并且从中可以根据需要重新构造等效标准向量的部分。您将需要2x 实际数量整数来存储它。对于这种情况,这意味着您只使用存储的1/333和标准向量。

因此,带有术语7,4,7和8的推文将导致稀疏矢量

{{4, 1}, {7, 2}, {8, 1}}; // internal representation, in index-value notation

转换为等效的标准向量:

{0, 0, 0, 0, 1, 0, 0, 2, 1} // assuming only 9 total terms

您的代码会在收到的每条推文中存储权重向量;其中单词作为字符串数组传入。

第一个大块计算并更新字频率(使用对象属性tb以获取字根(如果需要),并uniqWords存储频率,因为添加了更多推文;以及{{{ 1}}跟踪位置。)

第二个块根据经典的TF-IDF公​​式迭代推文中的每个术语。它需要positionMap属性用于在添加推文时保留IDF。由于idfMap是动态构建的,因此输出向量取决于处理推文的顺序。如果不改变程序流程,就无法解决这个问题。

您在问题2 中显示的公式无法嵌入到第二个区块中,因为在处理完所有推文之前, Tt 是未知的;根据公式,输出向量不应该依赖于推文处理的顺序。但是在你现在的代码中,无论你放在第二个块中,处理顺序都会产生不同的输出向量,因为在新的推文中会发现并遇到新的术语。