我有一个函数,它接受两个包含两个文本的标记/单词的数组,并给出余弦相似度值,显示两个文本之间的关系。
该函数采用数组$ tokensA(0 => house,1 => bike,2 => man)和数组$ tokensB(0 => bike,1 => house,2 => ; car)并计算作为浮点值返回的相似度。
function cosineSimilarity($tokensA, $tokensB) {
$a = $b = $c = 0;
$uniqueTokensA = $uniqueTokensB = array();
$uniqueMergedTokens = array_unique(array_merge($tokensA, $tokensB));
foreach ($tokensA as $token) $uniqueTokensA[$token] = 0;
foreach ($tokensB as $token) $uniqueTokensB[$token] = 0;
foreach ($uniqueMergedTokens as $token) {
$x = isset($uniqueTokensA[$token]) ? 1 : 0;
$y = isset($uniqueTokensB[$token]) ? 1 : 0;
$a += $x * $y;
$b += $x;
$c += $y;
}
return $b * $c != 0 ? $a / sqrt($b * $c) : 0;
}
如果我想比较75个文本,我需要进行5,625次单一比较,以便将所有文本相互比较。
是否可以使用MySQL的空间列来减少比较次数?
我不想谈论我的功能或比较文本的方法。只是减少比较次数。
MySQL的空间列
但你怎么用这个来解决我的问题?
PS:我正在寻找减少算法in this question的比较次数的方法。 Vinko Vrsalovic告诉我,我应该为空间特征打开另一个问题。
答案 0 :(得分:1)
事实上,您只有 75 * 74/2 = 2775 比较。您将每个单词与其他单词进行比较,但您不需要将word1与word2进行比较,再将word2与word1进行比较。因此,它使一半的比较更少。
答案 1 :(得分:1)
虽然R-Trees
通常可以使用任意数量的维度对数据进行索引,但MySQL
空间能力仅限于Geometry
种类型(2
维度)。
如果你的向量是2
- 维和,你可以将它们标准化,然后执行以下操作:
MBR
MBR
但是,在这种情况下,最好只是预先计算值的角度,并使用普通的B-Tree
索引对其进行索引。