@Wishes
2015-03-22T07:53:42.000000Z
字数 1586
阅读 1038
项目经验:个性化微博推荐网站
项目描述
:这是一个搜索微博的网站,用户可以搜索一个话题,系统从500万条微博(500万条微博的语料库已经获得)中搜索到与话题相关的最新的100条结果并返回给用户(普通搜索结果),系统同时还需要从用户1个月内发的微博中提取用户所感兴趣的50个关键词组成用户兴趣模型,并返回100条与用户兴趣相关,与话题相关的最新的100条微博结果(个性化搜索结果)。该网站是给本校研究生学长做的毕业设计。
关键词
:Lucene Bootstrap 向量空间模型 倒排索引 高并发 检索算法 MVC模式
项目人数/时间
:2/2014.12-2015.2
项目奖金
:5000
项目需求
:
- 1:系统需要给用户与话题相关的100条结果和与用户兴趣相关的并同时与话题相关的100条结果(两种结果对比才能体现个性化搜索的优势),系统需要建立用户兴趣模型。
- 2:系统要求不使用分布式(没足够的机器),查询速度在可接受范围之内(20秒内)。
- 3:系统的模块包括登陆,注册,邮箱验证,密码加密,构建和维护用户兴趣模型,显示用户信息,系统初始化,检索,微博预处理等。
项目设计
:
- 算法设计:推荐算法,采用信息检索中的向量空间模型来模拟微博分词的词项,使用TF-IDF计算向量的词项得分,最后用余弦算法来匹配微博和话题。先对用户输入的话题分词得到的词项构成一个向量,然后对微博进行分词得到向量,将两个向量做余弦计算得到微博的匹配分数。
- 框架设计:网站使用MVC模式,在项目开始做之前,对项目分好层,有前台,action层,service层,dao层,sql语句执行层,数据库结果转换对象层,JavaBean层和util层(主要放初始化类和邮件类等)。每层大致需要些什么类都事先创建好,不填内容。网站前台使用Bootstrap制作比较漂亮的界面。
具体实现
:
- 核心模块1:初始化模块。500万条微博存在.sql文件中。系统初始化的时候读入.sql文件,去除不必要的信息,并将微博写入数据库,同时将微博进行分词,用Lucene 创建倒排索引。每次读入2万条微博处理,总共创建250个倒排索引文件。采用多线程来完成该任务,通过多次测试,完全处理初始化一次大约需要380s,而使用数据库命令source一次需要至少20分钟。
- 核心模块2:检索模块。
普通结果检索:用户输入话题,对话题分词并处理,然后就是对每个词搜索倒排文件,将结果(微博ID)做or操作,并按照时间排序取前1000条。经过测试,这么做是不能在20s内完成一次搜索的。通过分析得知,结果的时间其实是最重要的(而不是匹配分数),总不能推荐2011年的微博吧(没任何意义)。最后采用一种递归搜索算法:对每个倒排文件,搜索所有的话题分词,并做or操作,然后按照时间排序取前1000条结果(这些都由Lucene框架完成),得到的250个1000条结果两两合并,然后又对时间排序得到最新的1000条结果,依次递归得到1000条结果,取前100条返回。这是全系统的核心耗时点,最后经过多次测试,根据话题长度不同,检索的时间为3-6s,符合需求。
个性化结果检索:对普通结果检索得到的1000条微博,转化成向量,然后把输入的话题转化成向量,计算微博向量的TF-IDF值,计算话题向量的TF值,然后做余弦,得到分数,取前100条。这里耗时一般较少,为1-2s左右。
项目总结
:多人完成web项目的时候,即使很合理的分工模块也难以避免有冲突的部分,最好项目开始之前,先画好项目的流程图,保证每个人都了解,并制作好项目的大体框架,分好层,比如sql执行层写好,数据库结果转换对象层使用反射将数据库执行的结果转化成所需要的对象等(要求对象的属性名和数据库表的列名相同),这样能合理减少代码,也能减少出错率。web后台是否需要高并发要根据具体情况而来,像上面的项目,不使用多线程肯定会不符合需求。