Hiroki

大部分笔记已经转移到 https://github.com/hschen0712/machine_learning_notes ,QQ:357033150, 欢迎交流

任务一 相关节目识别

任务一 相关节目识别

标签(空格分隔): 一找


任务描述

一、同一系列电影识别
1、根据数据表t_movie_douban,参考电影名、别名、导演、演员等各个字段的相似性来判断电影之间是否是同一系列。
2、识别出系列序号、系列名,比如:“速度与激情3:东京漂移”。
二、重名电影识别
根据数据表t_movie_douban,识别出名称相同的电影。
三、结果输出
结果分别输出到mysql以下两张表;
t_movie_cluster_test:相关节目簇信息,属于同一相关节目的簇,存放该簇的信息。cluster_id:簇ID,自增;type:簇类型,1为同系列,2为重名;title:簇名,同系列时为系列名,重名节目时为节目名。
t_movie_related_test:相关节目信息,存放簇与节目的映射关系。
四、数据库信息
host: summba-dev3:3306
dbname: db_yeezhao_dolphin
user: dolphin
password: dolphinadmin
五、指标
准确率目标:90%。随机抽样100个簇,如果该簇的节目都是同系列或重名的,则为正确,由此算出准确率。
召回率目标:90%。随机抽样100个节目,查看它是否正确地被(或没被)归到簇里,则为正确,由此算出准确率。
六、参考
代码:yz-dolphin-serv-crawler
com.yeezhao.dolphin.crawler.related
https://tower.im/s/a7GNv
https://tower.im/s/89C6M
https://tower.im/s/8cC6N

方案

技术方案:

该任务可以建模为一个二元分类问题(同系列1、不同系列-1)。选择分类器的原因是仅凭title判断会造成误判,而分类器可以结合其他辅助信息自己学习出一套规则。

1.用正则表达式对标题进行预处理

去掉了代表系列的词:
xxx之xxx,第x季,最终章,序章,第x章,后章,前章,续章, 剧场版,(美版),冒号(冒号前的首字符串末尾的系列号),第x集,OVA,OAD,第x部分,序曲,I,II,III,特别篇,Season,数字 ,第xx话,第x夜,第x部,第x卷,第x幕,第x期,外传 ,别传,新版, 高清版,特别篇等

2.对预处理后的标题进行排序

对title按照字典顺序进行排序,这样做的好处是能够把相似的title排列在一起,比较时只需要比较前后两条记录即可。这种比较方式优点是效率高,只需要O(n)次比较;如果穷举所有的pair,则要O(n^2)

3.如何建立关系

先直接比较两条记录的title,如果相同,则标注为重名;如果不同,则调用分类器对两条记录组成的特征向量进行分类,判断是否是同一系列,如果是,则合并到同一系列中;如果不是则新建一个簇。

4.分类器的设计

主要有以下几点要考虑:

1)标号的产生。这个问题没有给我们标号,因此需要人工进行标定,这一部分采用了基于主动学习的方法来完成标定。

2)特征的设计。目前想到的特征有标题相似度、子标题相似度、导演、作家、演员匹配数,类型相似度,出品地,语言,描述相似度,出品国家等。
最后用到的特征如下:

  • 标题相似度:最长公共子序列

  • 子标题相似度: 同上

  • 导演、作家、演员特征定义为两个movie共同导演/演员数,若没有或者其中一个为NULL,则为0。

  • 类型相似度: 两部影片类型是否相同,比如均为喜剧片, 若相同则为1,不同(或其中一者为NULL)为0

  • 出品地、语言: 相同为1,不同为0

  • 年份差:两部电影出品年份的差除以20.0

描述相似度特征 与标题相似度特征 定义相同

3)正负样本比例的确定。暂定正负样本比为1:1。

4)训练样本的选择。既要选择容易分的,也要选择在边界附近的。

代码

代码位于包com.yeezhao.dolphin.crawler.entertainment.related,结构体系如下:

related>
Cluster:簇类,存放同系列或同名电影
FeatureExtractor:特征提取器,用了单例模式实现
FeatureVector:特征向量类
Movie:电影类,存放电影的信息
RelatedMovieCrawler:相关电影爬虫类,为程序的入口
Relation:电影和簇之间的关系类
RelationExtractor:关系提取器,单例实现
svm_predict:svm预测接口
svm_train:svm训练接口

注释都已经齐全,所以不详细介绍了

遇到的问题

  1. 正则表达式将一些标题处理为空,比如第27章,爱情第二章
    这种情况没有太好的解决办法,通过加入规则来解决

  2. SVM分类器准确率不高,只有93%
    经过调试发现,问题出自年份中的噪声,比如19961997,199503这样的时间,解决办法为用正则表达式取前面的4位作为年份,同时对年份特征进行放缩,消除数量级对特征的影响,去噪后准确率达到97%

posted on 2015-12-11 11:23  Hiroki  阅读(297)  评论(0编辑  收藏  举报

导航