用spaCy自然语言处理复盘复联无限战争(下)
2019年05月27日 由 sunlei 发表
324891
0
在昨天的文章中,为了我的命题用spaCy自然语言处理复盘复联3中我们分析了电影中排名前十的动词、名词、副词和形容词以及由特定角色说出的动词和名词。今天我们继续聊聊排名前30的实体。
前文回顾:用spaCy自然语言处理复盘复联无限战争(上)
命名实体
到目前为止,我们已经探索完成了我们的英雄和反派一直在这部史诗电影中最常使用的动词、名词、副词和形容词。然而,要充分理解我们一直在研究的所有这些词,我们需要联系一些上下文,即命名实体。
我引用spaCy的网站上的话,命名实体是“指定了名称的真实对象——例如,一个人、一个国家、一个产品或一本书的标题。”所以,了解这些实体,意味着了解角色在说些什么。在spaCy程序源库中,实体都有一个预测的标签,该标签将实体分成人、产品、艺术词汇等等类型,从而为后续实验提供额外的粒度级别,有助于对实体进行进一步分类。但是,为了简化过程,本次实验中将使用实体本身而不是实体分类。
这些是出现次数排名前30的实体。
[caption id="attachment_40706" align="aligncenter" width="1280"]
“MATEFAYA HU”(必胜)是瓦坎达贾巴里部落战士战斗前的口号。[/caption]
首先,考虑到整部电影有关于灭霸的,所以他出现次数多这一点也不奇怪。紧随其后的是他的女儿卡魔拉,她也是影片中的核心人物之一。然后在第三位,格鲁特(不需要解释为什么吧?),紧随其后的是托尼和其他复仇者,以及一些地点,如纽约,阿斯加德和瓦坎达(瓦坎达万岁)。除英雄名称和地点外,六颗原石——时间之石和灵魂之石——出现在这个列表上(分别位于第14位、第15位和第16位)。令人惊讶的是,将灭霸带到地球上的心灵之石不在名单之列。
可以通过下面的代码读取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]))
台词对白间的相似性
当我们讨论每个角色的最常用动词时,我们意识到大多数动词非常相似,表达了相同的感觉。像“去”、“来”这样的词语给我们一种运动的印象,或者角色想要去或到达某个特定的地方的感觉,而像“谋杀”和“制止”这样的动词暗示着,确实有一个巨大的威胁必须被阻止。
考虑到这一点,为了进一步研究相似度的概念,我计算了每对角色的口语台词之间的相似度评分。
NLP中相似度的定义为,描述两段文本的结构或句法涵义有相关性的度量——通常,相似度得分在0到1之间,0表示完全不同,1表示完全相似(或者两段文本是相同的)。从技术上讲,相似性是通过测量单词向量之间的距离来计算的,即单词的多维表示。对于那些有兴趣进一步了解这个主题的人,我建议搜索word2vec,这是生成这些单词嵌入的最常用算法。下图是相似矩阵。
[caption id="attachment_40707" align="aligncenter" width="1320"]
这个图再次证明,乌木喉真的是最独特的角色。[/caption]
这个结果可谓是“惊不惊喜!意不意外!”了。一方面,由于这部电影只有一个主要情节,所以可以理解,对话中的关联性导致所有的角色的台词对白相似性都接近于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的帮助下,本文通过研究各个人物的台词,探索了英雄和反派进行表达和交流的方式。通过观察他们最常用的动词、名词和语言特点,我们了解、确认并重温了钢铁侠对地球的忠诚、奇异博士保护时间宝石的誓言、雷神对复仇的渴望以及灭霸完成自己野心的坚决。