NLP-基于bertopic工具的新闻文本分析与挖掘

news2024/11/25 0:41:24

NLP-基于bertopic工具的新闻文本分析与挖掘

一,前言

最近简单接触了一些NLP的内容,练一下如何结合ChatGPT进行学习。

二,具体过程

(1)预处理文本,记录处理过程。

在使用Bertopic进行主题建模之前,需要对文本进行预处理。下面是如何使用Bertopic预处理文本的具体处理过程
1.安装Bertopic库:
在Python环境中安装Bertopic库。你可以使用pip命令来安装Bertopic库:

pip install bertopic

2.加载数据集:
数据下载地址:
链接:https://pan.baidu.com/s/1e7u_7M3k19NMO8qwUlaTxA?pwd=eqqs
提取码:eqqs

将数据下载下来,存放位置如下
在这里插入图片描述

使用以下代码将训练集加载到一个列表中:

dirPath=r'E:\AIStudy\WordSystem\new2016zh'
validPath=os.path.join(dirPath,'news2016zh_valid.json')
datas=[]
with open(trainPath, 'r',encoding='utf-8') as f:
    lines=f.readlines()
    for line in lines:
        data = json.loads(line)
        datas.append(data)

3.预处理数据
在使用Bertopic进行主题建模之前,需要对数据进行预处理。Bertopic使用spacy库进行预处理,因此你需要安装spacy库并下载相应的模型。
可以使用以下命令来安装spacy和en_core_web_sm模型:

pip install spacy
python -m spacy download en_core_web_sm

具体对数据进行预处理程序如下:

print('#2.预处理数据')
nlp = spacy.load('en_core_web_sm')
texts = [doc['title'] for doc in datas]
processed_texts = []
qtar=tqdm(total=len(texts))
for text in texts:
    qtar.update(1)
    doc = nlp(text)
    processed_texts.append(' '.join([token.lemma_ for token in doc if not token.is_stop and not token.is_punct]))
qtar.close()
print(len(processed_texts))

预处理运行中:
在这里插入图片描述

(2)使用文本聚类工具对新闻集合进行聚类处理,记录处理过程和结果。

我使用文本聚类工具Bertopic对新闻集合进行聚类处理,下面是处理的过程
4.记录处理过程
在进行文本预处理时,可以记录处理过程,以便以后查看

import logging

logging.basicConfig(filename='preprocessing.log', level=logging.INFO)
for doc in data:
    text = doc['content']
    doc = nlp(text)
    processed_text = ' '.join([token.lemma_ for token in doc if not token.is_stop and not token.is_punct])
    processed_texts.append(processed_text)
    logging.info(f'Processed document {doc["id"]}: {text} -> {processed_text}')

5.使用Bertopic建立主题模型并训练

print('3.训练模型')

model = BERTopic(language='english', calculate_probabilities=True)
topics, probabilities = model.fit_transform(processed_texts)

在这里插入图片描述

6.评估模型
你可以使用sklearn.metrics提供的评估工具来评估模型的性能。

from sklearn.metrics import silhouette_score
silhouette_avg = silhouette_score(probabilities, topics)
print("Silhouette Score:", silhouette_avg)

7.分类新闻标题
最后,使用训练好的模型来对新闻标题进行分类。假设你有一个新的新闻标题,可以使用以下代码将其分类到一个主题:

new_title = '如何选择儿童摄影机构给宝宝拍照?'
new_processed_text = ' '.join([token.lemma_ for token in nlp(new_title) if not token.is_stop and not token.is_punct])
new_topic, new_prob = model.transform([new_processed_text])

处理结果如下:
在这里插入图片描述

(3)人工观察聚类结果进行简单调优,记录调优过程和结果。

