原文towardsdatascience.com/techniques-for-chat-data-analytics-with-python-cfdbea358123https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/174ad7146ac02e7b158a1fba3330b569.png图片由Mikechie Esparagoza提供并从 Pexels.com 获取在本系列的第一个部分我向您介绍了我的艺术创造的朋友约翰他非常友好地为我们提供了他与生活中五位最亲近的人的聊天记录。我们仅使用了元数据例如谁在何时发送消息来可视化约翰何时遇见了他的女友何时与他的一个最好的朋友发生争执以及他应该更频繁地给哪些家庭成员写信。如果您没有阅读本系列的第一个部分您可以在这里找到它。我们尚未涉及但我们将更深入探讨的是对实际消息的分析。因此我们将使用约翰和玛利亚之间的聊天来识别他们讨论的主题。当然我们不会逐条查看消息并进行分类——不我们将使用 Python 库 BERTopic 来提取聊天围绕的主题。什么是 BERTopicBERTopic 是一种由 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 datapd.read_excel(r)#load your data在下一步中我们加载我们的模型并将其应用于我们的数据。topic_modelBERTopic(embedding_modelall-MiniLM-L6-v2)topics,probstopic_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(topicslist(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],topicslist(range(23)),custom_labelsTrue,height600)输出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],topicsselected_topics,custom_labelsTrue,height600)输出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],topicsselected_topics,custom_labelsTrue,height600)输出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-4c15d3f5498cPython 数字人文教程. (2024).如何在 Python 中使用 BERTopic – 基于机器学习的主题建模. YouTube. 可在www.youtube.com/watch?vv3SePt3fr9g(访问日期2024 年 10 月 29 日).Egger, R. 和 Yu, J.2022. LDA、NMF、Top2Vec 和 BERTopic 之间的主题建模比较以揭示推特帖子的神秘面纱.社会学研究前沿7p.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 日].