Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 多列mySQL表中一行与所有行的点积 背景:_Php_Mysql_Sql - Fatal编程技术网

Php 多列mySQL表中一行与所有行的点积 背景:

Php 多列mySQL表中一行与所有行的点积 背景:,php,mysql,sql,Php,Mysql,Sql,我有一个约400000行的表格,如下所示: +---------+--------+------+-------+------+-----+--------+ | ID | WORD | COL0 | COL1 | COL2 | ... | COL500 | +---------|--------+------+-------+------+-----+--------+ | 0 | DOG | -0.73| 0.77 | 0.15 | | -0.55

我有一个约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  |
+---------+--------+------+-------+------+-----+--------+
每个
col#
表示一个500维向量的维数


问题: 给定一个特定的
WORD
值(它们是唯一的),我想根据点积找到与之最相似的100个
WORD
s(因此相同的
WORD
向量的点积为1)。所以对于
这个词
我可能会得到:

+--------+------+
|  WORD  |  DOT |
+--------+------+
| CAR    |  1   |
| TRUCK  | 0.89 |
| SEDAN  | 0.86 |
| VEHICLE| 0.81 |
|  ...   |  ... |
| BIKE   | 0.62 |
+--------+------+
所以(重申)我需要得到“CAR”与其他单词的点积,并将其降序排序,并将其限制为100个结果


可能的解决办法: 这个问题非常相似,也很有帮助,但我不太明白如何应用它(“花园”被称为桌子??)。

在链接的SO答案中,“garden”是一个表:它是表
t
,但别名为
garden
,但仅限于一行(带单词“garden”的行)

对于您的特定问题,您需要在查询的末尾附加“orderby
DOT
desclimit100”

也许改名会更清楚

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;

正如另一个答案所说,我预计这将是相当缓慢的。如果你的CORN向量值是相当静态的,我会考虑预先计算它们,并将这些结果存储在一个你要查询的单独表中。

你能像其他帖子一样在你的问题中添加数据吗?我不知道他是怎么做的,对不起:请读一下如何问一个好问题。打印这样的表格有很多技巧和窍门。。这只是一些相关rowsAh的结果,我以为他在使用某种脚本。我做了一些桌子,试着把它整理一下。干杯谢谢:)我的帖子有用吗?还有40万行都有一个不同的单词,500个cols代表这个单词吗?哦,我明白了-非常感谢!改名帮助很大。关于预计算:COLn行是完全静态的,但是,
我想要的单词可以是数据库中的任何单词,所以记住这一点,我必须将每一行的点积与其他399999行的每一行的点积=~16000000000行,对吗?等等,我明白了!你的意思是我预先计算并存储与每行最相似的100个单词的ID,对吗?天才。非常感谢你的帮助!:)