我分析了和女友5年的短信,发现了...

上个月我做了一个小研究,分析了我和我女朋友之间的聊天次数在过去五年中的变化,并得出了一些有趣的结论:比如我们一般在每天什么时候会发信息,同居对我们聊天次数的影响等等。

不过如果有关于文本分析的数据科学工具的话,我们就不用仅仅简单分析聊天的次数了,还可以做一些分析文本内容的研究。这些分析工具之间主要就复杂程度的不同而不同,在它们的帮助下,我们就可以知道哪些词在文本中最常见,而且还可以分析句子里的潜在情感。

首先,处理文本和处理其他数据一样,需要在一开始做一些数据清理和准备的基础工作。不过很开心的是,Python数据库的NLTK (Natural Language Took Kit)为我们分析文本提供了许多内置的关键函数和分析方法。

具体的处理方法是:

1.  删除停用词和标点符号:停用词是指句子中无实际分析意义的补充词(例如感叹词、虚词、助词等),不删除会使文本分析的统计量变得更多(例如“I”、“and”、“had”等是文本中经常出现的词,但他们对分析却没有实际意义)。另外标点符号也需要删除,因为通常情况下,Python并不知道“Hello!”和“Hello?”的区别,这对我们统计文本中的每一个词来说并没有什么帮助,甚至如果文本中都是小写的单词,统计起来就更方便了。

2.  根据语料库进行分词处理:这是获取句子中的每个有意义的词(字符串的形式)并将其转换为词频列表的过程。通过使用NLTK,我们就可以进行每个单词的频次计数。

3.  词形还原:基于语言学的规则,我们需要将分割过的单词还原成它们的原始形式。简单来说,就是把复数名词变成单数形式(比如“mice”变成“mouse”),把不同时态的动词变成不定式原形(“running”和“ran”变成“run”)。这有助于消除干扰,使我们更容易提取和识别文本中的情感。注意:NLTK的词形还原工具是一个非常完善的数据库,它可以处理英语语言中的很多特殊用法。

具体在Python上的操作代码如下图:

1.png

注意:我分别进行了两次分词和词性还原的过程,一次是处理我的聊天文本,另一次处理我女朋友的聊天文本。

接下来是文本分析的过程:

词频统计

首先我非常非常好奇的一件事情就是看看我和女朋友聊天记录中用的最多的单词是什么。我们可以用NLTK轻松实现:

2.png
3.png

不过,单单看这张图,除了能看出来,我最喜欢用的词是Yeah,她最喜欢用的词是Okay,并没有什么其他更有用的信息。(仿佛我俩是感情淡漠的老夫老妻😂)

在我之前的研究中,我发现我女朋友比我更喜欢使用表情符号,所以从理论上来说,我还可以分析我们聊天记录里常用的表情符号。但是事实上我很少使用表情符号,一般情况下,我只会在简单地向我女朋友表达“是的”这个意思时才会用到表情,所以我只统计了我的女朋友的表情符号使用频次。

4.png

可以看出我的部分(蓝色部分)完全没有表情符号。

有时候用语料库来分析文本词频时,统计很短的短语的使用频次可能更能得出有趣的结论,所以我又统计了我们两个人最常用的相邻的两个词的频次(或者叫“双连词”),这个同样可以用NLTK来实现:

(“Jó éjt” 在我女朋友的母语(匈牙利语)中是晚安的意思)

(“Jó éjt” 在我女朋友的母语(匈牙利语)中是晚安的意思)

这样处理,就可以有一些有趣的解读了:

  • 蓝色柱状图里,“Oh god”的频次进了前十,看得出“Oh god”比“Oh”更能传达我的感受;

  • 有些双连词我和我女朋友都用的比较频繁,像是“Okay Okay”“Jó éjt”,“Jó éjt”是我们会在睡觉前会固定使用的短语;

  • 我女朋友前两大双连词里有四分之三的单词是由“Okay”组成的。

这里就不得不提到PMI(Pointwise Mutual Information)的概念了。这是在分析语料库时衡量两个词之间相关性的一种方法:

