1. 引言
写着FLAC3D与Python集成方面的文章,不知怎地就突然想起了疫情,可能是Python触发了想看看有哪些与疫情相关的电影。基本的想法是首先设定关键词,然后在电影数据库中查询电影,最后从查询出来的电影中推荐最相关的几部电影。本质上说,这是一个与自然语言处理相关的话题。本文描述如何实现这一想法。
2. 与疫情相关的关键词
首先,对COVID-19数据库进行词频统计,目的是想观察一下在这个数据库中哪些词出现的频率最高。COVID-19数据库是2020年1月底自建的一个基于新闻资料的数据库,采用SQLite储存。这个数据库一直维护到2020年5月中旬开始逐渐停止更新。数据库内容的主要语言是英语,也有少量中文。为了进行词频统计,首先把数据库.db格式转化位文本.txt格式, 词频统计的代码很简单,使用了NLTK中的模块。主要代码如下:
input_file = 'feiyan.txt'
fp = codecs.open(input_file, 'r', encoding='utf-8')
words = nltk.word_tokenize(fp.read())
words = [word for word in words if len(word) > 1]
words = [word for word in words if not word.isnumeric()]
words = [word.lower() for word in words]
words = [word for word in words if word not in all_stopwords]
fdist = nltk.FreqDist(words)
for word, frequency in fdist.most_common(200):
target.write ('%s; %d' % (word, frequency))
结果在这个数据库中共发现了2,025,184个有效词汇, 与疫情相关的top 20高频词汇如下:
coronavirus; 33119
cases; 25064
virus; 8973
deaths; 8057
outbreak; 6677
death; 4509
case; 4491
medical; 4223
patients; 4019
pandemic; 3782
disease; 3342
quarantine; 2955
infected; 2880
died; 2568
symptoms; 2300
patient; 2114
test; 2112
lockdown; 2097
restrictions; 2077
infections; 1772
作为一个算法测试,在此仅使用了其中一部分词汇。这次试验经综合考虑后决定使用下面这些关键词:virus, outbreak, pandemic, ebola, pneumonia, contagion, infected.
3. 电影推荐
使用《一个快速的句子和段落相似查询方法》中使用的组合算法对数据库MovieSet进行查询,产生的组合数如下所示。MovieSet是一个自建的基于内容的大型电影数据库, 目前存有近四万部电影。使用关键词产生的组合依次对数据库查询,然后按照出现的频次累计对其排序。
于是产生出top 9与给定关键词最相关的9部电影:
('Outbreak (1995)', 29)
('93 Days (2016)', 10)
('Pandemic (2016)', 10)
('Contagion (2011)', 7)
('Against The Dark (2009)', 6)
('Alien 3 (1992)', 6)
('Drug$ (2018)', 6)
('Gamgi (2013)', 6)
('Isle of the Dead (2016)', 6)
作为一个比较,我们使用三个词汇的组合进行查询,共产生如下所示的组合数。
搜索结果的top 9如下所示。
('93 Days (2016).db', 10)
('Pandemic (2016).db', 10)
('Drug$ (2018).db', 4)
('Gamgi (2013).db', 4)
('Isle of the Dead (2016).db', 4)
('X Files, The (1998).db', 4)
('Against The Dark (2009).db', 4)
('Longtime Companion (1989).db', 4)
('Contagion (2011).db', 4)
4. 最相关的电影简介
下面按照第一种推荐方法(两词组合)得出的结果简要介绍排位最前四部电影的故事情节。这几个电影你看过几部?
No.1 <Outbreak (1995)>
Army doctors struggle to find a cure for a deadly virus spreading throughout a California town that was brought to America by an African monkey. 军队的医生们努力寻找一种致命病毒的治疗方法,这种病毒由一只非洲猴子带到美国,在加州的一个小镇上传播。
No. 2 <93 Days (2016)>
What happens when the deadliest infectious disease know to man arrives in a megacity with over 21 million people. 当人类知道最致命的传染病到达一个人口超过2100万的特大城市时会发生什么。
No. 3 <Pandemic (2016)>
A New York doctor travels with her team to Los Angeles to find survivors of a worldwide pandemic. 一位纽约医生和她的团队前往洛杉矶寻找全球大流行病的幸存者。
No. 4 Contagion (2011)
Healthcare professionals, government officials and everyday people find themselves in the midst of a pandemic as the CDC works to find a cure. 医疗保健专业人员、政府官员和普通人发现自己处于大流行病之中,CDC努力寻找治疗方法。
5. 结束语
本文根据给定的关键词在一个大的基于内容的电影数据库中推荐与之最匹配的电影,尽管没有使用高级的深度学习算法,但是推荐出来的电影应该是最符合搜索条件的。事实上,本文使用的算法可以扩展到任何领域的数据查询中。