基于以下对聚类结果进行简单调优的基本准则
1.检查聚类质量:首先,需要检查聚类结果的质量。可以使用Silhouette Score、Calinski-Harabasz Index等指标来评估聚类结果的质量。如果聚类质量不佳,可以尝试调整聚类参数或者增加数据量来提升聚类效果。
2.根据聚类结果进行分类:将聚类结果根据主题进行分类,可以发现相似主题下的文章,有助于进一步对聚类结果进行理解和分析。
3.调整聚类粒度:根据聚类结果,可以对聚类粒度进行调整。如果聚类结果过于粗糙,可以尝试增加主题数或者调整聚类参数;如果聚类结果过于细致,可以尝试减少主题数或者调整聚类参数。
4.检查聚类标签:检查聚类标签是否能够准确地描述聚类结果。如果聚类标签不够准确,可以考虑手动修改聚类标签或者使用自动化标签生成技术来生成更准确的聚类标签。
5.进一步分析聚类结果:对聚类结果进行进一步的分析,可以发现主题之间的关联性和区别性,有助于进一步理解文本数据的内在结构。可以使用可视化技术将聚类结果可视化,或者使用文本挖掘技术进行主题词提取和文本关系分析等。
我们对以上的结果进行一下分析。
1.提高数据量,为了方便查看效果,我只使用了5000词条,数据较小。
2.调整聚类参: calculate_probabilities=True, top_n_words=5, nr_topics=3。语言改为简体中文
在这里插入图片描述

可以看到聚类效果,提升了6倍多
3.根据聚类结果与标签进行分类
calculate_similarity:用于指定是否计算主题之间的相似度,默认为 False。
similarity_threshold:用于指定主题之间的相似度阈值,当两个主题的相似度高于此阈值时,这两个主题将被合并为一个主题,默认为 0.75。

三、实验分析和总结

1学习文本处理的基本概念和术语,包括文本信息抽取、文本聚类和文本摘要等。
(2)掌握文本处理中常用的指标,如准确率、召回率、F1值等,可以帮助你衡量算法性能。
(3)熟悉常用的文本处理工具和算法,如TextRank算法、Summarization算法、BERTopic算法等。
(4)掌握文本聚类的基本过程和方法,包括文本预处理、聚类模型训练、聚类结果评估和聚类结果可视化等。
(5)了解如何从文本中提取关键词和摘要句,并将它们用于生成新闻专题的概要。
对于初学者来说是一份很好学习资料,可以快速入门并掌握文本处理的基本技术和工具。同时,涉及到了一些常用的文本处理算法和工具,这些内容也对于进一步深入学习和应用文本处理技术来说非常有帮助。
同时也学习了一些常见调优方法,可以让我可以更好地理解和优化聚类结果

四、思考题

(1)针对父子事件的定义,上述过程中所采用的方法聚类的粒度是过粗还是过细,思考优化方式。
1.上述过程中所采用的方法聚类的粒度是过粗
针对父子事件的定义,使用文本聚类工具Bertopic对新闻池进行聚类时,聚类的粒度可能会受到影响。如果聚类过粗,则可能会将不同的子事件聚合到同一个父事件中,导致无法区分不同的子事件;如果聚类过细,则可能会将同一个父事件分成多个子事件,导致聚类结果过于细致。

为了解决这个问题,我们在检索了一些资料之后发现可以,采取以下优化方式:

调整主题数:Bertopic的聚类粒度取决于主题数,因此我们可以通过调整主题数来控制聚类的粒度。如果聚类过粗,可以尝试增加主题数;如果聚类过细,可以尝试减少主题数。需要注意的是,主题数不应该设置得太小或太大,否则可能会导致聚类效果变差。

调整聚类参数:Bertopic提供了一些参数可以用来调整聚类的粒度,例如词频阈值、主题相似度阈值等。通过调整这些参数,可以控制聚类的粒度。需要注意的是,不同的参数取值可能会对聚类结果产生不同的影响,因此需要进行实验来确定最佳的参数取值。

使用层次聚类:Bertopic使用的是基于密度的聚类方法,可能会导致聚类结果过于粗糙。可以考虑使用层次聚类方法,将聚类结果分层,从而得到更为细致的聚类结果。层次聚类方法可以使用scikit-learn库中的AgglomerativeClustering类来实现。

