发明内容
有鉴于此,本发明的主要目的在于提供一种自适应的视频广告投放方法,用于解决现有视频广告投放方法不能依据实际需求实时调整广告投放个数,灵活性差,无法保证用户观看广告个数平稳地变化等技术问题。
为达到上述目的,本发明的技术方案是这样实现的:
一种自适应视频广告投放方法,该方法包括:
按预设的周期T获取当前周期T内需要投放的广告投放任务,生成广告投放任务集合AdTaskSet,并将生成的AdTaskSet添加到广告任务集合列表AdTaskSetList中;
在接收到广告请求时,逐一在AdTaskSetList的每个AdTaskSet中匹配符合条件的广告,并将匹配所得的广告一次性返回给广告请求方;
检查AdTaskSetList中的广告投放完成情况,当某个AdTaskSet中的广告已经全部投放完毕时,从AdTaskSetList中移除该AdTaskSet。
进一步地,根据系统预设的一次广告请求最多允许投放的广告个数设定AdTaskSetList的中AdTaskSet的最大个数n,当AdTaskSetList列表中AdTaskSet个数达到上限值n时,需要在插入新生成的AdTaskSet之前,删除列表末尾的AdTaskSet。
进一步地,所述逐一在AdTaskSetList的每个AdTaskSet中匹配符合投放条件的广告时,在每个AdTaskSet中最多只取一个广告,匹配的过程具体为:
建立一个临时列表,在对每个AdTaskSet进行匹配时,将所述临时列表作为参数传入匹配函数,在获得一个符合条件的广告时,首先将其与临时列表中已获得的广告进行比较,如果临时列表中已经存在相同的广告,则继续匹配其它符合条件的广告,在每个AdTaskSet中最多只取一个广告;如果临时列表中不包含相同的广告,则将该广告添加到所述临时列表中,然后执行下一个AdTaskSet的匹配;在匹配完所有的AdTaskSct后所得的临时列表即包含了所有要向广告请求方反馈的广告。
进一步地,所述AdTaskSet由广告投放条件树CondTree和广告实体映射表AdEntityMap两部分组成;所述CondTree用于存储广告投放条件,AdEntityMap用于存放待投放广告的具体属性;
所述在AdTaskSet中匹配符合条件的广告时,基于CondTree所反映的广告投放条件树从AdTaskSet中查找满足广告请求的广告。
进一步地,通过独立进程广告任务集合生成模块AdTaskAssigner来实现AdTaskSet的生成、AdTaskSetList中广告投放完成情况的检查;所述AdTaskAssigner作为独立的进程在系统后台运行,每间隔一个生成周期T自动运行一次;
通过另一独立进程广告匹配引擎AdMatcher来实现广告请求的接收、广告匹配及反馈。
本发明还提供一种自适应视频广告投放装置,该装置包括:
广告任务集合生成模块AdTaskAssigner,用于按预设的周期T获取当前周期T内需要投放的广告投放任务,生成广告投放任务集合AdTaskSet,并将生成的AdTaskSet添加到广告任务集合列表AdTaskSetList中;该模块还用于检查AdTaskSetList中的广告投放完成情况,当某个AdTaskSet中的广告已经全部投放完毕时,从AdTaskSetList中移除该AdTaskSet;
广告任务集合列表模块AdTaskSetList,用于存放当前正在投放的广告任务集合;
广告匹配引擎AdMatcher,用于根据视频播放器发来的广告请求,逐一在AdTaskSetList的每个AdTaskSet中匹配符合条件的视频广告,并将匹配获得的广告一次性返回给广告请求方。
进一步地,所述AdTaskSetList中AdTaskSet的最大个数n根据系统预设的一次广告请求最多允许投放的广告个数设定;所述AdTaskAssigner还用于在插入AdTaskSet时判断所述AdTaskSetList的AdTaskSet个数是否达到最大值n,当达到时,则需在插入新生成的AdTaskSet之前删除列表末尾的AdTaskSet。
进一步地,所述AdMatcher逐一在AdTaskSetList的每个AdTaskSet中匹配符合条件的广告时,首先建立一个临时列表,在对每个AdTaskSet进行匹配时,将所述临时列表作为参数传入匹配函数,在获得一个符合条件的广告时,首先将其与临时列表中已获得的广告进行比较,如果临时列表中已经存在相同的广告,则继续匹配其它符合条件的广告,在每个AdTaskSet中最多只取一个广告;如果临时列表中不包含相同的广告,则将该广告添加到所述临时列表中,然后执行下一个AdTaskSet的匹配;在匹配完所有的AdTaskSet后,将所述临时列表反馈给广告请求方。
进一步地,所述AdTaskSet由广告投放条件树CondTree和广告实体映射表AdEntityMap两部分组成;所述CondTree用于存储广告投放条件,AdEntityMap用于存放待投放广告的具体属性;所述AdMatcher基于CondTree所反映的广告投放条件树从AdTaskSet中查找满足广告请求的广告。
进一步地,所述AdTaskAssigner和AdMatcher为两个相互独立的进程,所述AdTaskAssigner作为独立的进程在系统后台运行,每间隔一个生成周期T自动运行一次。
本发明将广告任务分配进程和广告匹配进程互相独立,并利用缓冲池机制,使得广告系统能够根据当前广告投放进程自动调整用户看到的前贴广告个数,整个调整过程完全由系统来实现,无需任何人工估算和对系统的人工操作,用户观看到的广告个数保持平稳,且调整迅速、灵活、准确性高。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚明白,以下举实施例并参照附图,对本发明进一步详细说明。
图1为本发明实施例提供的用于实现本发明提出的自适应的视频广告投放方法的系统结构原理图,该系统主要包括:自适应的视频广告投放装置、广告数据库AdDatabase、视频播放器VideoPlayer;自适应的视频广告投放装置进一步包括:广告任务集合生成模块AdTaskAssigner、广告任务集合列表模块AdTaskSetList、广告匹配引擎AdMatcher。
广告数据库AdDatabase:用于存放广告投放任务信息,以及广告属性;
所述的视频广告投放任务信息指依据广告商的要求定制的广告投放时间、广告投放量、广告投放条件、待投放的广告标识等信息;所述的广告属性指广告本身的一些信息,例如:广告标识、广告素材存放的URL、广告素材的播放时长、曝光监测地址、点击跳转地址等;
广告任务集合列表模块AdTaskSetList:用于存放当前正在投放的广告任务集合;
本发明优选实施例中,配置有一个广告任务集合生成周期参数T,用于控制由AdTaskAssigner生成广告任务集合的时间间隔;例如,当广告任务集合生成周期T设置为1分钟时,AdTaskSet1表示当前这一分钟的广告投放任务集合,后面的AdTaskSeti(i=2,3,...n)依次表示i-1分钟前未完成的广告投放任务集合。
广告任务集合生成模块AdTaskAssigner:用于周期性地从广告数据库获取当前广告任务集合生成周期内需要投放的广告投放任务,生成广告投放任务集合,并将所生成的广告投放任务集合添加到AdTaskSetList的列表中;以及负责从AdTaskSetList的列表中删除已经投放完毕的AdTaskSet;
优选地,AdTaskAssigner设计为一个定时任务,系统启动后将其作为独立的进程在系统后台运行,每间隔一个生成周期T自动运行一次。
AdTaskAssigner的任务之一是:定时从AdDatabase中取得当前广告任务集合生成周期T内的所有广告投放任务,将这一批任务组织成为一个广告任务集合即一个AdTaskSet,再将生成的AdTaskSet插入到AdTaskSetList的最前端,原来AdTaskSetList列表中的AdTaskSet则依次后移。
优选地,为了防止在广告可投放量严重不足的情况下,让用户看到过多的广告,可预先设置AdTaskSetList中AdTaskSet的最大个数n,即设定一次广告请求最多允许投放的广告个数,当列表中元素个数达到系统设置的上限值n后,如果继续在前面插入AdTaskSet,则列表末尾的元素会被自动丢弃。
AdTaskAssigner的任务之二是:检查AdTaskSetList中的广告投放完成情况,如果某个AdTaskSet中的广告已经全部投放完毕,则该AdTaskSet就会被从AdTaskSetList中移除;
广告匹配引擎AdMatcher:用于根据视频播放器VideoPlayer发来的广告请求,逐一在AdTaskSetList的每个AdTaskSet中匹配符合条件的视频广告,并将匹配获得的广告一次性返回给VideoPlayer;
优选地,从AdTaskSetList中获取广告的方法可以为:依次从各个AdTaskSet中查找广告,每个AdTaskSet中最多只取一个广告,且返回的多个广告不允许相同,即不能连续2次重复播放同一个广告。
视频播放器VideoPlayer:用于向AdMatcher发送广告请求,接收AdMatcher返回的广告,依次向用户播放广告内容;
本发明不限定视频播放器的类型以及视频广告的格式类型,当用户打开某个视频播放页观看视频前,VideoPlayer会自动向AdMatcher发送广告请求,得到AdMatcher的返回的广告后,依次向用户播放广告内容。
基于图1所示的实现自适应的视频广告投放方法的系统,从VideoPlayer发起广告请求到获得反馈结果的过程如下:
步骤1、VideoPlayer向AdMather发送广告请求;
所述广告请求中应当包含当前视频的id、视频所属的分类和二级分类、当前浏览用户的ip和cookie、关键字等信息。
步骤2、AdMatcher从AdTaskSetList中的第一个AdTaskSet开始到最后一个AdTaskSet,依次判断每个AdTaskSet中是否有满足本次广告请求的广告,如果有则AdMatcher从对应的AdTaskSet中获取一个满足条件的广告,最后形成一个广告反馈列表,将广告反馈列表返回给播放器进行播放;
优选地,针对一次广告请求,在开始匹配时AdMatcher都会新建一个临时列表,AdMatcher到每一个AdTaskSet中查找广告,都会把找到的符合投放条件的广告放到这个列表中,当开始对下一个AdTaskSet进行查找时,会将这个临时列表作为参数传入查找函数,AdMatchcr在AdTaskSet的CondTree树中遍历时,每找到一个广告后,都会拿这个广告和临时列表中已经取得的所有广告进行比对,如果临时列表中已经包括了当前广告,则AdMatcher不会添加这个广告,而是继续在当前AdTaskSet中查找其它满足条件的广告,直到找到合适的广告,才将这个广告添加到上述临时列表中,如果遍历完整个CondTree都没找到,则不必向上述临时列表中添加广告。在查找完所有的AdTaskSet后,AdMatcher将所述临时列表做为广告反馈列表返回给播放器。
例如:AdMatcher从AdTaskSetList中的AdTaskSet1中查找可满足本次请求的广告,若AdTaskSet1中有符合广告请求所给定条件的广告,则AdMatcher从AdTaskSet 1中取得一个广告,作为第一前贴广告;然后AdMatcher依次从AdTaskSetList中的AdTaskSet2、AdTaskSet3、...、AdTaskSetn中查找可满足本次请求的广告,若对应的AdTaskSet中有符合广告请求所给定条件的广告,则AdMatcher从对应的AdTaskSet中取得第二个、第三个、...、第n个广告,作为第二前贴广告、第三前贴广告、...、第n前贴广告。最后,AdMatcher将前面找到的所有可投放的前贴广告组合起来(总个数可能会小于n),一次性返回给播放器进行播放。
步骤3、VideoPlayer接收到AdMatcher反馈的前贴广告播放列表后,按顺序依次播放列表中的广告。
可以看出,AdTaskSetList所起的作用为AdTaskAssigner和AdMatcher之间的一个缓冲池。当广告待投放量大、可投放量不足的时候,当前周期T的投放任务集合AdTaskSet1就无法完成,等到下一周期T后,随着新的AdTaskSet的插入,老的AdTaskSet1就成为AdTaskSet2,AdTaskSetList中的AdTaskSet个数就会自动增加,用户看到的前贴广告个数也随之自动增加;反之,当广告待投放量变小后,AdTaskSetList中的AdTaskSet个数就会自动减少,用户看到的前贴广告个数也随之自动减少。用户如果看到多个广告,那么他看到的第一个广告可能来自于当前周期T内的投放任务,第二个广告可能来自于之前的某个周期T内未投放完成的任务,其余可依次类推。用户看到的前贴广告个数n的取值范围为:n∈[0,N],其中N为AdTaskSetList中的AdTaskSet最大个数,对AdTaskSetList中的AdTaskSet个数进行限制是为了避免广告可投放容量严重不足时,AdTaskSetList中的AdTaskSet个数无限制增长,导致用户没完没了地看广告。
通过上述方法实现了广告个数根据当前投放进度自动调整,无需人工进行干预。
以下结合附图对本发明一优选实施例提供的AdTaskSet的组成结构进行详细说明:
AdTaskSet为广告投放系统在设定周期T内生成的广告投放任务的集合,它由AdTaskAssigner根据AdDatabase中的广告数据定时创建。AdTaskSet由CondTree(广告投放条件树)和AdEntityMap(广告实体映射表,为HashMap类型)两部分组成,图2为CondTree的结构示意图,CondTree是一个用于存储广告投放条件的树型数据结构,AdMatcher正是基于CondTree所反映的广告投放条件树从AdTaskSet中查找可满足广告请求的广告的。
CondTree树形结构的描述如下:
(1)根节点c0为AdMatcher进行广告匹配时的初始访问节点;
(2)每个叶子节点,例如c21、c22、c23下的子节点,为一个待投放的广告ID的列表,一个列表中的所有广告ID具有相同的投放条件;
(3)根与叶子之间的中间层的节点,如c11、c21、c12、c25等,对应于不同维度的广告投放条件,中间层的层数等于广告投放条件的维度,层次越高表示这个维度的权重越高,投放的优先级越高;在同一个层次内部,越靠左边的节点权重越高,投放优先级越高。投放条件的维度,可以解释为投放条件的分类,比如第一维度为客户级别维度,客户的级别不同,他们的广告投放的先后顺序也不同;第二维度为广告定向投放的方式:如视频组定向、分类定向、关键字定向等,如视频组定投的广告要优先于分类定投的广告。
AdEntityMap用于存放待投放的广告的具体属性,其通过广告ID与叶子节点中广告ID列表中的广告ID对应,其结构用Java语言可定义为:HashMap<Integer,AdEntity>,HashMap中的key是整形数,表示广告ID,value是广告实体AdEntity类型的对象,用于表示一个广告的具体属性。AdEntity对象的结构如图3所示,其中“广告ID”是一个广告的唯一标识,它与图2中的CondTree树中叶子节点中的ID相对应;当前周期内剩余投放次数”为广告当前周期要投放的总次数减去当前周期内已经完成的投放次数之差。一个AdEntity被创建并初始化的时候,其“当前周期内剩余投放次数”和“广告当前周期要投放的总次数”相等,每完成一次投放,则“当前周期内剩余投放次数”自动减一,当前周期应投放的总次数则由AdTaskAssigner在相应的AdTaskSet生成周期T执行时计算出来。首先,假设AdTaskSet生成周期T为1分钟,一个小时之内的每分钟广告可投放量是均匀分布的,下面的公式可计算出一个广告在当前分钟应投放的次数:
Ti=(S-Sok)*rate[i])/60/SN。
其中,Ti表示广告在当前小时每分钟要投放的次数;S表示广告预设的要投放的总次数;Sok表示当日已经投放完毕的总次数,该数据由广告系统根据相关日志汇总而来;rate[i]表示当前小时的广告可投放量占剩余的要投放广告的全部小时的广告可投放量的比例;SN表示用于广告投放的服务器数量,次数会被均分到每台服务器上。
rate[i]=r[i]/(r[i ]+r[i+1]+r[i+2]+...+r[m])
其中r是一个常量数组,存放的是一天24个小时中每小时的广告容量的比例,r[i]表示第i小时的比值,m表示广告投放结束的小时。r数组具体值如下:{530,352,263,207,168,144,125,132,211,303,443,461,537,617,671,694,681,627,610,480,500,500,450,300}
其中各个数字的大小反映出其所对应小时的广告可投放量大小,一般来说每天各个小时之间的广告可投放容量比值是相对固定的,所以此处是一组常数。
以下结合附图4对本发明如何通过AdTaskAssigner来实现广告投放任务的定时分配进行详细说明,具体步骤如下:
步骤401、在当前定时周期T到时,创建一个只含根节点的CondTree;
步骤402、从数据库取出待投放的广告列表adList;
步骤403、根据CondTree定义的规则依次将广告列表adList中的广告ID加入到CondTree中,完成CondTree的构造;
步骤404、将adList中的所有广告属性封装成AdEntity,并将AdEntity装入AdEntityMap中;
步骤405、将CondTree和AdEntityMap封装为一个AdTaskSet;
步骤406、将AdTaskSetList中的元素顺次向右平移一位,如果末尾元素超出最大长度,则丢弃末尾元素;
步骤407、将新创建的AdTaskSet加入到AdTaskSetList的最前端;
通过上述描述可知,本发明中AdTaskAssigner的广告任务分配进程和AdMatcher的广告匹配进程互相独立,这种异步并行的工作模式提高了广告的投放效率。
以下以实际应用中的实例来说明本发明提供的自适应的视频广告投放方法的实现过程,该实施例中,某视频网站的前贴广告投放要求为:
(1)最多允许前贴广告个数为:5个;
(2)广告客户根据重要性划分为1~7共7个等级,数字越小级别越高,越优先投放;
(3)定向投放条件包括:视频组定投、用户定投、城市定投、关键字定投、分类定投等。
首先,需要在后台设置一次广告请求最多允许投放的广告个数,即广告缓冲池AdTaskSetList的容量,然后,设置要投放的广告相关属性,包括AdEntity中的相关属性,以及所使用的定向投放方式和内容,比如定投方式为:分类定投,定投内容为:电视剧分类。
开始广告投放后,AdTaskAssigner按周期T定时产生新的投放任务AdTaskSet,并将所生成的AdTaskSet插入到AdTaskSetList中,AdTaskSetList相当于一个缓冲池,其中的AdTaskSet个数会随着当前广告投放任务的完成进度而不断波动,理论波动区间为[0,5],而其实际波动曲线类似于图6中的情况,用户看到的前贴广告个数总是以1为步长,均匀变化的,如:2->2->3->2->3,而不会出现跳跃,如:1->3->0->2->0。
某用户打开某个内嵌VideoPlayer的视频播放页播放视频时,触发一次前贴广告请求,然后AdMatcher接受到该请求,到缓冲池AdTaskSetList中查找广告,此时AdTaskSetList中有2个AdTaskSet,分别表示当前分钟的投放任务集合,和上一分钟未投放完成的任务集合。AdMatcher先到AdTaskSet1中查找第一前贴广告,找到一个广告A1,然后再到AdTaskSet2中查找第二前贴,找到一个广告A2,最后将A1和A2的内容按照与播放器之间的协议格式返回,然后播放器根据得到的内容依次播放广告A1和A2。
为了说明本发明效果,以图5和图6对照说明采用现有技术中人工调整方法和本发明提供的自适应的视频广告投放方法在广告投放效果上的区别,两个附图的横坐标都为用户请求广告的次数序号,纵坐标都为本次请求返回的广告个数。图5中,由于人工无法准确预估需要投放的前贴数,只能不断进行人工调整前贴个数,从而导致用户观看到的广告个数波动非常剧烈,比如第7次广告请求时,看到了3个广告,第8、9次只看到1个,而第10次又一下看到4个,继而增加到5个之多,用户体验非常糟糕。图6的广告个数则波动非常平稳,两个相邻的广告请求之间返回的广告个数差值不超过1,用户看到的广告个数一直维持在2到3之间,基本处于可以用户可以接受的范围内。可见通过该本发明提供的方法,用户看到的广告个数能够比较平稳地波动,原因就在于本发明采用AdTaskSetList作为缓冲池,当某分钟出现广告容量不足的时候,下一分钟AdTaskSetList中的AdTaskSet个数就会增加一个,那么前贴广告个数也会立即增加上去,而不是等到人工检查出容量不足后,再去匆忙调整前贴广告个数。当投放的前贴个数增加之后,AdTaskSetList中原来积压的AdTaskSet也会更快地消耗掉,那么前贴个数又会自动减少,正是由于有了这个缓冲池,广告系统就能够非常灵敏地感知当前容量是否足够,迅速作出增加或减少前贴个数的调整。相比人工调整的方式来说,本发明大大提高了用户体验。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。