1、第 1 页上海交通大学 电子信息与电气工程学院设计报告第 2 页上海交通大学 电子信息与电气工程学院摘 要:本设计报告包括了 MSN 电 视 节 目 推 荐 系 统 的主要功能以及软件的设计和实现方法等等。本系统通过用户的观看历史以及用户的个人信息来相应地推荐电视节目及其播放时间,并通过 MSN 为媒介来与用户来交流。用户可以通过 MSN 与聊天机器人进行交流,以获取信息。聊天机器人会将必要的信息传给概率分析器进行记忆和预测。概率分析器将使用数据挖掘的部分知识,从大量的数据中获取模式,来推测用户的喜好。电视节目的信息将从网络中获取和提炼。所有的信息将有序地存储在数据库中。关键词:MSN Cha
2、t Robot; 概 率 分 析 器 ; 推 荐 系 统 。第 3 页上海交通大学 电子信息与电气工程学院目 录1. 概述 .11.1 背景 .11.2 系统简介 .11.3 主要技术 .11.3.1 MSN 聊天机器人 .11.3.2 数据库 .11.3.3 概率分析器 .21.3.4 信息获取 .22. 系统总体设计 .32.1 聊天机器人 .32.1.1 模块简介 .32.1.2 模块组成 .32.1.3 模块联系 .42.2 数据库模块 .52.2.1 数据库中包含的表 .52.2.2 数据库接口部分 .62.3 概率分析器部分 .92.3.1 决策树与概率分析器的区别 .102.3.
3、2 Bayes 网络 .102.3.3 运用策略 .112.4 电视节目信息提取 .123. 结论 .15第 1 页上海交通大学 电子信息与电气工程学院1. 概述1.1 背景当今社会飞速发展,我们正在逐渐被数据所淹没。虽然我们有计算机来帮助我们存储和处理数据,但是,要如何从无尽的数据中获取有用的知识仍是一个很新的课题。大量的数据会提供大量的信息,但是在数据量增加的同时,伴随着人们对它的理解度的降低。隐藏在这些数据后的是具有潜在用处的信息,而这些信息却很少被显现出来或者被开发利用。而本项目是关于如何在数据中寻找模式,从而预测用户的行为,进行合理地推测。在网络发展日益蓬勃的今天,一个能为用户提供贴
4、心服务的系统自然是各企业的首选。其中,进行最让用户满意的推荐自然成了提高用户忠诚度的首选。数据挖掘理论不断发展,推荐系统也随之优化,本系统就是建立在一个世界闻名的数据挖掘平台 Weka 之上的。另外,MSN 是一款拥有广大用户群的聊天软件,它也提供丰富的接口。本系统将以 MSN 为媒介与用户进行交流。相信基于 MSN 的推荐系统必将为企业带来效益。1.2 系统简介本系统是一款电视节目推荐系统。用户只需像平时聊天一样,加聊天机器人为好友,就可以与其对话,并得到相应的电视节目信息。一旦添加为好友,聊天机器人将会把用户的观看节目历史信息记录下来,并以此为依据,推测用户的喜好,进行合理的推荐。用户提供
5、的个人信息越丰富越准确,系统的推荐也就越精确。推荐系统使用概率分析器来进行记录和预测,这是基于 Bayes 网络的一种方法。用户的各种信息都会存储在数据库中,便于长期读写。电视节目的各类信息将会通过网络获取,尽量保证准确和全面。1.3 主要技术1.3.1 MSN 聊天机器人采用 MSN 提供的接口设计出一个聊天机器人,它能获取用户的信息,还能向用户进行推荐。1.3.2 数据库采用 Mysql,将数据进行存储。第 2 页上海交通大学 电子信息与电气工程学院1.3.3 概率分析器基于 Weka 平台,采用 Bayes 网络作为工具进行机器学习和预测。1.3.4 信息获取从网络中获取电视节目的各类信
6、息。第 3 页上海交通大学 电子信息与电气工程学院2. 系统总体设计2.1 聊天机器人2.1.1 模块简介ChatRobot 模块通过 MSN 方式与用户进行交流,系统启动时,ChatRobot 模块将登录 MSN。所有在系统注册过并与 ChatRobot 成为好友的用户都可以 MSN 客户端与 ChatRobot 进行交流。ChatRobot 将根据用户的信息作出相应的反应,并将反馈信息发送给用户。不过用户并不需要直接与 ChatRobot 进行通信,用户的请求将被电视终端接收并转换成一定格式的请求消息发送给ChatRobot,ChatRobot 的反馈消息也将进行一定格式的封装。这样的处理
7、比较方便 ChatRobot 和电视终端对消息的分析。2.1.2 模块组成ChatRobot 主要由 3 部分组成,MSN Communication,Input Queue 和 Output Queue,MSN Communication 部分负责处理 MSN 通信所需的一切工作,包括 switch board 的建立、撤销,消息的发送、接收等;Input Queue 负责对用户的消息进行分析,将相应的请求封装成 Packet 存入工作队列中;Output Queue 负责从工作队列中取出 Packet,根据 Packet 的类型向系统的概率分析器模块发送请求。下面是每个组成部分的详细介绍:
8、(1)MSN Communication 部分:ChatRobot 的主要部分,实现时使用了一个开源的类库 JML。JML 支持多种 MSNP 协议,并且将 MSN 通信所需的底层操作都封装起来了,使用起来非常方便。JML 为 MSN 通信需要处理的事件如消息的发送、接收,好友的添加、删除,switch board 的建立、撤销都提供的接口。MSN Communication 这一部分的实现就是将这些接口一一实现,从而定制 ChatRobot 的行为。当然,在这些事件中,消息接收事件是最重要的。当消息接收事件触发时,本部分将对接收的消息进行分析,即以一定格式从消息中提取出数据,这些数据将用于构
9、造一个 Packet,Packet 最后被放入工作队列中,供 Input Queue 部分进行处理。如果该消息是 switch board 建立后用户发送过来的第一个消息,本部分还会将 switch board 保存在一个哈希表中,同时与概率分析器模块建立一个 socket 连接,该 socket 连接也将保存在哈希表中。这样,每个用户都有专门的 socket 连接和 switch board 负责通信。Input Queue 部分:一个负责处理 Packet 的独立线程,它与 MSN Communication 直接之间的同步通过信号量完成。信号量初始化为 0,每当 MSN Communic
10、ation 向工作队列添加一个 Packet,信号量将加1;Input Queue 线程的主体是一个死循环,它首先尝试获得一个信号量,若信号量为 0,即工作队第 4 页上海交通大学 电子信息与电气工程学院列为空,线程将睡眠,直至工作队列被添加 Packet 后线程被唤醒。接下来本部分从工作队列中取出一个 Packet,根据 Packet 的类型和内容构造相应的请求消息并发送给概率分析器模块进行处理。工作队列的互斥访问用过锁保证。Output Queue 部分:一个负责接收概率分析器发回的反馈消息的独立线程,对于推荐节目的请求,Input Queue发送给概率分析器模块后,概率分析器会分析并得到
11、一个推荐节目列表,本部分负责接收这一节目列表并将其通过 MSN 消息的形式发送给用户。Output Queue 线程的主体同样是一个死循环,它尝试接收概率分析器发送过来的消息,若消息为空,线程将被阻塞直至接收到消息。线程被唤醒后从接收到的消息中提取出节目信息并发送给用户。2.1.3 模块联系ChatRobot 模块内部各部分的联系以及 ChatRobot 模块与其他模块的联系可以通过以下的图表说明:第 5 页上海交通大学 电子信息与电气工程学院2.2 数据库模块2.2.1 数据库中包含的表1.TV_info 用来存放电视节目的具体信息,表 TV_info 的结构是:2.user_info 用来
12、存放用户的具体信息,表 user_info 的结构是:3.Pro_info 用来存放电视节目的一些具体信息,表 Pro_info 的结构是:第 6 页上海交通大学 电子信息与电气工程学院4.buffer 用来存放用户对某个电视节目的评分,表 buffer 的结构是:5.history 用来存放用户看过的电视节目,表 history 的结构是:6.hate 用来存放用户讨厌的电视节目,表 hate 的结构是:7.favorite 用来存放用户喜欢的电视节目,表 favorite 的结构是:2.2.2 数据库接口部分Database 类:Public static int get_TVID(Str
13、ing channel,String showname);通过确定的 channel 和 showname 得到某个电视节目的 TV_ID。参数:channel,showname返回 int 类型的 TV_IDPublic static Timestamp getCurtime()得到当前的时间第 7 页上海交通大学 电子信息与电气工程学院参数无返回 Timestamp 类型的时间值Public static int getRandomID()得到一个随机的 TV_ID,使用时机在用户最开始使用系统的时候或者是用户信息不全的时候参数无返回一个 int类型的 TV_ID;Public stati
14、c void getTV()得到两个输出信息,分别是一当前时间为准,用户在当前时间内五分钟左右会开始,或者已经开始的节目的 list,另外一个信息室两个小时到一个小时之间的节目参数无返回值无Public static void add_history(String userID,TV_key_words TV_keys,double score)将用户观看过的电视节目的历史记录写进数据库中的 history 表中,同一个用户的历史记录上限是 30 个,并于此同时根据用户的打分对指定的电视节目进行评分。参数是:String userID,TV_key_words,double score返回值无
15、public static void add_like(String userID,TV_key_words TV_keys,double score)将用户标记为喜欢的电视节目写入数据库中的 favourite 表中,如果有重复,保留新加入的,删除早插入的,如果该节目在该用户的 hate lisit 中出现,从该用户的 hate list 中将其删除。每个用户标记自己喜欢的节目的上限是 30 个,在每次插入的时候,要根据用户的打分对该电视节目进行评分。参数:String userID,TV_key_words TV_keys,double score返回值无Public static voi
16、d add_hate(String userID,TV_key_words TV_keys,double score)将用户标记喜欢的电视节目插入到数据库中的 hate 表中,如果有重复,保留新加入的记录,删除后加入的记录,如果该节目在用户的 favorite list 中出现,从该用户的 favorite list 中将其删除。每个用户标记自己讨厌的节目的上限是 30 个,在每次插入的时候,要根据用户的打分对该电视节目进行评分。参数:String userID,TV_key_words TV_keys,double score返回值无Public static TV_key_words get_TV_key_words(int TV_ID)通过 PK TV_ID 查询到电视的信息