当前位置: 首页 > news >正文

Python 进行聊天数据分析的技术

原文:towardsdatascience.com/techniques-for-chat-data-analytics-with-python-cfdbea358123

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/174ad7146ac02e7b158a1fba3330b569.png

图片由Mikechie Esparagoza提供,并从 Pexels.com 获取

在本系列的第一个部分,我向您介绍了我的艺术创造的朋友约翰,他非常友好地为我们提供了他与生活中五位最亲近的人的聊天记录。我们仅使用了元数据,例如谁在何时发送消息,来可视化约翰何时遇见了他的女友,何时与他的一个最好的朋友发生争执,以及他应该更频繁地给哪些家庭成员写信。如果您没有阅读本系列的第一个部分,您可以在这里找到它。

我们尚未涉及但我们将更深入探讨的是对实际消息的分析。因此,我们将使用约翰和玛利亚之间的聊天来识别他们讨论的主题。当然,我们不会逐条查看消息并进行分类——不,我们将使用 Python 库 BERTopic 来提取聊天围绕的主题。

什么是 BERTopic?

BERTopic 是一种由 Maarten Grootendorst 引入的主题建模技术,它使用基于 transformer 的嵌入,特别是 BERT 嵌入,从大量文档集合中生成连贯且可解释的主题。它旨在克服传统主题建模方法(如 LDA(潜在狄利克雷分配))的局限性,这些方法通常难以处理短文本或在不同的文档集合中产生一致的主题。

在这篇博客中,我不会深入探讨 BERTopic 的理论背景——如果您对此感兴趣,我强烈推荐 BERTopic 传奇人物本人撰写的以下文章:

  • 使用 BERT 进行主题建模

  • BERTopic 的交互式主题建模

  • 使用 Whisper 和 BERTopic 对 Kurzgesagt 的视频进行建模

如果您想跟上来,您应该使用 pip 安装 BERTopic,以及 sentence-transformers 包,我们将使用该包进行模型。

pip install sentence-transformers pip install bertopic

数据

我们将使用由 ChatGPT 人工创建的聊天数据。如果您想从 WhatsApp 中提取自己的聊天并遵循主题提取过程,您可以阅读这篇博客,了解我是如何做到的。我不会详细介绍转换步骤,但您可以在这里找到 Python 代码[这里]以及我的结构化示例数据。在应用转换后,我们将得到以下数据结构:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d884ef675077cb53d79f3cb65b3f871c.png

图片由作者提供

  • 日期:消息发送的时间

  • 聊天:哪个聊天 - 在我们的情况下总是maria

  • 作者:发送相应消息的个人。

  • 消息:所说内容的正文。


主题提取

BERTopic 的奇妙之处在于不需要太多的数据预处理。想法是尽可能简单,使用户能够专注于提取有意义的见解,而不会被细节所困扰。

importpandasaspdfrombertopicimportBERTopic data=pd.read_excel(r"")#load your data

在下一步中,我们加载我们的模型并将其应用于我们的数据。

topic_model=BERTopic(embedding_model="all-MiniLM-L6-v2")topics,probs=topic_model.fit_transform(data['Message'])

为了获得第一印象,我将从主题的概述开始。这包括创建了多少个主题,哪些单词代表这些主题,以及每个主题中包含哪些句子。在这里,我们还触及了主题创建背后的重要核心思想:每个主题并不返回确切的单个单词。相反,主题通常由一组单词组成,因为单个单词无法捕捉到主题的所有细微差别。这种方法使用户有更多机会解释每个簇。

输入:

topic_model.get_topic_info().head(5)

输出:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/14fe2107f81a1a07506e02d224ba8e80.png

图片由作者提供

每个主题都用一个数字标记,其中标签“-1”表示无法分配到任何特定主题的异常值。目前,我只显示前五个主题。我的分析基于 1090 条消息,总共识别出 23 个主题,大约 30%的所有消息被分类为异常值。我们可以深入挖掘这些异常值,以确定它们是否真的不适合任何主题,或者它们是否包含与识别的主题无关的内容。然而,由于 70%的消息明显被分配到主题中,我将专注于这些。

