找回密码
 立即注册
搜索

自然言语处理带你重温《复联3》台词,谁是最有个性的崽?


点击上方关注,All in AI中国

经过漫长的等待,漫威迷心心念念的《复联4》(《复仇者联盟4:结局之战》)终于来了,置信有不少人在工作日的清晨守在大荧幕前,目击了超级英雄们是如何再次解救世界的。同时这场持续10年(甚至不止10年)的超级英雄故事也随着《复联4》的上映画上了句号。

关于剧情,观众们的感受千人千面,但数据从来都是最诚实的见证者。所以让我们来重温一下《复联3》,只不过回顾的不只是剧情,而是用自然言语处理(简称NLP)研讨电影的脚本。

在本文中,我们会用NLP Python开源库spaCy来协助我们处理和了解大量的文本,并分析电影脚本,以研讨以下概念:

电影中排名前10位的动词,名词,副词和描画词。

由特定角色说出的动词和名词。

电影中排名前30位的实体。

每对人物台词之间的相似性,例如,雷神和灭霸台词之间的相似性。

除了这些,我们同时还会用代码解释spaCy是如何停止这些研讨的。

对代码和技术词汇感兴味的冤家可以关注本文,文中运用的词汇和术语大部分都是非技术性的,所以即便你没有NLP、AI、机器学习等专业技能,也可以了解本文想要表达的次要想法和概念。


疯狂泰坦



处理数据

实验中运用的数据或文本语料库(在NLP中通常称为语料库)是电影脚本。但是,在运用数据之前,我们需求对数据停止清算。次要是删除一些描画动作的回复或场景,以及说出该行台词的角色名字(实践上,该称号用于了解谁说了什么,但不是用于分析的实践语料库的一部分)。此外,作为spaCy数据处理步骤的一部分,我们不用标记为中止字的术语,也就是常用的单词,如"I"、"you"、"an"等。而且,我们只运用引理,也就是每个单词的正则方式。例如,动词"talk"、"talking"和"talking"是同一个词素的方式,其引理是"talk"。

在spaCy中处理一段文本时,我们首先需求加载言语模型,然后在文本语料库上调用模型。结果是一个Doc对象,一个保存已处理文本的对象。
import spacy
# load a medium-sized language model
nlp = spacy.load("en_core_web_md")
with open('cleaned-script.txt', 'r') as file:
text = file.read()

doc = nlp(text)

在spaCy中创建Doc对象

如今我们曾经有了经过处理的语料库,接上去要末尾我们的研讨了。

十大动词、名词、副词和描画词

仅仅看动词就能知道电影的全体动作或情节吗?本文的第一个图表阐明了这一点。


"I know", "you think"是一些最常见的短语



Know"、"go"、"come"、"get"、"think"、"tell"、"kill"、"need"、"stop"和 "want". 我们能从中推断出什么?能够是因未看过电影的缘故,作者根据这些动词总结出,《复仇者联盟3:有限和平》是关于了解、思索和调查如何去阻止某事或某个人的。

这就是我们运用spaCy获取动词的方法:
import spacy
# load a medium-sized language model
nlp = spacy.load("en_core_web_md")
with open('cleaned-script.txt', 'r') as file:
text = file.read()

doc = nlp(text)
# map with frequency count
pos_count = {}
for token in doc:
# ignore stop words
if token.is_stop:
continue
# pos should be one of these:
# 'VERB', 'NOUN', 'ADJ' or 'ADV'
if token.pos_ == 'VERB':
if token.lemma_ in pos_count:
pos_count[token.lemma_] += 1
else:
pos_count[token.lemma_] = 1
print("top 10 VERBs {}".format(sorted(pos_count.items(), key=lambda kv: kv[1], reverse=True)[:10]))

那么副词的状况怎样样?


“我真的不知道你的头是怎样塞进头盔里的”——奇特博士



对于一部关于阻止一个人毁灭半个宇宙的电影来说,口语中有很多实证主义的成分,比如"right"、"exactly"和"better"。

我们曾经知道动词以及副词的状况,所以接上去让我们一同来看看名词。


"你会用生命付出代价,Thanos会拥有那块石头。" - Proxima Midnight



看到"stones"作为第一出现并不奇异,毕竟这部电影是关于石头的。第二个词是"life",这是灭霸想要摧毁的东西,紧随其后的是"time",而这正是《复仇者联盟》所没有的(注:"time"上榜也有能够是由于提到了工夫之石)。

最后,我们俩看一下描画名词的描画词。与副词相似,描画词中也有"good"和"right"等表达积极意义的词汇,以及"okay"和"sure"等表示一定的词汇。


"我很抱歉,小家伙。" - 灭霸



由特定角色说出的动词和名词

在此之前,我们看到了电影中提到的最常见的动词和名词。虽然这让我们对电影的全体感觉和情节有所了解,但它并没有阐明角色的个人阅历。因此,我们运用相反的程序来查找前十个动词和名词。

由于电影中有很多角色,我们只选择其中比较合理和残缺的角色。这些角色分别是钢铁侠Tony Stark、奇特博士、格莫拉、雷神托尔(Thor)、火箭浣熊、 Peter Quill(星爵)、Ebony Maw(乌木喉)和灭霸。

下一张图片显示了这些角色运用的最常用名词。


星爵称德拉克斯什么?



我发现,在大多数状况下,英雄们最常用的名词都是伙伴的名字,这很奇异,甚至令人耳目一新。例如,钢铁侠说了9次"kid"(指蜘蛛侠),火箭叫了3次Quill (星爵),而Quill本人叫了7次。