P=log(p(a,b) / ( p(a) * p(b) ))

像“ok”和“Good”这样的词可能PMI得分会很低,因为它们会与其他词以双连词的形式出现很多次,也就是P(a)或P(b)值会很高。然而,像“Puerto”和“Rico”这样的词PMI得分就会比较高,因为它们很少独立出现,也很难有机会和其他词以双连词形式出现。只可能以Puerto Rico的形式,也就是P(a)或P(b)的值比较低。

让我们来看看怎么用Python中的NLTK来计算PMI:

7.png

了解单词之间的相关性可以让数据科学家更好地理解文本中的潜在含义。我也用这个方法统计了我们聊天记录中一些PMI得分比较高也有趣的常见双连词。

8.png

我的常用词与吃什么(“Stir fry”、“Sweet potato”、“Ready meal”)和工作内容(“South african”、“Base report”、“Key finding”、“Holy shit”)更有关;而我女朋友喜欢描述一些地点(“Leicester square”、“King cross”、“Canary Wharf”、“Passport control”),以及告诉我把钱存进我们的联名账户(“Joint account”)。

情感分析

虽然词频统计能让我们对文本内容有一些了解,但我们无法从频次的维度感受到文本传递的情感。我明显在聊天过程中谈论了很多South African,但从中并看不出我对南非的想法或是感受。

为了进一步分析这种文本背后的潜在情感,我们可以使用程序包VADER。

VADER(Valence Aware Dictionary and sEntiment Reasoner)是一种基于词汇和规则的情感分析工具,针对社交媒体评论进行情感分析,也可以用于其他文本分析。

用VADER来分析我们聊天文本中的潜在情感再合适不过了,具体操作如下:

9.png

对于一个特定的字符串,VADER可以从情感词的字典中给出以下测量值:

pro:积极情感得分

neg:负面情感得分

neu:中性情感得分

Compound:综合情感得分,标准化数据使其符合正态分布。

VADER最厉害的地方就在于它能根据前后单词推断出句子的情感,比如下面两个例子:

10.png

VADER会清楚的知道‘great’后如果有‘not’,那么这句话的情感的正负性会发生改变;它还可以分析出标点符号(例如大量的感叹号)、表情符号俚语所在句子的情感正负性

为了便于分析,我分别分析了我和我女朋友的聊天文本,然后按天分组。也就是说,我会把某一天的聊天文本全部放在一个段落里,然后把我女朋友当天的聊天文本放在另一个段落里,这些段落都可以在Python里用SentimentIntensityAnalyzer来分析。

我们先来看看某一天中积极情感值和消极情感值在当天文本段落中的比例

在下面的散点图中,每个点都代表了我和我女朋友每一天聊天文本的情感值,每个点的坐标都是由我们每天的聊天文本里情感值的正负值的比例决定的。注意:图中没有计算中性词

高于直线的点表示使用消极词汇比积极词汇多的天数;靠近左下角的点代表用非常中性的语言的天数。

我们注意到粉红色的点(代表我女朋友的聊天文本)更靠右,表明她喜欢用更积极的词语。与此同时,我们也可以看到,粉色点比蓝色点普遍处在略高的位置,这表明她使用的词语也会比我更消极。相反,我的语言倾向于情感中立,集中在散点图直线的左下方。让我很开心的是,在x轴上(也就是y轴=0时)有许多点,这些点代表这些天我们聊天时使用的词汇是没有任何负面情绪的。

从图中也可以看出,随着时间的推移(2015年至2020年),我们聊天的词汇变得不那么“积极”了。这可能是因为同居后我们面对面交谈的时间更多,聊天的内容更偏向功能性(比如Can you buy sweet potatoes on the way home?),从情感上看是更中立的。

下面我们将相同的数据用时间序列来绘制,红色轴线上方的高度表示在给定的一天中积极词汇的比例,而红线下方的负高度表示消极词汇的比例。