从主题 0 到 4,我们已经在簇中获得了一些初步见解。例如,主题 1 似乎关注鸡尾酒,而主题 3 似乎涉及关于教师和学生的讨论。这为我们提供了每个主题中可能包含的消息的初步印象,尽管现在还太早得出任何明确的结论。另一方面,主题 0 和主题 2 似乎包含更多通用术语,这些术语可能被视为停用词而不是特定主题的词语。虽然主题 0 可能被归类为“计划”,但主题 2 缺乏任何明确的关键词来暗示特定的主题。因此,仅仅查看前 5 行的主题就已经给我们提供了一些相关的见解:

  • 70% 的消息被分配到某个主题。

  • 主题 1 和 3 已经很好地展示了它们的重点。(鸡尾酒与教师)

  • 主题 0 可能与规划有关,但除此之外没有明显的主题突出。

  • 主题 2 需要进一步检查,因为它无法分配到任何明显的主题。

我们可以将这些初步见解保留在心中,继续我们的分析。虽然我现在不会这样做,但基于分配给每个主题的消息数量以及主题本身创建一个排序条形图可能会很有趣。这将给你一个印象,即主题在对话中是否同等重要,或者分布是否倾斜,只有少数几个主题在朋友的讨论中占据主导地位。我现在将跳过这个分析,直接检查主题本身。

如你所注意到的,“名称”列包含主题编号后跟下划线和几个单词。这些单词的顺序通常反映了它们对主题的重要性。虽然第一个单词可能具有很大的权重,但在某些情况下,重要性在第一个几个单词中分布得更均匀。为了分析这一点,我们将使用集成到 BERTopic 中的某些可视化功能。

让我们从简单的条形图开始:

输入:

topic_model.visualize_barchart(topics=list(range(23)))

输出:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/799c6c76cc4daa84eb29b3774ec8c5f7.png

作者提供的图片

这种可视化有助于识别每个主题簇中各种词语的重要性差异。在某些主题中,我们可以清楚地看到某些词语比其他词语更重要。这表明这些词语应该是标记主题的核心。以下主题似乎有一个或两个显著的关键词:

  • 主题 3:教师

  • 主题 8:家庭

  • 主题 10:教堂

  • 主题 12:我们的宝宝

  • 主题 13:旅行与旅行

  • 主题 15:确切地

  • 主题 16:求婚

  • 主题 17:父母

  • 主题 19:婚姻

  • 主题 20:我们

这些已经是相当强的主题,你可以将它们与特定的句子群联系起来,尽管主题 15(确切地)和 20(我们)仍然不清楚。

从条形图中观察到的另一个现象是,一些主题有助于更清晰地了解约翰和玛丽亚在写些什么。特别有趣的是,不仅是一个单词是否主导一个集群,而且当多个单词属于同一个逻辑家族时。例如,以下主题可能可以放在一起:

  • 主题 1:鸡尾酒

  • 主题 5:车祸

  • 主题 7:极限运动

  • 主题 11:沟通

  • 主题 22:与朋友外出

当你审查这些集群时,你可能注意到主题提取的一个共同挑战:它永远不会完美或完全自动化。虽然许多主题是有意义的——例如教堂、婚姻、家庭和旅行——但也有需要进一步调查的主题,如主题 15 和 20。这些可能代表了频繁使用的停用词。

现在,让我们回顾一下我们从条形图和主题词分数分析中得出的见解:

  • 一组主题在其集群中由一个或两个单词主导,其中大多数都有逻辑意义。

  • 一组主题可以清楚地表明对话的主题,因为这些集群中的许多词都属于一个逻辑上下文。

  • 一些主题仍然没有意义,因为它们没有形成一个清晰的集群。

考虑到这一点,让我们通过可视化分配给各自类别的整个信息景观来继续进行。

输入:

topic_model.visualize_documents(data['Message'],topics=list(range(23)),custom_labels=True,height=600)

输出:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/1dc92f742a9b75a499cba22963f5200b.png

图片由作者提供

在这个可视化中,每个气泡代表约翰或玛丽亚说的一条消息。颜色对应于它们各自的主题。轴上标注的值来自降维,因此它们没有直接的解释。当主题彼此靠近时,这表明它们之间的语义相似性。这种邻近性表明,这些主题在消息中共享相关的主题、词汇或上下文意义。