结合手动标注:如果聚类结果过于粗糙或过于细致,可以考虑结合手动标注来进行优化。可以选择一部分代表性文本进行手动标注,然后将手动标注的结果反馈到聚类模型中,从而优化聚类结果。手动标注可以采用人工标注、半自动标注或众包标注等方式。

五,整合代码

全部代码整合如下

import json
import spacy
import os
from tqdm import tqdm
from bertopic import BERTopic
from sklearn.metrics import silhouette_score

# 1.加载数据集
print('# 1.加载数据集')
dirPath=r'E:\AIStudy\WordSystem\new2016zh'
validPath=os.path.join(dirPath,'news2016zh_valid.json')
datas=[]
with open(validPath, 'r',encoding='utf-8') as f:
    lines=f.readlines()
    for i in range(len(lines)):
        line=lines[i]
        data = json.loads(line)
        datas.append(data)
        if i>2000:
            break

#2.预处理数据
print('#2.预处理数据')
nlp = spacy.load('en_core_web_sm')
texts = [doc['title'] for doc in datas]
processed_texts = []
qtar=tqdm(total=len(texts))
for text in texts:
    qtar.update(1)
    doc = nlp(text)
    processed_texts.append(' '.join([token.lemma_ for token in doc if not token.is_stop and not token.is_punct]))
qtar.close()
print(len(processed_texts))



#3训练模型
print('3.训练模型')

model = BERTopic(language='chinese (simplified)', calculate_probabilities=True, top_n_words=5, nr_topics=3)
topics, probabilities = model.fit_transform(processed_texts)

#4评估模型
silhouette_avg = silhouette_score(probabilities, topics)
print("Silhouette Score:", silhouette_avg)

#实际分类
new_title = '如何选择儿童摄影机构给宝宝拍照?'
new_processed_text = ' '.join([token.lemma_ for token in nlp(new_title) if not token.is_stop and not token.is_punct])
new_topic, new_prob = model.transform([new_processed_text])

print(new_processed_text,new_topic, new_prob)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/644416.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据库一】MySQL数据库初体验

