背景:
我有一个大约 400,000 行的表,如下所示:
+---------+--------+------+-------+------+-----+--------+
| ID | WORD | COL0 | COL1 | COL2 | ... | COL500 |
+---------|--------+------+-------+------+-----+--------+
| 0 | DOG | -0.73| 0.77 | 0.15 | | -0.55 |
| 1 | CAT | 0.41 | -0.57 | 0.61 | | 0.00 |
| 2 | HOUSE | 0.40 | 0.32 | -0.23| | 0.52 |
| ... | | | | | | |
| 400000 | LOVE | 0.51 | 0.59 | 0.01 | | -0.10 |
+---------+--------+------+-------+------+-----+--------+
每个 col#
代表一个 500 dim 向量的维度。
问题:
给定一个特定的 WORD
值(它们是唯一的),我想根据点积找到与它最相似的 100 个 WORD
(所以相同的 WORD
向量的点积为 1)。所以对于 WORD
'CAR' 我可能会得到:
+--------+------+
| WORD | DOT |
+--------+------+
| CAR | 1 |
| TRUCK | 0.89 |
| SEDAN | 0.86 |
| VEHICLE| 0.81 |
| ... | ... |
| BIKE | 0.62 |
+--------+------+
因此(重申一下)我需要获取“CAR”与所有其他单词的点积并将其降序排序,并将其限制为 100 个结果。
可能的解决方案:
这个 SO 问题非常相似并且很有帮助,但我没有正确理解如何应用它(“花园”被称为表格??)。 Dot product in an SQL table with many columns
最佳答案
在链接的 SO 答案中,'garden' 是一个表:它是表 t
,但别名为 garden
,但仅限于一行(用于带有单词“GARDEN”的行)。
对于您的特定问题,您需要在查询末尾附加“ORDER BY DOT
DESC LIMIT 100”。
也许重命名会更清楚?
select allwords.*,
(allwords.col0 * word_of_interest.col0 +
allwords.col1 * word_of_interest.col1 + . . .
allwords.col500 * word_of_interest.col500
) as DOT
from allwords
cross join
(select allwords.*
from allwords
where `WORD` = '$THE_WORD_I_WANT_EG_CAR'
) as `word_of_interest`
order by `DOT` DESC LIMIT 100;
正如其他答案所说,我预计这会相当慢。如果您的 COLn 向量值相当静态,我会考虑预先计算它们并将这些结果存储在您要查询的单独表中。
关于php - 一行与多列 mySQL 表中所有行的点积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25834726/