我即将开始一个项目,虽然我的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
答案 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就是这一切!
克里斯