多列mySQL表中一行与所有行的点积


Dot product of one row against all rows in a many-column mySQL table

背景:

我有一个大约400000行的表格,看起来如下:

+---------+--------+------+-------+------+-----+--------+
|   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  |
+---------+--------+------+-------+------+-----+--------+

每个CCD_ 1表示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问题非常相似,很有帮助,但我不太明白如何应用它("garden"被称为表??)。具有多列的SQL表中的点积

在链接的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向量值是相当静态的,我会考虑预先计算它们,并将这些结果存储在一个单独的表中,供你查询。