小言_互联网的博客

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

598人阅读  评论(0)

全文共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 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 Watson

图源Unsplash,由Vasundhara Srinivas提供

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

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

from ibm_watson import PersonalityInsightsV3
import 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))

上述代码输出后,会读出分类目标的详细性格特点。在输入的文本中,我们会看到单词计数(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 of
 the 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 personality
 traits
create_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
 question
create_trait_plots(profile['needs'])

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

图源Unsplash,由Thomas Schweighofer提供

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

甘道夫的五大性格介绍

甘道夫的需求情况

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

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

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

开放性

 

自觉性

外向性

一致性

情绪波动范围

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

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

来源:giphy.com

结语

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

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

留言 点赞 关注

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

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


转载:https://blog.csdn.net/duxinshuxiaobian/article/details/102132479
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场