过滤及提取电影资源名小算法(初级方案)

这两天干了件自己觉得很有意思的事情——

 

互联网上各个视频网站,对电影资源的命名千奇百怪,比如

 

《阿凡达》高清版在线观看、西游记新版中文字幕(暑期必看!)、阿里巴巴与四十大盗拍摄花絮 ……

 

如果我们要将这些信息“数字化”,提取到我们的数据库中,则这样的垃圾命名会给我们带来很大的麻烦。

 

于是,我写了一个程序,简单的对这些垃圾信息进行处理。尽量提取出正确的电影名,并且在之前的电影名中提取一些该电影相关数据。比如 “阿里巴巴与四十大盗拍摄花絮”这样的,我们就需要知道它并不是一个电影的正片资源,而是花絮,它的影片名是 “阿里巴巴与四十大盗”。

 

OK,废话少说,开始进入正题。

 

首先是调研:

 

我粗略的看了一下各个网站爬虫程序爬回来的结果,比较乱的是 openv(天线视频)和优酷。

 

大量出现的一些垃圾字段 如“首映”、“独家首播”、“最新”……

 

然后还有一些情况是,比如 “XXX第X集”、“XXXX(韩剧)”、“XXXX(未删减版)”、“XXXX(xxx英文名)……

 

那么就是两种情况,对于垃圾字段,我们无情的删除之。对于这种有用的字段,我们需要先从里面提取出信息,然后再将其删除。

 

 

大体算法流程如下:

 

原始字符串 -> 删除垃圾字段 -> 截取有用信息 -> 整理字符串 -> 结果。

 

我统计的垃圾字段有如下:

 

在线观看
首映 首款
网络独家首播)
暑期必看
(配音) (配音)
最新 
(电视) (电视)
(电视剧) (电视剧)
(韩剧) (韩剧)

 ……

 

有用的信息如下:

 

未删减版 完整版 —— 可以确定电影是正片
高清版 高清全集 高清 枪版  —— 确定电影的质量
韩语版 粤语版 国语版 中文版 —— 确定语言类型
主题曲MV —— 确定资源类别
电影版 电视剧版 —— 确定类型
超长片花 片花 幕后花絮 花絮 —— 确定资源类别
限制级 —— 限制级别
(第X集)—— 电视剧集数
精彩预告 全长预告片 先行版预告片 预告片1 预告片2 预告片3 ... 预告片 宣传片 制作特辑 —— 资源类别

