我正在尝试构建一种算法来返回与用户具有最高相关性的图像列表。
因此,用户将拥有一个标签列表以及每个标签的出现次数。
因此与用户关联的标签将如下所示( map ):
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 并搜索所有这些图像,然后从这个结果列表中搜索 map 中的下一个单词,在本例中为 trees 然后交换 trees 对于 nature,因为它具有相同的出现次数,因此返回排名图像列表。
我在 java 中使用 MySQL 来存储 userTags & occurrences 和 images & tags。
我觉得有更好的方法可以根据这些信息返回排名列表。
我的做法是根据每个图像的标签和相应的值给每个图像打分。
所以图像 1 将是摄影、动物、自然、雪的分数 (4+0+3+2) = 8
和图像 2 摄影、树木、湖泊、天空(4+3+2+2) = 11
和图像 3 天空、动物、黑暗、月亮 (2+0+0+0) = 2
因此,基于此分数,排名列表返回的是图片 2、图片 1、图片 3
最佳答案
这可能正是我们拥有 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');
现在创建一个总结这些的 View (这可以在 sql 中完成,但我发现 View 可以帮助早期阶段的理解)。
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
- 此实现根据用户标记的频率进一步对用户标记进行加权 使用它们——不是一件不合理的事情
** 它还计算我已经标记的图像 - 我将把它作为练习留给用户以排除这些图像
关于java - java中基于标 checkout 现次数的加权搜索算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43032199/