如你所见,这个静态视图本身并不提供太多见解。然而,当在 Python 中创建时,这种可视化允许对信息宇宙进行交互式探索,使你能够查看单个消息。从那里,你可以决定如何处理某些集群——例如将它们与其他集群合并或完全删除。

为了简单起见,我将选择几个集群来使可视化更清晰,并进一步对主题进行分组。

输入:

# Specify the topics you want to visualizeselected_topics=[1,3,5,7,8,10,12,13,16,17,19]# Visualize only the selected topicstopic_model.visualize_documents(data['Message'],topics=selected_topics,custom_labels=True,height=600)

输出:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/6643ce5c19d396973c30bf0fefeaefaf.png

图片由作者提供

为了使主题更加易于访问,我现在将给它们标注。

输入:

#Label Topicstopic_model.set_topic_labels({1:"Cocktails",3:"Teacher",5:"Car Accident",7:"Extreme Sport",8:"Family",10:"Church",12:"Our Baby",13:"Travel",16:"Proposal",17:"Parents",19:"Marriage"})# Specify the topics you want to visualizeselected_topics=[1,3,5,7,8,10,12,13,16,17,19]# Visualize only the selected topicstopic_model.visualize_documents(data['Message'],topics=selected_topics,custom_labels=True,height=600)

输出:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/12924018bc965965b7bcd0628d045607.png

图片由作者提供

现在,我们已经清楚地识别了约翰和玛丽亚讨论的一部分内容。记住,主题越接近,它们的语义相似度就越高。

让我们尝试对主题进行聚类。有一组主题似乎围绕着家庭、婚姻、求婚和他们的孩子。这强烈表明约翰和玛利亚是一对已婚夫妇,有孩子或他们正在计划要孩子。这似乎是他们生活中的一个重要主题。

第二个主要主题似乎围绕着他们的休闲活动。他们讨论的话题包括教堂、旅行、极限运动和车祸。如果我们想深入了解这一点,我们可以进行进一步的分析,例如对这些话题中的信息进行情感分析。例如,极限运动话题可能对玛利亚来说比约翰更具有负面语气,她可能正在试图说服他停止。了解每个人对某些话题的感受,可以为我们深入了解他们的讨论提供有价值的见解。然而,目前这还只是推测。

最后,我会将教师和鸡尾酒话题分类为单独的集群,因为它们似乎与其他话题不太匹配。有趣的是,教师集群非常明显地突出出来,因为阅读信息后,我们可以看到约翰和玛利亚实际上在讨论学校教师短缺的问题。


结论

在这篇博客文章中,我们使用了 Python 库 BERTopic 来分析约翰与玛利亚的聊天。通过将模型应用于他们的对话,我们确定了他们讨论的明确且个人化的主题。虽然我们无法在没有更深入探索他们的交流的情况下得出明确的结论,但我们已经可以推断出几件事情。例如,似乎其中一个人是宗教的,或者至少与教堂有联系。我们还观察到,他们的关系似乎很激烈,这很可能表明他们是已婚或有孩子,或者可能正在计划组建家庭。此外,我们还发现他们的爱好包括极限运动,甚至车祸也成为了他们对话的一部分。

通过这次分析,我们已经表明,通过将主题模型应用于他们的聊天,我们不需要阅读所有 1,000 条消息就能清楚地了解他们讨论的关键主题。这种方法为理解对话中的中心主题提供了一种快速而有效的方法。

然而,我们只是通过识别约翰和玛利亚谈论的部分内容来触及了主题提取的表面。还有许多其他途径可以探索:

  • 相关性热图:哪些主题值得合并?

  • 随时间变化的主题:主题是否随着系列的进展而演变?

  • 主题层次结构:主题之间有层次吗?


感谢您与我一同踏上这段通过聊天分析之旅!如果您喜欢探索约翰和玛利亚对话的复杂性,我会很感激您的点赞或关注——您的支持是我创造力的源泉!

如果您还没有阅读,请查看该系列的第一个部分,看看当您将模型应用于自己与家人和朋友的 WhatsApp 聊天时会发生什么!您可以在我的 Github 个人资料 上找到相关的代码和分析。

medium.com/towards-data-science/techniques-for-chat-data-analytics-with-python-4c15d3f5498c


Python 数字人文教程. (2024).如何在 Python 中使用 BERTopic – 基于机器学习的主题建模. YouTube. 可在:www.youtube.com/watch?v=v3SePt3fr9g(访问日期:2024 年 10 月 29 日).

