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

标签 php mysql sql

背景:

我有一个大约 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/

相关文章:

php - 代码使用的执行时间和内存

php - 用类查找元素并在php字符串中添加一个

mysql - 两个表之间的简单连接

php - 通过将图像保存在数据库中来减少 http 请求?

mysql - 高效的数据库设计——避免大量行

sql - 对于某些 groupid 列的每个唯一值,如何获取具有最后 3 个日期的行?

php - 使用 post 和 JWS 发送 JSON 数据

php - ZF2 : Return JSON only for Ajax Call

javascript - 从数据库重新加载内容 onclick

sql - SQL 或 PostgreSQL 规范中的哪些内容解释了数组与基元的比较?