java - java中基于标 checkout 现次数的加权搜索算法

标签 java sql algorithm search recommendation-engine

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

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

因此与用户关联的标签将如下所示( 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/

相关文章:

java - 变量声明错误?

php - Postgres Regex 未按预期工作

c++ - 3D几何引擎

algorithm - 您将如何验证两个图是否相同?

javascript - 使用递归在 JavaScript 中进行 BFS

java - 检查参数化谓词之间的相等性

Java是抽象类吗?

java - 从另一个类访问非静态变量

sql - 为什么我的数据不过滤日期.. smalldatetime

php - 使用相同 id 从 3 个表中选择行的更快方法#