Stumbleupon类型查询

时间:2010-01-05 21:42:52

标签: mysql

哇,让你的头旋转!

我即将开始一个项目,虽然我的mySql没问题,但我无法理解这个需要:

我有一个网址表。

id,url
1,http://www.url1.com
2,http://www.url2.com
3,http://www.url3.com
4,http://www.url4.com

我有一个用户表。

id,name
1,fred bloggs
2,john bloggs
3,amy bloggs

我有一张类别表。

id,name
1,science
2,tech
3,adult
4,stackoverflow

我有一个用户喜欢的类别表作为与类别唯一引用有关的数字引用。例如:

user,category
1,4
1,6
1,7
1,10
2,3
2,4
3,5
.
.
.

我有一个与每个网站地址相关的分数表。当用户访问其中一个网站并说他们喜欢它时,它就像这样存储:

url_ref,category
4,2
4,3
4,6
4,2
4,3
5,2
5,3
.
.
.

因此,基于上述数据,URL 4将按如下方式评分(按照自己的权利):2 = 2 3 = 2 6 = 1

我希望做的是根据当前用户的兴趣从超过2,000,000条记录中挑选一个随机网址。

因此,如果登录用户喜欢类别1,2,3,那么我想根据他们的兴趣订购一个得分。

如果登录用户喜欢类别2 3和6,那么总得分将为5.但是,如果当前登录用户仅类似于类别2和6,则URL得分将为3.因此订单将是在登录用户兴趣的背景下。

想想stumbleupon。

我在考虑使用一组VIEWS来帮助进行子查询。

我猜测需要查看所有2,000,000条记录,并根据网址的ID,根据当前用户的每个选定类别查看其得分。

因此我们需要知道用户ID,并从头开始将其作为常量传递给查询。

没有线索!

Chris Denman

2 个答案:

答案 0 :(得分:0)

  

我希望做的是根据当前用户的兴趣从超过2,000,000条记录中挑选一个随机网址。

这对预测建模感到尖叫,这可能是你无法在数据库中实现的。基本上,您希望根据给定兴趣(或更可能的兴趣集)/ URL组合预先计算您的分数,然后根据预先计算的值进行查询。你最有可能最好在应用程序代码中执行此操作。

由于你试图猜测用户是否喜欢或不喜欢基于你对它们的了解的链接,贝叶斯似乎是一个很好的起点(抱歉维基百科链接,但不知道你的编程语言这可能是最好的起点):Naive Bayes Classifier

修改

这里的基本想法是你不断运行预先计算过程,一旦你有足够的数据,你可以尝试将它提炼成一个你可以在你的查询中使用的简单公式。在收集更多数据时,您将继续运行预先计算过程并使用扩展结果来优化公式。如果您有建议链接的方法,那么这真的很有趣,然后找出用户是否喜欢它,因为您可以使用此反馈循环真正改进预测算法(在机器上读取)学习,特别是遗传算法,更多关于此)

答案 1 :(得分:0)

我最后这样做了:

$dbh = new NewSys::mySqlAccess("xxxxxxxxxx","xxxxxxxxxx","xxxxxxxxx","localhost");

$icat{1}='animals pets';
$icat{2}='gadget addict';
$icat{3}='games online play';
$icat{4}='painting art';
$icat{5}='graphic designer design';
$icat{6}='philosophy';
$icat{7}='strange unusual bizarre';
$icat{8}='health fitness';
$icat{9}='photography photographer';
$icat{10}='reading books';
$icat{11}='humour humor comedy comedian funny';
$icat{12}='psychology psychologist';
$icat{13}='cartoons cartoonist';
$icat{14}='internet technology';
$icat{15}='science scientist';
$icat{16}='clothing fashion';
$icat{17}='movies movie latest';
$icat{18}="\"self improvement\"";
$icat{19}='drawing art';
$icat{20}='latest band member';
$icat{21}='shop prices';
$icat{22}='recipe recipes food';
$icat{23}='mythology';
$icat{24}='holiday resorts destinations';
$icat{25}="(rude words)";
$icat{26}="www website";

$dbh->Sql("DELETE FROM precalc WHERE member = '$fdat{cred_id}'");

$dbh->Sql("SELECT * FROM prefs WHERE member = '$fdat{cred_id}'");

@chos=();
while($dbh->FetchRow()){
    $cat=$dbh->Data('category');
    $cats{$cat}='#';
    }
foreach $cat (keys %cats){
    push @chos,"\'$cat\'";
    push @strings,$icat{$cat};
    }

$sqll=join("\,",@chos);
$words=join(" ",@strings);

$dbh->Sql("select users.id,users.url,IFNULL((select sum(scoretot.scr) from scoretot where scoretot.id = users.id and scoretot.category IN \($sqll\)),0) as score from users WHERE MATCH (description,lasttweet) AGAINST ('$words' IN BOOLEAN MODE) AND IFNULL((SELECT ref FROM visited WHERE member = '$fdat{cred_id}' AND user = users.id LIMIT 1),0) = 0 ORDER BY score DESC limit 30");

    $cnt=0;

    while($dbh->FetchRow()){

        $id=$dbh->Data('id');
        $url=$dbh->Data('url');
        $score=$dbh->Data('score');
        $dbh2->Sql("INSERT INTO precalc (member,user,url,score) VALUES ('$fdat{cred_id}','$id','$url','$score')");

        $cnt++;

        }

三个月前我想出了这个答案,就是看不懂。很抱歉,我无法解释它最终是如何运作的,但它设法查询了200万个网站,并根据用户过去在其他网站上投票的历史记录选择一个。

一旦我开始工作,我就转向了另一个问题!

http://www.staggerupon.com就是这一切!

克里斯