【问题标题】:Weighted Search algoritim based on tag occurrences in javajava中基于标签出现的加权搜索算法
【发布时间】:2017-03-26 17:33:42
【问题描述】:

我正在尝试构建一种算法来返回与用户相关性最高的图像列表。

因此,用户将拥有一个标签列表以及每个标签的出现次数。

因此与用户关联的标签将如下所示(地图):

Photography ->4
trees       ->3
nature      ->3
snow        ->2
lake        ->2
sky         ->2

在我的数据库中,我有一个带有标签的图像列表。 一个例子是:

**Image1**: photography, animals, nature, snow
**Image2**: photography, trees, lake, sky
**Image3**: sky, animals, dark, moon 

所以使用标签图,我想在数据库中搜索相似度最高的图像,并为出现次数较多的图像赋予权重。

因此,带有标签的图片:photography, trees, nature 会比带有标签的图片更重要:nature, sky, moon

我尝试获取出现次数最多的事件,例如。 photography 并搜索所有这些图像,然后从这个结果列表中,从地图中搜索下一个词,在本例中为 trees,然后交换 trees 对于 nature,因为它具有相同的出现次数,因此返回一个排名图像列表。

我正在使用 java 并使用 MySQL 来存储 userTags 和出现次数以及图像和标签。

我觉得有更好的方法可以根据这些信息返回排名列表。

我这样做的方法是根据每个图像的标签和相应的值给每个图像打分。

所以图片 1 将是摄影、动物、自然、雪的得分 (4+0+3+2) = 8
和图像 2 摄影,树木,湖泊,天空(4+3+2+2)= 11
和图像 3 天空,动物,黑暗,月亮 (2+0+0+0) = 2


因此,根据这个分数,排名列表返回图像 2、图像 1、图像 3

【问题讨论】:

标签: java sql algorithm search recommendation-engine


【解决方案1】:

这可能正是我们有 nosql 数据库的原因,但它当然可以在 sql 中完成。 为每个标签创建一个实体(注意,我从示例集开始,但放弃了尝试全部表示):

 create table tagged(WHO varchar2(20),tag VARCHAR2(20),what varchar2(20));
/* WHAT I tagged */
INSERT INTO TAGGED VALUES('USER','PHOTOGRAPHY','IMAGEX');
INSERT INTO TAGGED VALUES('USER','PHOTOGRAPHY','IMAGEY');
INSERT INTO TAGGED VALUES('USER','PHOTOGRAPHY','IMAGEZ');
INSERT INTO TAGGED VALUES('USER','PHOTOGRAPHY','IMAGEA');
INSERT INTO TAGGED VALUES('USER','TREES','IMAGEB');
INSERT INTO TAGGED VALUES('USER','TREES','IMAGEC');
INSERT INTO TAGGED VALUES('USER','TREES','IMAGED');
INSERT INTO TAGGED VALUES('USER','NATURE','IMAGEE');
INSERT INTO TAGGED VALUES('USER','NATURE','IMAGEF');
INSERT INTO TAGGED VALUES('USER','NATURE','IMAGEG');
/* a subset of interest */
insert into tagged VALUES('JOE','PHOTOGRAPHY','IMAGE1');
insert into tagged VALUES('FRED','ANIMALS','IMAGE1');
insert into tagged VALUES('WILMA','TREES','IMAGE1');
insert into tagged VALUES('WILMA','NATURE','IMAGE1');

现在创建一个总结这些的视图(这可以在 sql 中完成,但我发现视图可以帮助早期理解)。

create view popularity as select tag,what,count(*) popularity from tagged group by tag,what;

现在我们可以根据上述算法*选择最受欢迎的东西,如下所示:

select  p.what,sum(p.popularity) 
from popularity p,tagged u
where u.who='USER'
and u.tag=p.tag
group by p.what 
order by 2 desc;
IMAGE1  10
IMAGEA  4
IMAGEX  4
IMAGEZ  4
IMAGEY  4
IMAGEF  3
IMAGED  3
IMAGEE  3
IMAGEC  3
IMAGEB  3
IMAGEG  3
  • 此实现进一步根据用户标签的频率对其进行加权 使用它们 - 不是不合理的事情

** 它还计算我已经标记的图像 - 我将把它留作练习,让用户排除这些图像

【讨论】:

    【解决方案2】:

    如果您使用用户、标签和图像进行连接,您可以根据用户端标签的值对结果进行排序。

    user   photography   4          **image1***
    user   photography   4          **image2***
    user   trees               3    ** Image2 ** 
    user   nature             3     **image1***
    

    注意

    停止问这样的问题,因为你会像我一样被阻止在 6 个月内提问,你应该问编码问题而不是概念

    【讨论】:

    • 如果您没有输入您所做的事情,请尝试查找执行此操作的查询,也许我们可以帮助您
    • 感谢您的回复,我已更新问题以包含我当前的方法。
    • 你能把表结构和你试过的查询放上去吗
    猜你喜欢
    • 2010-12-06
    • 1970-01-01
    • 2021-08-27
    • 2011-11-20
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多