基于 java 中标签出现的加权搜索算法

Weighted Search algoritim based on tag occurrences in java

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

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

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

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,然后互换 trees for nature 因为它有相同的出现次数,因此 return 列出了排名图像。

我在 java 中使用 MySQL 来存储 userTags & occurrences 和图像 & tags。

我觉得有更好的方法 return 基于此信息的排名列表。

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

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


所以排名列表 return 将是图像 2、图像 1、图像 3 基于此分数

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

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

备注

stop asking question like this because you will be blocked like me from asking question for 6 month you should ask coding question not conception

这可能正是我们没有sql 数据库的原因,但当然可以在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基于上述算法的最流行的东西*像这样:

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
  • 此实现根据用户标记的频率进一步对用户标记进行加权 使用它们 - 不是一件不合理的事情

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