使用 Python 进行聊天数据分析的技术
原文:
towardsdatascience.com/techniques-for-chat-data-analytics-with-python-4c15d3f5498c
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/7eed45a450484b43285ccc3f99b0ef63.png
和从 Pexels.com 获得](…/Images/7eed45a450484b43285ccc3f99b0ef63.png)
图片由迈克奇·埃斯帕拉戈萨提供,并从 Pexels.com 获得
多年来,我们的沟通变得越来越数字化。无论是通过聊天应用发送的快速文本消息还是发送电子邮件,数字信息已经深深嵌入到我们的日常生活中。这导致产生了大量的数字化数据。由于沟通涉及至少两个人,它可以揭示关于参与者及其相互关系的许多见解。
本文将是系列文章的第一部分,我将向您展示您可以使用聊天完成的一些酷炫事情以及您可以从它们中获得的个人见解。您可以在我的GitHub 个人资料上找到我创建的用于可视化的 Python 代码和任何 Tableau 文件。
目标
由于这是系列文章的第一篇,我想从对 WhatsApp 聊天元数据的高级分析开始。我将即将进行的分析命名为通信密度分析,因为可视化的主要特征来自于发送消息的密度。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/1bef3cdda5ed1351884c8405e31fc995.png
图片由作者提供
这张事件图显示了一个人工创建的人物,我们可以称他为 John,以及他的五位最亲密的聊天伙伴之间的沟通,我们最初将他们称为 A、B、C、D 和 E。稍后,我会揭示这五个人的身份,并解释 John 与他们的关系。
在事件图中,每一行代表一条消息。不同的行显示各自的聊天。绿色越深,聊天中个人之间交换的消息就越多。如果线条变成金色,则表示有沟通,但发送的消息很少。
这种分析有趣的地方在于,它可以提供关于您正在检查的聊天中的人的见解。例如,我们看到与人物 A的聊天大约始于 2022 年 2 月,并迅速变得相当频繁。这个聊天中没有间隔或空白,因此我们可以假设有密集的日常沟通。难道是约翰开始与某个人交往,这个人已经成为他生活中非常重要的人吗?
不仅你可以洞察某人可能的女朋友或男朋友是谁,并识别人们相遇的时间,你还可以检测个人之间的冲突。例如,B经常与 John 沟通,但强度在 2022 年 2 月突然下降,这时数字联系突然中断。这可能是 John 在那时与B发生了严重的冲突吗?也许他开始在这个时期与A更频繁地沟通只是一个巧合——这个冲突可能与A有关?当然,沟通空档可能有多种解释,但我们确实可以看到数据中发生了某些事情,并且可以识别出可能的关系。
然而,大约一年后,John 和B经历了另一个沟通空档,随后是密集和频繁的沟通。C似乎一直参与频繁且强度高的沟通,这种强度随着时间的推移也在增加。他们的沟通中存在一些空档,这表明这可能不是每天的沟通,而是定期和频繁的——可能类似于与最好的朋友沟通。
D和E在与 John 沟通的强度上表现出相似的规律。当他们沟通时,他们倾向于发送更多的信息。然而,与D的沟通似乎发生的频率较低,尽管他们可能都是好朋友或家庭成员。
现在我们已经分析了数据,让我们揭晓隐藏在 A、B、C、D 和 E 背后的个人身份:
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/89aceac6da739bcc3b7a74ec8020b604.png
作者图片
事实上,A实际上是 John 的女朋友,他在 2022 年 2 月第一次见到她。B是他的最好的朋友,在与新女朋友相处更多时间并重建关系后,他与B失去了联系。大约在 2023 年 2 月,他们发生了争执,一段时间内又失去了联系。看起来 John 经常与他的妈妈沟通,但与他的妹妹沟通的频率较低。最后,E是他的老同学,他们有时会有沟通的空档,但他们总能找到彼此。
现在你已经看到了你可以生成的见解,我建议你用自己的信息尝试一下。我用我的一些 WhatsApp 聊天进行了测试,看到分析结果非常令人着迷。为了让你更容易操作,我现在将向你展示如何用你自己的数据创建可视化。
如何创建事件图?
第一步当然是获取数据。我个人是用 WhatsApp 做的。为此,你可以在这里找到一份简单快捷的说明,说明如何获取你的数据。如果你已经下载了它,你会得到看起来像这样的文本文件
16.01.24,15:13-John Snowisa contact.16.01.24,15:13-John Snow:<Media Excluded>16.01.24,15:13-John Snow:Hi! How are you?😀16.01.24,15:16-Maria:Hey,I'm doing well,thanks! How about you?16.01.24,15:17-John Snow:I'm good too,just been busywithwork lately.16.01.24,15:19-Maria:I can relate! Anything exciting going on?16.01.24,15:21-John Snow:Not much,just trying to catch upwitheverything.What about you?要创建事件图,我们需要提取消息、日期、作者和聊天以生成可视化。正如你所见,还有一些保存的文本说“X 是联系人”或“*”。我们将在未来过滤掉这些行。请注意,由于你的消息传递器可能设置为不同的语言,它可能使用需要过滤掉的不同表达。我将在接下来的代码中解释你可以在哪里输入你的表达式(如果需要的话)。但首先,让我们检查表结构,看看它应该看起来如何以创建事件图。
*https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/4809c5a1f5a4ad10c4cde424df655a0b.png
作者提供的图片
我们有日期列,它包括消息发送时的小时和分钟。在我们的例子中,我们在 Maria 聊天中聊天,作者有 John 和 Maria。如果你将其应用于群组,可能会有不止两个作者。在消息列中,将收集消息,这为分析提供了惊人的可能性。然而,这些将在本系列的后续部分中探讨。
要开始转换并将文本文件转换为结构化格式,我们首先需要加载数据。
importpandasaspdimportglobimportos folder_path=r"C:UsersRobinWhatsapp_chats"#Enter your folderpath Folder path here# Returns a list with all file_paths in the folder with .txt endingall_files=glob.glob(os.path.join(folder_path,"*.txt"))# Create empty list for DataFramesdfs=[]因此,我们首先导入必要的库,并定义文件夹路径,其中我们的聊天以文本文件的形式保存。然后我们想要一个包含文件夹中所有聊天文件路径的列表,这些文件以 txt 结尾。因此我们创建了一个 all_files 变量。在第三步中,我们为将要收集的数据帧创建一个空列表。
# Read all filed, add the file name as column and append these to the list dfsforfileinall_files:df=pd.read_csv(file,sep='t',engine='python',header=None,names=['Text'],on_bad_lines='warn',encoding='utf-8')df['Filename']=os.path.basename(file)# Dateiname hinzufügendfs.append(df)# Combine all DataFrames with the concat command.chat=pd.concat(dfs,ignore_index=True)现在我们已经将所有聊天数据加载到一个 DataFrame 中,还有两件事要做:
过滤掉不包含消息的行。
将数据拆分为日期、聊天、作者和消息列。
对于过滤,我们将使用一个简单的正则表达式、一个字符串匹配函数和一个特定字符串包含函数。
# Define Pattern for Message rowspattern=r'd{2}.d{2}.d{2}, d{2}:d{2} - .+: .*'# Filter the rowschat=chat[chat['Text'].str.match(pattern)]chat=chat[~chat['Text'].str.contains(r'(<Media Excluded>|null)')]第一个过滤器排除所有不符合正则表达式定义模式的行。这样,我们就消除了像“John Snow 是联系人”这样的行。
第二个过滤器移除所有包含“null”或“.”等表达式的行。实际上,所有语音消息都将被替换为“null”。我发现这些消息没有兴趣,但如果你对此感兴趣,你可以简单地从过滤器中删除“null”表达式。如果你还有其他想要排除的行,请将它们添加到 str.contains 表达式中。
在第二步中,我们只需要拆分列。为此,我们将使用一些拆分操作,然后过滤到感兴趣的列。
# Extract Datechat['Date']=chat['Text'].str.split(' - ').str[0]# Extract Authorchat['Author']=chat.apply(lambdarow:row['Text'].replace(row['Date']+' - ',''),axis=1)# Extract Chat - Adjust "WhatsApp-Chat mit " with your filename patternchat['Chat']=chat['Filename'].str.replace('WhatsApp-Chat mit ','').str.replace('.txt','')# Split Author column to Author and Messagechat[['Author','Message']]=chat['Author'].str.split(': ',n=1,expand=True)# Filter relevant columnschat=chat[['Date','Author','Message','Chat']]我想在这里提一点:当我提取我的 WhatsApp 聊天时,文件名以德语模式保存。在我的情况下,是“WhatsApp-Chat mit Maria.txt”。为了创建聊天列,我只是提取了文件名作为一个额外的列,并移除了“Maria”的左右部分。你可能需要根据你的语言进行调整。
在此之后,你的聊天将以表格形式呈现。你只需要从我的 GitHub 个人资料下载我的 Tableau 文件,编辑数据源,并将其替换为你的数据。
在我的另一篇文章透明的人类中,我已经展示了当特定数据被用来回答关于个人的个人问题时,它可能有多么危险,可能导致操纵。如果你应用本博客中的技术来分析特定的聊天,请确保你获得了对方的同意,因为这种分析可能会揭示他们可能不希望你知道的见解。这样,我们必须尊重他人的隐私。
结论
在本系列的第一个部分,我们探索了 WhatsApp 聊天分析的迷人世界,强调了元数据如何揭示关于人际关系的重大见解。通过考察沟通密度和模式,我们可以揭示诸如新关系的出现、潜在的冲突以及随着时间的推移友谊的起伏等动态。
当你开始自己的聊天分析之旅时,我鼓励你带着好奇心和责任感去面对。下载提供的 Tableau 文件,应用所讨论的技术,看看你的聊天能讲述哪些故事。
感谢你坚持看到最后!如果你喜欢这次关于聊天分析的冒险之旅,请鼓掌或点击关注按钮——你的支持让我充满活力和灵感!在下一篇文章中,我将更深入地探讨主题提取:你和你朋友们最常写些什么?准备好一些激动人心的见解吧!直到那时,祝你们聊天愉快!*
