使用Python和IBM Watson可视化的个性简介

伟大的社会心理学家James Pennebaker曾经说过:“通过更仔细地观察人们用语言表达思想的方式,可以开始了解他们的个性,情感和与他人的关系。”他和许多其他心理学家,语言学家一起,自然语言处理(NLP)从业者在使用双向LSTM和NLU(自然语言理解)等高级技术从书面文本中推断出详细(和极其准确)的个性信息方面取得了很大进展。

最近,IBM Watson背后的开创性团队开发了一款名为Personality Insights的产品,旨在为商业用例分类个性。产品主页上的标语是:“通过书面文字预测个性特征,需求和价值。在个人层面和规模上了解客户的习惯和偏好。“虽然业务含义很明确,利用具有虚构特征的平台来实现通过以下方式对电影主角的个性特征进行分类将会很有趣。

数据

对于这个项目,利用了加州大学圣克鲁兹分校的大量电影语料库。语料库按类型细分,包含960个电影剧本,其中电影中的对话框已与场景描述分开。

https://nlds.soe.ucsc.edu/fc2

为了使数据准备好进行分析,需要进行大量的清洁和预处理。此外,数据存在一些结构性挑战。也就是说,需要分解并将每个引用/行与相应的字符相关联。

出于本文的目的,不会深入讨论整个预处理代码(对于那些感兴趣的人,可以在这里找到完整的笔记本)。但是将说明如何将角色/说话者与对话分开,然后将它们拼接成数据帧。

https://github.com/nicholassherwin/Natural-Language-Processing/blob/master/Project%204%20Final%20Notebook.ipynb

# regex to find and separate all characters in the scriptsspeaker = re.findall(r"([A-Z]+\s?[A-Z]+[^a-z0-9\W])",cleaned_df) # regex to find and separate all dialogue from the speakers/charactersdialogue = 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 linemovie_df = pd.DataFrame(list(zip(speaker, dialogue)), columns=['character', 'dialogue'])

接下来,需要将与每个角色相关的所有口语对话组合成一个列表。下面代码的输出将提供以逗号分隔的每个角色的完整对话:

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

IBM沃森

从这里开始,对话就可以放入IBM Watson笔记本中。请注意,要在IBM Cloud上注册,需要执行许多步骤。需要打开一个帐户,生成API密钥并下载python SDK。虽然步骤非常简单,但将保留未来帖子的设置(或者,IBM网站上的文档相对容易理解)。

https://github.com/watson-developer-cloud/python-sdk

https://cloud.ibm.com/docs/cli?topic=cloud-cli-getting-started

获得凭据后,为列表中的每个字符获取可视化的过程非常简单。以下是我们如何设置它:

from ibm_watson import PersonalityInsightsV3import json url = '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 in classifying>] profile = service.profile(text, accept='application/json').get_result() print(json.dumps(profile, indent=2))

上面代码的输出将吐出一个非常详细的读出想要分类的角色的个性特征。将看到输入文本中的单词计数,每个五大特征的每个百分位数,需求,以及每个主要五个特征的详细子特征(称为子项)。

但是,作为数据科学家,不想提出无聊的读数。相反想通过一些有吸引力的条形图来描绘这些特征。将列出这样做的代码,然后将输出现代时期一个更具标志性的电影角色的结果:Gandalf the Grey(和White!)。

# create a simple dataframe for needs/personality and percentile scoreresult = {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 of the personality profiledef 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 personality traitscreate_trait_plots(profile['personality']) # this will create a visualization for the children of the main big five personality traits[create_trait_plots(big5['children']) for big5 in profile['personality']] # this will create a visualization for the needs of the character in questioncreate_trait_plots(profile['needs'])

可视化Gandalf的个性

现在已经完成了功能,可以将整个Gandalf的对话输入IBM笔记本中,并看到他的个性可视化。

Gandalf的五大概况

Gandalf的需求

可以看到,Gandalf就像来的那样开放,在98%的某个地方。在硬币的另一面,他和他们一样内向,对在黑暗的图书馆中研究符文以及在Moria矿山深处的Balrogs进行战斗更感兴趣。

至于需求,没有一个巨大的信号。即使他的最高需求(好奇心和和谐)也没有达到第50个百分点。认为这是有道理的。除了需要一只老鹰从Isengard Tower的顶部拯救它们之外,巫师们大部分都是自给自足的!(遗憾的是,在这次IBM服务的迭代中没有需要列'eagles')

除了这个广泛的视角,还可以放大Gandalf的个性特征的儿童特征。看看发现了什么:

透明度

责任心

外向性

宜人

情绪范围

更有趣的发现!可以看到Gandalf在以下特征中位于第80和第100百分位之间:想象力,智力,艺术兴趣,利他主义,谦虚,同情和忧郁。同样看到Gregariousness和Outgoing的特征非常低。

虽然这个节目只能考虑对话而不考虑行动,但他们确实觉得与“指环王”电影中甘道夫的刻画非常一致。事实上,相信Gandalf本人,如果他能够看到这些结果,会产生以下反应:

结论

现在掌握了构建自己的个性分类器的知识,并以非常高的准确度输出一些漂亮,干净的可视化。

令人兴奋的是,能够根据书面文本提取有关个人的详细信息,虽然这个项目比任何事情都更有趣,但这样一个平台的实际应用既重要又多变。例如,可以输入个人的Twitter句柄并输出类似的详细和准确的个人资料。虽然这确实令人兴奋,但这也引发了一些关于隐私以及如何使用这些数据的道德问题。营销人员可以(并且已经)开始从个人资料中提取详细的个性信息,并使用这些信息以高度个性化的广告和“新闻”文章为目标。

然而,看到了这种技术更令人兴奋的应用。作为一名体验设计师,看到了一个未来,可以使用这种个性分类器制作定制和互动的叙事内容,并将个人的个性与其个性完全区别开来,以便拓宽自己的观点。

原文发布于微信公众号 - 相约机器人(xiangyuejiqiren)

原文发表时间:2019-09-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券