《复仇者联盟4:终局之战》还在上映中。在看大结局的同时,本文将带你用数据科学的眼光来重温《复仇者联盟3》:来看看这些人间英雄爱说什么?此次复习之旅将从一个全新的视角——自然语言处理开始。本文使用spaCy(用于处理和理解大量文本的NLPPython开源库)对《复仇者联盟3》的剧本进行分析,研究了以下项目:整部电影中最常用的前十个动词、名词和副词以及形容词.特定角色最常用的动词和名词。电影中提到的前30个命名实体。对话的相似度,比如雷神的对话和灭霸的对话的相似度。看到代码和技术词汇就睡着了?今天你可以放心!为读者着想,本文中使用的词汇和术语是非技术性的,因此即使您没有接触过NLP、AI、机器学习或诸如*insertbuzzwordhere*等代码,您也可以理解并掌握这篇文章想要传达的信息!因此,不阅读代码不会影响您对其余内容的理解。Thanos图片来源:Marvel在处理数据的实验中使用的数据或文本语料库(在NLP中通常称为语料库)是电影脚本。但是,在使用数据之前,需要进行一些筛选。因为心理描述、动作描述或场景描述的文本,以及每行前面的人物名称(仅表示说话人,不作为文本分析的语料)不是本次研究的对象。所以,像“ThanoscrushestheTesseract,revealingtheblueSpaceStone...”(ThanoscrushestheTesseract,revealingtheblueSpaceStone...)这样的句子被删除了。此外,作为spaCy数据处理步骤的一部分,“I”(我)、“你”(你)、“an”(一个)被标记为停用词(常用词,多为冠词、介词、副词或连词)被忽略。同时,实验过程中只使用词的标准形式,即词根。举个例子,动词“talk”、“talked”和“talking”是同一个词“talk”(说)的不同形式,所以这些词的词根是“talk”。在spaCy中处理一段文本,首先需要加载语言模型,然后在文本语料上调用模型进行文本处理。结果,输出一个包含所有已处理文本的Doc文件。importspacy#loadamedium-sizedlanguagemodelnlp=spacy.load("en_core_web_md")withopen('cleaned-script.txt','r')asfile:text=file.read()doc=nlp(text)在spaCy中创建Doc文件然后A可以得到有效信息比例高的处理后语料。然后就可以开始实验了!是不是只知道整部电影中使用频率最高的前十个动词、名词、副词和形容词,就可以推断出电影的整体走向和情节?下面的图表证明了这一点。“我知道”(我明白……)、“你认为”(你认为……)是最常见的短语。"know"(理解)、"go"(去)、"come"(来)、"get"(获得)、"think"(思考)、"tell"(告诉)、"kill"(谋杀)、"need”(需要)、“stop”(停止)、“want”(想要)。从中可以推断出什么?影片自2018年上映以来,相信大部分观众都已经知道它讲述了一个什么样的故事:从这些动词可以推导出《复仇者联盟3》是关于如何去理解、思考和调查如何预防某事或某人。可以通过以下代码统计每个动词出现的次数:importspacy#loadamedium-sizedlanguagemodelnlp=spacy.load("en_core_web_md")withopen('cleaned-script.txt','r')asfile:text=file.read()doc=nlp(text)#mapwithfrequencycountpos_count={}fortokenindoc:#ignorestopwordsiftoken.is_stop:continue#posshouldbeoneofthese:#'VERB','NOUN','ADJ'or'ADV'iftoken.pos_=='VERB':iftoken.lemma_inpos_count:pos_count[token.lemma_]+=1else:pos_count[token.lemma_]=1print("top10VERBs{}".format(sorted(pos_count.items(),key=lambdakv:kv[1],reverse=True)[:10]))那么描述动词-副词的词是否具有相同的实验效果?“我真的不知道你是怎么把头塞进那个头盔里的。”(我真的不知道那个头盔是怎么装进你脑袋里的。)-奇异博士。对于一部防止紫薯毁灭半个宇宙的电影,有很多像“right”(是的)、“exactly”(就是这样)、“better”(更好的)这样的意向副词。所以,知道了电影中的动作和动作描述,是时候看看名词了。“你会用你的生命来偿还他的生命。Thanos会得到那块石头。”(这将用你的生命来偿还他的生命。Thanos将拥有那块石头。)-ProximaCentauri结果显示,正如预期的那样,“石头”(宝石)出现的次数最多,因为整部电影都围绕着它们展开。出现频率第二高的是“life”(生命),灭霸想要毁灭,其次是“time”(时间),复仇者联盟没有多少(注:出现频率更高的也可能是因为在里面多次提到)电影到“时间宝石”——时间宝石)。在继续下一个实验项目之前,探索描述名词的形容词或单词。与副词的情况类似,有“good”和“right”等肯定词和“okay”和“sure”等肯定词。“对不起,小家伙。”(对不起,小家伙)-特定Thanos角色最常使用的动词和名词它前面的图片列出了电影中最常用的动词和名词。虽然这些结果让我们对影片的整体感觉和情节有了一些了解,但并没有太多说明各个角色的个人经历。因此,在特定人物的个人台词中,通过与之前相同的过程,找到前十次出现的动词和名词。由于电影中人物较多,本次实验只选取了一些台词较多的人物。这些角色是钢铁侠、奇异博士、卡魔拉、雷神、火箭浣熊、星爵、乌木喉和灭霸。对不起,队长没有被选中。下图显示了这些字符使用的前10个名词。为什么星爵经常被称为德拉克斯?没想到,很多时候,亲爱的英雄们提到频率最高的名词,都是同伴的名字。比如钢铁侠9次提到“kid”(指蜘蛛侠),火箭浣熊3次提到Quill(星爵),7次星爵喊(实际上是喊)德拉克斯。通过进一步的观察,可以推断出每个角色心中最重要的是什么。以钢铁侠为例,统计数据显示“地球”对他来说非常重要。卡魔拉的情况也差不多,她总是在谈论“生命”、“宇宙”、“星球”这些更广泛的实体,并为之献出自己的生命。奇异博士反复提到他的目标,这与其他英雄不同——保护时间宝石。还有雷神,因为他和灭霸的国仇家恨,他提到灭霸这个名字的次数多达8次。当然,还有一个“脆皮面”的新朋友——长得像“兔子”的火箭浣熊。一张图片中的数据显示,灭霸一直在说要收集所有的宝石,并多次给女儿打电话。名词表达意思,但动词可能不像名词那样清楚地表达性格。如下图所示,与名词相比,动词的表达力影响不大。像“知道”、“想要”和“得到”这样不典型的常用词都有很高的频率。然而,Thanos的头号粉丝——EbonyMaw可能是整个语料库中最独特的动词。乌木花喉就像一个忠诚的仆人:除了努力得到时间宝石之外,他的主要工作就是用“听”、“荣幸”之类的话来宣扬主人的使命。啧啧,太讨人喜欢了。“Hearme,andrejoy.youhadtheprivilegebeingsavedbytheGreatTitan...”(跪下聆听,感到荣幸!你有幸被最伟大的救世主拯救...)——乌木喉咙以彩蛋结尾(Fog):格鲁特说得最多——“我是格鲁特”。、名词、副词和形容词。然而,为了完全理解所有被研究过的词,一些上下文,即命名实体,需要被添加到研究中。根据spaCy上的网页,命名实体是“分配了名称的实际对象——例如,人、国家、产品或书名”。因此,了解这些实体意味着了解角色在说什么。在spaCy程序源库中,实体有一个预测标签,将实体分为人物、产品、艺术词汇等类型(https://spacy.io/api/annotation#named-entities),从而提供未来实验提供了一个额外的粒度级别,有助于对实体进行进一步分类。然而,为了简化过程,在这个实验中将使用实体本身而不是实体分类。这些是出现次数最多的30个实体。“MATEFAYAHU”(必胜)是瓦坎达贾巴里部落战士在战斗前的口号。首先,考虑到整部电影都是关于灭霸的,所以灭霸出现的次数最多也是有道理的。其次是他的女儿,电影的中心人物之一-卡魔拉。然后排在第三位的是格鲁特(无需解释),其次是钢铁侠和其他复仇者联盟,以及纽约、阿斯加德和瓦坎达(瓦坎达万岁)等地点。除了英雄的名字和位置,“六颗无限宝石”中的“六颗”,时间宝石和灵魂宝石分别出现在第14、15和16位。令人惊讶的是,将Thanos吸引到地球的MindStone并不在前30名之列。Doc文件中每个单词的物理标签'ents'可以通过以下代码读取:importspacy#loadamedium-sizedlanguagemodelnlp=spacy.load("en_core_web_md")withopen('cleaned-script.txt','r')asfile:text=file.read()doc=nlp(text)#createanentityfrequencymapentities={}#namedentitiesforentindoc.ents:#Printtheentitytextanditslabelifent.textinentities:实体[ent.text]+=1else:entities[ent.text]=1print("topentities{}".format(sorted(entities.items(),key=lambdakv:kv[1],reverse=True)[:30]))行间相似性在讨论每个字符最常见的动词时,我们意识到它们所用的动词非常相似,表达的是同一种感觉,这与分析名词得到的结论是不一样的。“go”(去)、“come”(来)这样的词,营造出人物想要去或到达某个地方的感觉和倾向;而像“kill”(谋杀)和“stop”(停止)这样的动词则暗示确实存在必须停止的巨大威胁。考虑到这个结果,为了继续研究相似度,实验提出计算分数来衡量每个字符的台词相似度。NLP中相似度的定义是描述两段文本的结构或句法意义之间相关性的度量——通常,相似度得分在0和1之间,0表示完全不同,1表示完全相似(或两段)文本完全相同)。从技术上讲,相似度是通过测量词向量(词的多维表示)之间的距离来计算的。如果有兴趣深入了解词向量,推荐搜索生成词向量的通用算法——word2vec。下图是每个角色的台词和对话的相似度矩阵。这张图再次证明乌木花胶真的是最独特的角色。这个结果可以用“惊喜还是惊喜!意义还是惊喜!”来形容。一方面,由于电影只有一个主要情节,对话中的相关性导致所有角色的对话相似度接近1是可以理解的。然而,没想到,他们的分数竟然如此接近。实验的研究预期是,至少灭霸的台词与其他英雄的台词不太相似。毕竟对于灭霸这样的反派,其他英雄都在不断的讨论如何阻止他。值得庆幸的是,蜘蛛侠的台词相似度分数是波动的;毕竟,他只是一个被称为拯救世界的上学途中的孩子,所以有这样的结果并不奇怪。以下代码演示了如何计算spaCy环境中两行对话之间的相似度:#forthefullexampleonhowIobtainedallthesimilarities#seethefullcodeat:https://github.com/juandes/infinity-war-spacy/blob/master/script.pyimportspacy#loadamedium-sizedlanguagemodelnlp=spacy.load("en_core_web_md")withopen('tony-script.txt','r')asfile:tony_lines=file.read()withopen('thor-script.txt','r')asfile:thor_lines=file.read()tony_doc=nlp(tony_lines)thor_doc=nlp(thor_lines)similarity_score=tony_doc.similarity(thor_doc)print("SimilaritybetweenTony'sandThor'sdocsis{}".format(similarity_score))电影结论《复仇者联盟3》,一群超级英雄踏上了阻止灭霸消灭宇宙一半生命的旅程。纵观影片,通过英雄们的表情,观众逐渐从字里行间了解到这些英雄们拯救世界的动机和动机。本文借助Python、NLP和spaCy,通过研究各种人物的台词,探索英雄和反派的表达和交流方式。通过观察他们最常用的动词、名词和语言特征,我们理解、确认和重温钢铁侠对地球的忠诚、奇异博士保护时间宝石的誓言、雷神的复仇渴望以及灭霸实现野心的决心。
