基于 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
- 此实现根据用户标记的频率进一步对用户标记进行加权
使用它们 - 不是一件不合理的事情
** 它还计算我已经标记的图像 - 我将把它作为练习留给用户排除这些
我正在尝试构建一种算法,以 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
- 此实现根据用户标记的频率进一步对用户标记进行加权 使用它们 - 不是一件不合理的事情
** 它还计算我已经标记的图像 - 我将把它作为练习留给用户排除这些