Egger, R. 和 Yu, J.,2022. LDA、NMF、Top2Vec 和 BERTopic 之间的主题建模比较,以揭示推特帖子的神秘面纱.社会学研究前沿,7,p.886498. doi: 10.3389/fsoc.2022.886498. 可在:pmc.ncbi.nlm.nih.gov/articles/PMC9120935/[访问日期:2024 年 10 月 29 日].

Grootendorst, M.,2020.使用 BERT 进行主题建模. Towards Data Science. 可在:towardsdatascience.com/topic-modeling-with-bert-779f7db187e6[访问日期:2024 年 10 月 31 日].

Grootendorst, M.,2021.使用 BERTopic 进行交互式主题建模. Towards Data Science. 可在:towardsdatascience.com/interactive-topic-modeling-with-bertopic-1ea55e7d73d8[访问日期:2024 年 10 月 31 日].

Grootendorst, M.,2022.使用 BERT 进行主题建模. Towards Data Science. 可在:towardsdatascience.com/topic-modeling-with-bert-779f7db187e6[访问日期:2024 年 10 月 31 日].

Mitra Mirshafiee. (2020).大爆炸理论系列剧本. [在线] 可在:www.kaggle.com/datasets/mitramir5/the-big-bang-theory-series-transcript[访问日期:2024 年 11 月 2 日].

http://www.jsqmd.com/news/804860/

相关文章:

  • 欢迎来到Marp世界
  • 无线通信抗干扰实战:如何用MATLAB仿真识别并滤除NBI和WBI?
  • GTM自动化管理新范式:基于MCP协议构建开发者友好的API适配器
  • 厚街民宿哪家值得推荐:秒杀民宿环境绝佳 - 17329971652
  • 偿债能力分析怎么做?如何快速看懂一家企业的偿债能力:流动比率、速动比率、资产负债率
  • 使用 Python 进行聊天数据分析的技术
  • AI智能体可观测性实践:LobsterOps黑匣子与调试控制台
  • 厚街温泉酒店哪家值得推荐:秒杀温泉酒店园林秘境 - 13724980961
  • 如何永久保存微信聊天记录:5分钟学会WeChatMsg免费完整指南
  • 智慧实验室哪家做得好?先区分科研实验室、LIMS系统与迈克生物所在的医学检验实验室
  • 手把手教你为自制的Gazebo小车机械臂模型配置关节控制器(joint_position_controller)
  • 用Unet搞定你的第一个语义分割项目:从VOC数据集准备到PyTorch模型训练全流程
  • 终极指南:如何三步获取国家中小学智慧教育平台电子课本离线资源
  • Taotoken如何助力AIGC内容创作团队平衡效果与成本
  • STM32实战:用HAL库搞定RS485 Modbus液压传感器数据采集(附自动收发电路避坑)
  • 2026最新盘点!分享六个降AI提示词+八个好用的降AI工具(内含避坑指南) - 殷念写论文
  • 可配置传感器AFE芯片:LMP9100与LMP90100如何重塑工业传感设计流程
  • Tinke:免费开源NDS游戏资源提取工具,轻松解密任天堂DS游戏文件
  • Windows 10终极PL2303驱动修复指南:让老旧串口设备重获新生
  • 如何高效使用Fast-GitHub加速插件:5个提升GitHub访问速度的实用技巧
  • CoverM如何革新宏基因组覆盖率分析:从短读长到PacBio HiFi的完整解决方案
  • 深度学习入门 1 一个简单的反向传播
  • 本地AI任务编排工具AgentForge:从看板管理到多代理协作
  • 从账单与用量看板分析团队大模型资源消耗模式
  • 数据分析实习面试准备全攻略:专业知识+项目深挖+行为面试,职卓科技的面试辅导体系
  • AI角色扮演引擎Anima:从LLM对话到图文生成的架构与实现
  • 中小企业技术团队的生存法则:用巧劲对抗资源不足
  • 厚街产后修复哪家值得推荐:秒杀产后修复服务优 - 13724980961
  • 微创式电子设备设计:从自动化到自主化的智能革命
  • HarnessGate:专为AI Agent设计的纯消息网关,实现多平台无缝桥接