全文共4301字,预计学习时长9分钟

图源Unsplash,由Marko Blažević提供

著名心理学家詹姆斯· 彭内贝克曾说:“仔细观察人们通过语言表达思想的方式,会感受到他们的性格特征、情感变化以及与外物的一些联系。”他同诸多心理学家、语言学家和自然语言处理(NLP)从业人员一起研究了书面文本,借助双向LSTMs和NLU(自然语言理解)等先进技术得到了更准确的人格反馈,取得了重大进展。

前不久,IBM Watson的开发团队研发了一款叫做“性格洞察(Personality Insights)”的产品,用于商业用途,可以对人格特征进行分类。产品主页的标语是:“根据书写文本预测人格特征、个人需求和价值高低。大规模地了解每位客户的习惯与偏好。”既然该技术的商业用途很强,那利用其处理影片中主要人物的对话从而对人物性格特征进行分类,应该很有意思。

数据

为了这个项目,笔者调用了加州大学圣克鲁斯分校的影视资料库(https://nlds.soe.ucsc.edu/fc2)。资料库根据体裁划分出了不同的影视区域,共有960个电影脚本,其中的对话片段也从场景描述中分离了出来。

为了准备好分析所需的数据,要进行相当规模的清理及预处理过程。此外,处理时会遇到一些数据结构上的挑战。也就是说,需要拆分它们,再将每句话与相应的人物联系起来。

考虑到这篇文章的内容,笔者并不打算深入介绍预处理代码(完整笔记:https://github.com/nicholassherwin/Natural-Language-Processing/blob/master/Project%204%20Final%20Notebook.ipynb)。

不过,接下来笔者会阐述如何通过对话区分人物或讲话者,最后再如何将这些人物特性整理压缩到一个数据帧中。

# regex to find and separate all characters in the scripts
speaker = re.findall(r"([A-Z]+\s?[A-Z]+[^a-z0-9\W])",cleaned_df)# regex to find and separate all dialogue from the speakers/characters
dialogue = re.compile('[A-Z]+\s?[A-Z]+[^a-z0-9\W]').split(cleaned_df)
[1:]# create a dataframe that marries the character with each dialogue line
movie_df = pd.DataFrame(list(zip(speaker, dialogue)), columns=
['character', 'dialogue'])

接着,需要把所有有声对话与每个人物联系起来并添加到列表中,下面代码的输出结果会呈现各个角色的所有对话,对话会用逗号隔开:

#just putting a single character name for this post. Would write upentire list to compile all characters.
char_list = ['Gandalf']dialogue_list = []#creates separate df for each charfor charin char_list:
char_df = movie_df[movie_df['character'] == char]#get all dialogue and add it together to make one dialoguedialogue = ' '.join(char_df['Dialogue'].values)dialogue_list.append(dialogue)

IBM Watson

图源Unsplash,由Vasundhara Srinivas提供

现在开始,我们的对话会被放到IBM Watson记录本中。注意注册IBM云端时会需要经过几个步骤:开账户,生成API密钥,并下载安装python SDK。虽说步骤十分简单,笔者还是会保存下来以便用于接下来的一篇文章(或者可以到IBM网站上浏览文件,理解起来相对容易一些)。

只要有了接口,对列表中每个人物角色进行可视化就会非常简单。这是设置的方法:

from ibm_watson import PersonalityInsightsV3
import jsonurl = 'https://gateway.watsonplatform.net/personality-insights/api'
apikey = '<your API key>'
service = PersonalityInsightsV3(url=url, iam_apikey=apikey,version='2017-10-13' )
text = [<the full text of the character we are interested inclassifying>]profile = service.profile(text, accept='application/json').get_result()print(json.dumps(profile, indent=2))

上述代码输出后,会读出分类目标的详细性格特点。在输入的文本中,我们会看到单词计数(word count)、大五类人格特征、需求以及五个主要性格中每一个具体的子特征(称为子特征)。

不过作为数据科学家,我们不想给大家呈现枯燥无味的读出数据,更希望用有吸引力的表格将人物性格可视化。因此笔者会以当代电影中最具代表性的一个角色——灰袍甘道夫(Gandalf the Gray)(《霍比特人》和《指环王》中的主要人物)为例,列出代码并输出结果。

def create_spectrogram(signals):# create a simple dataframe for needs/personality and percentile score
result = {need['name']:need['percentile']for need in profile['needs']}
df = pd.DataFrame.from_dict(result, orient='index')
df.reset_index(inplace=True)
df.columns=['need', 'percentile']# create a function so that we can easily visualize all sub-elements ofthe personality profile
def create_trait_plots(traits):result = {trait['name']:trait['percentile']for trait in traits}df = pd.DataFrame.from_dict(result, orient='index')df.reset_index(inplace=True)df.columns = ['name', 'percentile']plt.figure(figsize=(15,5))ax = sns.barplot(y='percentile', x='name', data=df)ax.set(xlabel='trait', ylabel='percentile')plt.show# this will create a visualization for the main big five personalitytraits
create_trait_plots(profile['personality'])# this will create a visualization for the children of the main bigfive personality traits
[create_trait_plots(big5['children']) for big5 inprofile['personality']]# this will create a visualization for the needs of the character inquestion
create_trait_plots(profile['needs'])

将甘道夫的性格进行可视化

图源Unsplash,由Thomas Schweighofer提供

既然工作都准备到位了,就可以把甘道夫的所有对话都放到IBM记录本中,完成性格的可视化操作。

甘道夫的五大性格介绍

甘道夫的需求情况

有个很有趣的现象!甘道夫确实和看上去一样开朗,而且开朗性格占比约98%;但他也有内向的一面,比如会更喜欢在没有灯的图书馆里学习,或是在莫利亚的矿井深处与黑魔对抗。

看看甘道夫的需求,没有什么突出的特征。就连他的最大需求(好奇与和谐)占比也没有达到50%,我想是有道理存在的。对于困在艾辛格塔塔尖上的巫师来说,除了偶尔需要一下鹰,大多数时候是可以自己解决生存问题的!(很遗憾IBMs这款软件中的需求项没有“鹰”这一列)

这个例子比较宽泛,其实还可以放大甘道夫的性格特点,了解他孩子天性的那一面。看看发现:

开放性

自觉性

外向性

一致性

情绪波动范围

这些发现更加有趣了!甘道夫性格特征中占比在80%到100%之间的有:富于想象、机智、有艺术细胞、舍己为人、谦逊、有同情心以及忧郁气息。与之前结果相似,而傲慢与外向的占比则很低。

虽然这个项目只考虑到了对话内容而未考虑到行为动作,大家依然觉得呈现的人物形象与《指环王》中的甘道夫基本一致。的确,笔者相信换作是甘道夫自己看到这些结果,也会有下面的反应:

来源:giphy.com

结语

现在大家已经了解这些知识了,可以为自己的性格特征搭建一个分类器,看看高精确度下输出的可视化性格,直观又明了。

人们能够根据书面文本提炼出如此具体的个人信息,举个例子,输入一个人的推特账号,就可以得到像上文我们讨论过的信息一样细致准确的简历。尽管这确实鼓舞人心,可还是会引起一些关于隐私以及数据使用方面的伦理问题。市场可以(已经开始)通过简历提取我们的性格信息,再有针对性地给我们推荐个性化广告和“新闻”文章。

留言 点赞 关注

我们一起分享AI学习与发展的干货
欢迎关注全平台AI垂类自媒体 “读芯术”

(添加小编微信:dxsxbb,加入读者圈,一起讨论最新鲜的人工智能科技哦~)

用Python与Watson,将《魔戒》甘道夫的性格可视化!相关推荐

  1. 【甘道夫】MapReduce实现矩阵乘法--实现代码

    之前写了一篇分析MapReduce实现矩阵乘法算法的文章: [甘道夫]Mapreduce实现矩阵乘法的算法思路 为了让大家更直观的了解程序运行,今天编写了实现代码供大家參考. 编程环境: java v ...

  2. 【甘道夫】Win7x64环境下编译Apache Hadoop2.2.0的Eclipse插件

    目标: 编译Apache Hadoop2.2.0在win7x64环境下的Eclipse插件 环境: win7x64家庭普通版 eclipse-jee-kepler-SR1-win32-x86_64.z ...

  3. 【甘道夫】Win7x64环境下编译Apache Hadoop2.2.0的Eclipse小工具

    目标: 编译Apache Hadoop2.2.0在win7x64环境下的Eclipse插件 环境: win7x64家庭普通版 eclipse-jee-kepler-SR1-win32-x86_64.z ...

  4. 【甘道夫】Geohash基础应用By Python

    介绍Geohash基础概念的文章很多,我就不拷贝粘贴了,我只用最简单的理解概括: Geohash用作坐标的索引,可大幅提升搜索坐标相关数据的效率.结合相邻9宫格的geohash,可以快速检索指定坐标附 ...

  5. 【甘道夫】Hadoop2.2.0 NN HA具体配置+Client透明性试验【完整版】

    引言: 前面转载过一篇团队兄弟[伊利丹]写的NN HA实验记录,我也基于他的环境实验了NN HA对于Client的透明性. 本篇文章记录的是亲自配置NN HA的具体全过程,以及全面測试HA对clien ...

  6. 【甘道夫】CDH5.2的Maven依赖

    之前一直结合Maven开发Hadoop2.2.0的程序.环境换成CDH5.2后报错,发现是Maven依赖库的问题. 之前一直使用 http://mvnrepository.com/ 查找maven依赖 ...

  7. 【甘道夫】HBase基本数据操作的详细说明【完整版,精绝】

    介绍 之前具体写了一篇HBase过滤器的文章.今天把基础的表和数据相关操作补上. 本文档參考最新(截止2014年7月16日)的官方Ref Guide.Developer API编写. 全部代码均基于& ...

  8. 甘道夫,一种用于安全部署的端到端分析服务 Gandalf, an end-to-end analytics service for safe deployment

    Presentation Video:https://www.usenix.org/conference/nsdi20/presentation/li PDF:https://pdfs.semanti ...

  9. 【甘道夫】基于scikit-learn实现逻辑回归LogisticRegression

    难得有不涉及机密,同时又有一定记录价值的收获,记录下来,以备查阅. 欢迎转载,请注明出处: http://blog.csdn.net/u010967382/article/details/502252 ...

最新文章

  1. Windows Server 2008 R2安装子域控制器
  2. python装饰器实例-python装饰器案例
  3. (23)zabbix单位符号Unit symbols
  4. [导入]ASP.NET断点续传和多线程下载
  5. 论文笔记:Matrix Completion in the Unit Hypercube via Structured Matrix Factorization
  6. java面向对象(二)之继承
  7. 什么是量子计算机?用一个简单例子来解释
  8. BZOJ2819 Nim(DFS序)
  9. css提取页面元素唯一性_下面这个函数,能够获取一个元素的任意 CSS 属性值。...
  10. 计算两个日期相差天数的最简洁的代码
  11. 手机wps列怎样转成行_为什么有人不用免费的WPS,偏要花钱用Office?看完这些就知道了...
  12. C#虚基类继承与接口的区别
  13. spring catch了异常还是回滚了_干货:Spring 踩坑之@Transactional 神奇失效
  14. C#读取或设置ScrollLock
  15. abaqus2018安装教程win10_win10系统安装Abaqus2016全攻略
  16. Android studio - UI 界面设计(仿问卷星登陆注册界面)
  17. DVWA Contradiction #01
  18. html5 自动分享到朋友圈,html5手机端分享微信朋友圈代码
  19. NFS服务器的配置与管理
  20. dijkstra习题集

热门文章

  1. 法国亚马逊被迫关闭仓库
  2. Linux PCI网卡驱动的详细分析
  3. HTML——flex布局
  4. HTML5--制作导航栏
  5. 算法题解 —— 链表(6-10)
  6. JAVA LocalDateTime 获取当前年份的开始时间和去年开始时间
  7. oracle lag group,Oracle中的lag()和lead()函数的简单用法(统计增长率)
  8. WiFi基本概念(一)WiFi和互联网
  9. 告诉你十一个腰椎间盘突出症的锻炼方法
  10. CycleGAN:Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks