此代码中的稀疏向量是什么?
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);
}
答案 0 :(得分:0)
问题1 很简单:sparse vector的行为与法线向量相同,但当向量包含大量零时,空间效率更高。对于大量的推文,您可能会遇到几千个术语(比方说10k)。如果您将推文的术语频率存储在
中因此,带有术语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 是未知的;根据公式,输出向量不应该依赖于推文处理的顺序。但是在你现在的代码中,无论你放在第二个块中,处理顺序都会产生不同的输出向量,因为在新的推文中会发现并遇到新的术语。