结果和我想的差不多,我们聊天的用词在同居后变得不那么积极了(第一个红色虚线以后),因为我们面对面的聊天更多。在过去的五年里,我们用词的消极比例一直保持着相对的一致性(我女朋友比我更喜欢说消极的词),值得一提的是,我的用词唯一比她更积极的时期是在我辞职之后(第二个红色虚线以后),应该和我辞职这件事是有相关性的。

当然,VADER最厉害的是可以计算综合情感值,根据特定的字符串来计算标准化的情感值(范围-1~1),我还是用时间序列来呈现:

13.png

和上面的时间序列图一样,即使用移动平均的方式绘制,也能看到明显的波动。事实上,有些明显的起伏可以让我联想到那段时间我和我女朋友发生过的一些非常具体的事情,比如她在2017年第三季度和2019年的第四季度综合情感值是呈下降趋势的,又比如2019年第三季度,在我买了一只小猫后,我的综合情感值明显在上升。

从我简单的分析中可以看出,文本数据非常有分析的价值,我们每天的情绪好坏程度是可以从每天产生的大量的文本数据中推断出来的。

作为数据分析从业者,如果只会数值数据的分析,只能回答“what”的问题,那显然你的技能还不全面。海量的文本信息里有大量的洞察可以帮助我们回答“why”的问题。如果你也想利用自然语言处理进行高效的文本分析,那么千万不能错过MarTechApe携手谷歌美国软件工程师、东南亚独角兽公司Grab的资深数据科学家,共同打造《Python自然语言处理》课程,教你从0到1地学会应用超级广泛的NLP技术!

Screen Shot 2020-05-21 at 12.04.25 PM.png

1. 来自Google和Grab的课程主讲老师

2. 理论与实践相结合的课程安排

这门课共分6章节,每章节都由理论课程与编程实践两部分组成。确保每一位学员可以学以致用、真正理解课堂内容。在完成课程后,学员不仅对自然语言处理有了一定的掌握,同时也熟练运用Python编程语言。

完整的课程大纲

15.png
nlp syllabus.jpg

3. 课程适合人群与学员收获

适合人群

  • 想要系统性学习自然语言处理,了解如何应用NLP解决文本分析问题的人

  • 想学习如何用Python做数据科学项目的人

  • 想在数据科学、人工智能等领域,找到职业方向的人

  • 想进入高科技公司的人

  • 虽然从没有过数据科学经验,但是想要用数据科学前沿技术来提升自己工作能力与求职竞争力的人(尤其是,当你的工作需要经常与用户调研、定性研究、文本分析打交道时,NLP可以大大提高你的工作效率!)

  • 在工作/学习中需要与自然语言处理打交道的人(尤其推荐工作中负责AI产品的人来报名课程)

  • 希望从其他行业领域转型到数据科学的人

你将获得

  • 来自Google美国与Grab新加坡的资深数据科学家的一手经验输出

  • 丰富的行业洞察与NLP的实际案例

  • 理论和动手实践相结合,掌握典型自然语言分析的底层逻辑

  • 在课程中完成一份自己的NLP语义分析与主题模型

  • 课程结束后,可以将完整的数据科学工作方法运用到感兴趣的数据集上

  • 获得数据岗位资深面试官的内部分享,助力数据科学的求职进程

4. 新课上线,预售优惠!

课程原价:¥399人民币

预售优惠(双人团购)6折优惠:仅需¥239人民币

预售期:5/20~6/20,之后恢复原价

官网购买通道

*预售团购不接受美元支付。

*预售团购不接受美元支付。

5. 常见问题

课程形式是怎样的?

  • 录播课程可随时随地轻松上课,永久回放

  • 移动端、桌面端两种方式观看课程

  • 可获得完整的课件、丰富的课外阅读材料

课程上线时间是?

  • 第一课将于6月13日上线,此后每周日上线新一章节的课程,共6周解锁所有课程

  • 对于每一章节的课程,上线后,学员可自行选择学习时间

遇到课程问题如何咨询?

  • 可在班级群内提出课程内容问题并获得解答

还等什么,快来一起走进自然语言处理的世界吧!

23.png