(XXXXXXXX) —— 很可能是电影的别名或者英文名之类的,这里我认为超过三个中文字符(6个英文)则是别名。(否则很可能是“(上)”、“(上集)”之类的,这需要属于影片字段。比如赤壁(上)和赤壁(下)就是不同的电影。

……

 

最后整理:

去掉() ()  []等无内容的符号,因为其里面的内容已经在之前被提取或者删除

去掉左右空格

 

然后开始编码,编码的话还是用擅长处理文本的脚本语言,我用的是PHP。

 

之后测试结果还是比较准确的。

 

这个方法比较初级,之后我会要考虑有更好、更智能的方案。大致想法是要先建立一个电影名的词汇库,然后自训练。嗯……今后再说。

 

 

附相关代码

 

<?php
	require_once('class.php');
	require_once('num_trans.php');
	

	//删除单词
	function delete_word( &$name, $word )
	{
		$name = str_replace($word,"",$name);
	}
	
	//剪裁单词,若包含,返回TRUE
	function cut_word( &$name, $word )
	{
		if( strstr($name,$word) )
		{
			delete_word($name,$word);
			return TRUE;	
		}
		return FALSE;
	}

	//处理电影名
	function filte_movie_name( $name )
	{
		
		//垃圾单词
		$del_word=array("在线观看","首映","首款","(网络首家独播)","暑期必看","(配音)","(配音)","最新","(电视)","(电视)","(电视剧)"
			,"(电视剧)","(韩剧)","(韩剧)","(电影)","(电影)");
		
		$result = new FilterResult();
		$result->start_name = $name;//记录影片原名
		
		//删除垃圾单词
		for($i=0;$i<count($del_word);$i++)
		{
			delete_word( $name, $del_word[$i] );
		}
		
		//影片类型
		if( cut_word($name,"未删减版") || cut_word($name,"完整版") || cut_word($name,"未删截版")|| cut_word($name,"正片"))
		{
			$result->type = "正片";
		}
		if( cut_word($name,"主题曲") || cut_word($name,"主题曲MV"))
		{
			$result->type = "主题曲";
		}
		if( cut_word($name,"片尾曲") || cut_word($name,"片尾曲MV"))
		{
			$result->type = "片尾曲";
		}
		if( cut_word($name,"超长片花") || cut_word($name,"片花") )
		{
			$result->type = "片花";
		}
		if( cut_word($name,"幕后花絮") || cut_word($name,"花絮") )
		{
			$result->type = "花絮";
		}
		if( cut_word($name,"制作特辑")){
			$result->type = "特辑";	
		}
		if( cut_word($name,"精彩预告") || cut_word($name,"全长预告片") || cut_word($name,"先行版预告片") || cut_word($name,"预告片")
			|| cut_word($name,"宣传片") || cut_word($name,"预告片1") || cut_word($name,"预告片2") || cut_word($name,"预告片3")
			|| cut_word($name,"预告") )
		{
			$result->quality = "预告片";
		}
		
		///品质
		if( cut_word($name,"高清版") || cut_word($name,"高清全集") || cut_word($name,"高清版本") || cut_word($name,"高清") )
		{
			$result->quality = "高清";
		}
		if( cut_word($name,"枪版"))
		{
			$result->quality = "枪版";
		}
		
		///影片类别
		if( cut_word($name,"电影版"))
		{
			$result->code = "电影";
		}
		if( cut_word($name,"电视剧版"))
		{
			$result->code = "电视剧";
		}
		
		///语言
		if( cut_word($name,"韩语版"))
		{
			$result->language = "韩语";
		}
		if( cut_word($name,"粤语版"))
		{
			$result->language = "粤语";
		}
		if( cut_word($name,"国语版") || cut_word($name,"中文版"))
		{
			$result->language = "国语中文";
		}
		
		
		///限制
		if( cut_word($name,"限制级"))
		{
			$result->limit = "限制级";
		}
		
		//提取电视剧集数
		preg_match_all('|第([^<>]+)集|',$name,$lesson_result);
		$result->lesson=$lesson_result[1][0];
		
		if( cut_word( $name, "第".$result->lesson."集" ))
		{
			//中文转阿拉伯数字
			$result->lesson = tranlate_to_num( $result->lesson );
			$result->code = "电视剧";
		}
		
		//提取资源别名
		preg_match_all('|\(([^<>]+)\)|',$name,$second_name_result);
		preg_match_all('|(([^<>]+))|',$name,$second_name_result2);
		$second_name_context= $second_name_result[1][0];
		//大于3个中文字符,6个英文字符,认为是别名
		if( strlen($second_name_context) >= 6 )
		{
			$result->second_name = $second_name_context;
			delete_word( $name, $result->second_name );
		}
		$second_name_context= $second_name_result2[1][0];
		if( strlen($second_name_context) >= 6 )
		{
			$result->second_name = $second_name_context;
			delete_word( $name, $result->second_name );
		}

		//去掉多余符号
		delete_word($name,"()");
		delete_word($name,"()");
		delete_word($name,"[]");
		delete_word($name,"【】");
		delete_word($name,"“”");
		delete_word($name,'""');
		
		//去除左右空格
		$name = trim($name);
	
		$result->end_name = $name;
		return $result;	
	}
	
	//显示过滤结果
	function show_filter_result( $result )
	{
		echo "原名=  $result->start_name<br>过滤名=$result->end_name<br>别名=$result->second_name<br>片类型=$result->type<br>影片质量=$result->quality<br>
		影片类别=$result->code<br>语言=$result->language<br>限制=$result->limit<br>集数=$result->lesson";
		echo "<hr>";	
	}	
	
	/* 使用示例 */
	/*
	$test = "阿凡达首款在线观看首映(网络首家独播)未删减版枪版片尾曲(Avanda for long word)";
	$result = filte_movie_name($test);
	show_filter_result( $result );
	*/
?>

 

 

你可能感兴趣的:(算法,PHP,互联网,脚本,阿里巴巴)