经过进一步的观察,我们可以推断出对每个角色来说什么是最重要的。以钢铁侠为例,数据表明地球对他来说是有价值的。与他相似的是格莫拉,她总是想着更高的目的"生命"、"宇宙"和"行星",并最终为此付出了代价。奇特博士还有反复提到的另一个目的:保护石头。还有雷神托尔,他和灭霸之间有公家恩怨,并且延续喊了8遍他的名字。还有疯狂泰坦灭霸,他不断在搜集无极宝石,另外就是关于他的女儿。

虽然名词是有表达意义的,但动词就不一样了。在下一张图片中可以看到,动词不像名词那样丰富多彩。像"know"、"want"和"get"这样的词占据了大部分的榜首。但是,有一个角色能够拥有整个语料库中最独特的动词:乌木喉(Ebony Maw)。灭霸的头号跟随者,就像忠实的仆人一样,他的目的是得到工夫宝石和鼓吹主人的使命。他最常说的就是"hear," 和"rejoice."


"听我说,高兴吧。你有幸被伟大的泰坦所解救……"——乌木喉



彩蛋:以下是格鲁特(Groot)最常用的名词。


我是Groot。



命名实体

到目前为止,我们曾经掌握了超级英雄和反派们在这部史诗级电影中最常说的动词、名词、副词和描画词。但是,要充分了解这些词语和人物,我们还需求命名实体。

援用spaCy的网站上的话,命名实体是"指定称号的真实世界对象。例如,一个人、一个国家、一个产品或一个书名"。 所以,了解这些实体,意味着了解角色在说些什么。在spaCy包中,实体具有预测标签,该标签将实体分类为多种类型中的一种,例如人、产品、艺术品等。并给予我们额外的粒度级别,这能够有助于进一步对它们停止分类。

这些是前30个实体。


MAYEFA YA HU"是瓦坎达贾巴里战士的口号



第一位是灭霸,毕竟电影是关于他的,这不足为奇。第二位是他的女儿格莫拉,影片的核心人物之一。第三位是Groot,紧随其后的是Tony和其他复仇者以及一些地方,如纽约,阿斯加德和瓦坎达。除英雄和地点外,还有两个"六"(见实体号)。工夫之石和灵魂之石分别位于第15位和第16位。令人诧异的是,将灭霸带到地球上的心灵之石不在名单之列。

要访问spaCy中的实体,请像这样读取Doc的属性ents:
import spacy
# load a medium-sized language model
nlp = spacy.load("en_core_web_md")
with open('cleaned-script.txt', 'r') as file:
text = file.read()

doc = nlp(text)
# create an entity frequency map
entities = {}
# named entities
for ent in doc.ents:
# Print the entity text and its label
if ent.text in entities:
entities[ent.text] += 1
else:
entities[ent.text] = 1

print("top entities {}".format(sorted(entities.items(),
key=lambda kv: kv[1], reverse=True)[:30]))

每对人物台词之间的相似性

当我们讨论每个角色最重要的动词时,我们看法到,与名词不同的是,大多数动词非常相似,并且表达的感觉非常相似。像"go"和"come"这样的词给我们运动的印象,或者给我们角色想要去或到达某个特定地方的感觉。诸如"kill"和"stop"之类的动词意味着的确存在一个必须阻止的宏大要挟。

思索到这一点,为了进一步研讨相似度的概念,我计算了每对字符的口语台词之间的相似度评分

NLP中相似性的概念描画了两段文本的合成或语法意义的接远程度。通常,相似性得分的范围从0到1,其中0表示完全不同,1表示完全相似(或两个文本是相反的)。从技术上讲,相似性是经过测量单词向量之间的间隔来计算的,即单词的多维表示。

下图显示了相似度矩阵。




结果令人不测。其实所街结果相似度为1是可以接受的,由于这部电影本身就阐述了一个次要情节,对话关联度高是可以了解的。但是,他们的相似度太高了,看看灭霸就知道了,本来以为反派的得分会有很大不同。但庆幸的是,蜘蛛侠的分数变化很大,毕竟他只是一个在混乱中被抓住的孩子,结果有如预期。

这是如何在spaCy中计算两个文件之间的相似性的例子:
# for the full example on how I obtained all the similarities
# see the full code at: https://github.com/juandes/infinity-war-spacy/blob/master/script.py
import spacy
# load a medium-sized language model
nlp = spacy.load("en_core_web_md")
with open('tony-script.txt', 'r') as file:
tony_lines = file.read()

with open('thor-script.txt', 'r') as file:
thor_lines = file.read()

tony_doc = nlp(tony_lines)
thor_doc = nlp(thor_lines)
similarity_score = tony_doc.similarity(thor_doc)
print("Similarity between Tony's and Thor's docs is {}".format(similarity_score))

回顾和结论

在电影《复仇者联盟3:有限和平》中,我们跟随超级英雄们展开了阻止灭霸毁灭半个宇宙的旅程。在整部电影中,我们了解到这些英雄大多有解救世界的动机,这反映在他们表达本人的方式上。在本文中,我们在Python、NLP和spaCy中研讨了英雄和反派们是如何经过他们的每句台词来表达和交流的,重温了钢铁侠对地球的忠实、奇特博士保护工夫之石的誓词、雷神托尔复仇的盼望以及灭霸毁灭宇宙的野心。

接上去,让我们一同等待结局之战吧!


编译出品

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

大神点评4

艾春到死 2019-5-4 13:56:11 显示全部楼层
/
回复

使用道具 举报

啊啊啊啊啊啊啊啊啊啊啊
回复

使用道具 举报

yiyoyiya 2019-5-5 09:02:21 来自手机 显示全部楼层
报告!别开枪,我就是路过来看看的。。。
回复

使用道具 举报

我剪剪剪 2019-5-5 09:02:21 显示全部楼层
纯粹路过,没任何兴趣,仅仅是看在老用户份上回复一下
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies