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