MySQL数据库初体验 1.数据库基本概念1.1 数据Data1.2 表1.3 数据库1.4 数据库管理系统1.5 数据库系统 2.数据库的发展3.主流的数据库介绍3.1 SQL Server(微软公司产品)3.2 Oracle (甲骨文公司产品)3.3 DB2(IBM公司产品…

MySQL-索引详解(五)

♥️作者:小刘在C站 ♥️个人主页: 小刘主页 ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏&#xf…

【K8S系列】深入解析k8s网络之—网络故障

序言 你只管努力,其他交给时间,时间会证明一切。 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记一级论点蓝色:用来标记二级论点 Kubernetes (k8s) 是一个容器编排平台&#x…

FasterTransformer 005 初始化:如何将参数传给模型?

cpp的例子 device_malloc cpp没有用具体数值初始化 float *d_from_tensor NULL;device_malloc(&d_from_tensor, batch_size * seq_len * hidden_dim);https://github1s.com/NVIDIA/FasterTransformer/blob/v1.0/sample/cpp/transformer_fp32.cc#L35-L38 直接用的cudaMal…

【电子学会】2023年03月图形化四级 -- 绘制直尺

绘制直尺 编写一段程序,绘制一段7厘米的直尺。 1. 准备工作 (1)保留小猫角色,隐藏; (2)白色背景。 2. 功能实现 (1)点击绿旗,设置笔的颜色为红色&#…

事务和事务的隔离级别

一、事务 (一)为什么需要事务 事务是数据库管理系统(DBMS)执行过程中的一个逻辑单位(不可再进行分割),由一个有限的数据库操作序列构成(多个DML语句,select语句不包含事…

数字图像处理期末复习习题 SCUEC part1

1.在利用LoG算子做边缘检测的时候,作为一种经验法则,当滤波器空间参数为a7时,LoG滤波器空域模板大小应为 答:4343 理由是:n大于等于6a1 2.空间域方法主要分为灰度变换和空间滤波两类,灰度变换在图像的单…

【前端 - CSS】第 15 课 - 复合选择器

欢迎来到博主 Apeiron 的博客,祝您旅程愉快 ! 时止则止,时行则行。动静不失其时,其道光明。 目录 1、缘起 2、复合选择器 2.1、后代选择器 2.2、子代选择器 2.3、并集选择器 2.4、交集选择器(了解&#xff09…

SpringBatch从入门到实战(三):父子Job和多步骤控制

一:Job嵌套 Job之前也可以嵌套,比如一个父Job封装多个已经存在的子Job。 Configuration public class ChildrenJobConfig {Autowiredprivate JobBuilderFactory jobBuilderFactory;Autowiredprivate StepBuilderFactory stepBuilderFactory;Beanpublic…

基础知识学习---牛客网C++面试宝典(八)操作系统--第三节

1、本栏用来记录社招找工作过程中的内容,包括基础知识学习以及面试问题的记录等,以便于后续个人回顾学习; 暂时只有2023年3月份,第一次社招找工作的过程; 2、个人经历: 研究生期间课题是SLAM在无人机上的应…

Golang每日一练(leetDay0096) 添加运算符、移动零

目录 282. 给表达式添加运算符 Expression Add Operators 🌟🌟🌟 283. 移动零 Move Zeroes 🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 …

Cenos7 --- Redis下载和安装(Linux版本)

1.下载和安装 Download | Redis进入官网Download | Redis, 上边点击下载7.0.11,右键复制下载衔接 https://download.redis.io/releases/redis-7.0.2.tar.gz 1.weget获取 我这个安装包放在 /tools/installbags下 cd /tools/installbags wget https://download.red…

Java进阶 —— Java多线程编程笔记

❤ 作者主页:欢迎来到我的技术博客😎 ❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~* 🍊 如果文章对您有帮助,记得关注、点赞、收藏、…

【头歌-Python】9.3 中英文词云绘制(project) 第1~3关

第1关:词云练习1 任务描述 本关任务:编写一个能制作词云的小程序。 相关知识 词云 词云,也叫文字云,是一种应用广泛的数据可视化方法。是过滤掉文本中大量的低频信息,形成“关键词云层”或“关键词渲染”&#xf…

基于VMWare组件安装Centos7.9

1.前提条件 使用VMware进行安装,VMware可以自行下载,需要介质(VMware和CentOS7.9)的同仁,请留言,我给你下载链接。 2.CentOS7.9安装 1.打开VMware,点击“新建虚拟机(N)...” 2.选择“典型” ,点击“下一步…

基础知识学习---牛客网C++面试宝典(六)操作系统--第一节

1、本栏用来记录社招找工作过程中的内容,包括基础知识学习以及面试问题的记录等,以便于后续个人回顾学习; 暂时只有2023年3月份,第一次社招找工作的过程; 2、个人经历: 研究生期间课题是SLAM在无人机上的应…

A100 GPU服务器安装GPU驱动教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【OpenCV DNN】Flask 视频监控目标检测教程 06

欢迎关注『OpenCV DNN Youcans』系列,持续更新中 【OpenCV DNN】Flask 视频监控目标检测教程 06 3.6 OpenCVFlask实时监控和视频播放cvFlask06 项目的文件树cvFlask06 项目的程序文件cvFlask06 项目的网页模板cvFlask06 项目的运行 本系列从零开始,详细…

chatgpt赋能python:Python排序算法实现及其应用

Python排序算法实现及其应用 排序是计算机科学中最基础也是最常用的算法之一。在数据分析、数据挖掘和机器学习等领域,排序算法有着广泛的应用。Python作为一种流行的编程语言,在排序方面具有一定的优势。本文将介绍一些常见的Python排序算法实现以及应…

有趣的图(三)(57)

小朋友们好,大朋友们好! 我是猫妹,一名爱上Python编程的小学生。 和猫妹学Python,一起趣味学编程。 今日主题 咱们之前分别学习了图的基本概念,和图的深度优先遍历算法dfs。 你学会了吗? 咱们今天要学…