使用主题模型和古老的人类推理进行无监督文本分类

一、说明

        我在日常工作中不断遇到的一项挑战是在无法访问黄金标准标签的情况下标记文本数据。这绝不是一项微不足道的任务,在本文中,我将向您展示一种相对准确地完成此任务的方法,同时保持管道的可解释性和易于调整。

        一些读者可能已经开始考虑使用基于变压器的零样本模型来完成此任务(或LLM),但在这里我将提出几个原因来说明为什么这可能会出现问题:

        ——零样本学习是一个黑匣子。理解提示/类标签选择的含义相当困难,而且您很少对所有看似随意的选择会影响什么有很好的直觉。
        — Transformer 和 LLM 速度慢且成本高。使用 OpenAI 的 API 需要花费大量金钱,而且由于速度相当慢而可能不切实际。您当然可以自行托管一个较小的变压器模型,但如果您希望事情变得敏捷且响应迅速(这通常是生产中的要求),它仍然需要大量计算资源。

        在这种情况下,我想说主题模型是一个非常合理的折衷方案。它们可能不如零样本变压器模型那么智能,并且您将必须做更多的体力劳动才能在实践中使用它们,但它们可以让您对过程进行更细粒度的控制,并给出更可解释的结果,更不用说性能优势了。

二、工作流程

        在本文中,我将引导您完成创建机器学习管道的工作流程,以使用主题模型和良好的旧冷硬算法规则来标记小说文本。

2.1 数据

        为了证明我的观点,我将做一些作弊,我将使用带标签的数据集来证明我提出的方法的有效性。不过,我只会使用标签进行评估,创建管道的整个过程将基于无监督学习和我们自己的人类直觉。该数据集有 20 个新闻组,您可以使用 scikit-learn 轻松加载。

pip install scikit-learn
from sklearn.datasets import fetch_20newsgroups
import numpy as npnewsgroups = fetch_20newsgroups(subset="all")
corpus = newsgroups.data# Sklearn gives the labels back as integers, we have to map them back to
# the actual textual label.
group_labels = [newsgroups.target_names[label] for label in newsgroups.target]print(np.unique(group_labels))
------------------------------------------------------------------
array(['alt.atheism', 'comp.graphics', 'comp.os.ms-windows.misc','comp.sys.ibm.pc.hardware', 'comp.sys.mac.hardware','comp.windows.x', 'misc.forsale', 'rec.autos', 'rec.motorcycles','rec.sport.baseball', 'rec.sport.hockey', 'sci.crypt','sci.electronics', 'sci.med', 'sci.space','soc.religion.christian', 'talk.politics.guns','talk.politics.mideast', 'talk.politics.misc','talk.religion.misc'], dtype='<U24')

假设我想根据文本是否与空间相关来标记文本,以便我们可以将无监督分类性能与实际标签进行比较。我什至会将数据分成训练集和测试集,这样我们就可以确保我们不会获知模型正在测试的信息(又名主题模型不会在测试中进行训练)放)。

from sklearn.model_selection import train_test_split
is_about_space = np.array(group_labels) == "sci.space"X_train, X_test, y_train, y_test = train_test_split(corpus, is_about_space)>

2.2 无监督模型

        我们可以使用topicwizard创建易于使用的主题管道,然后解释主题。

pip install topicwizard

        在 topicwizard 中创建主题管道被认为是将矢量化器和分解模型链接在一起。

        作为矢量化器,我们将使用 scikit-learn 内置的 CountVectorizer 并设置一些看起来合理的默认频率截止值,并将过滤英语停用词。

        我们将使用非负矩阵分解作为我们的主题模型,因为它非常快(训练和推理)并且通常工作得相当好。我将确定 30 个主题,这是一个完全任意的数字。

from sklearn.decomposition import NMF
from sklearn.feature_extraction.text import CountVectorizer
from topicwizard.pipeline import make_topic_pipeline# Setting up topic modelling pipeline
vectorizer = CountVectorizer(max_df=0.5, min_df=10, stop_words="english")
# NMF topic model with 20 topics
nmf = NMF(n_components=30)topic_pipeline = make_topic_pipeline(vectorizer, nmf)
topic_pipeline.fit(X_train)

2.3 模型解读

        topicwizard 附带了许多内置的可视化来解释主题模型。现在我们主要感兴趣的是哪些主题可能包含大部分与空间相关的单词。

        为此,我们将使用 topicwizard 的图形 API。首先,我们通过创建一组条形图来查看与每个主题最相关的单词。

from topicwizard.figures import topic_barchartstopic_barcharts(X_train, pipeline=topic_pipeline, top_n=5)

不幸的是,其中大部分都是垃圾,我们可能应该更好地清理数据集,但23_satellite_space_launch_nasa看起来相当有前途。

让我们看一下主题模型中的单词映射,以了解它们彼此之间的位置关系。

from topicwizard.figures import word_mapword_map(X_train, pipeline=topic_pipeline, top_n=5)

我们可以看到,有一组单词非常空旷,而且它们的位置也与某些与技术相关的单词非常接近。

我们还可以检查“space”和“astro”这两个词属于哪些主题,以及它们最接近的 20 个关联。我们只会显示前 8 个主题。

from topicwizard.figures import word_association_barchartfig = word_association_barchart(["space", "astro"],corpus=X_train,pipeline=topic_pipeline,n_association=20,top_n=8
)

        我们可以看到,到目前为止,最主要的主题是我们已经确定的主题,从现在开始,我将在我们的分析中只关注这一主题。

        让我们转换我们的训练语料库并查看该主题的重要性分布,以便我们可以选择合理的阈值。
首先,我将主题模型的输出设置为数据框,然后我们可以通过绘图直方图看到分布。

import plotly.express as pxtopic_pipeline.set_output(transform="pandas")topic_df = topic_pipeline.transform(X_train)
px.histogram(topic_df["23_satellite_space_launch_nasa"])

我们可以看到绝大多数文本都在0.1以下。我说我们尝试将阈值设置为 0.05,然后查看从中得到的随机文本样本。

topic_df["content"] = X_train
sample = topic_df[topic_df["23_satellite_space_launch_nasa"] > 0.05].content.sample(10)
for text in sample:print(text[:200])
From: CPKJP@vm.cc.latech.edu (Kevin Parker)
Subject: Insurance Rates on Performance Cars SUMMARY
Organization: Louisiana Tech University
Lines: 244
NNTP-Posting-Host: vm.cc.latech.edu
X-Newsreader: NN
From: pjs@euclid.JPL.NASA.GOV (Peter J. Scott)
Subject: Re: Did Microsoft buy Xhibition??
Organization: Jet Propulsion Laboratory, NASA/Caltech
Lines: 8
Distribution: world
Reply-To: pjs@euclid.jpl.na
From: ml@chiron.astro.uu.se (Mats Lindgren)
Subject: Re: Comet in Temporary Orbit Around Jupiter?
Organization: Uppsala University
Lines: 14
Distribution: world
NNTP-Posting-Host: chiron.astro.uu.seFrom: mike@gordian.com (Michael A. Thomas)
Subject: Re: The Role of the National News Media in Inflaming Passions
Organization: Gordian; Costa Mesa, CA
Distribution: ca
Lines: 13In article <1qjtmjIN
From: leech@cs.unc.edu (Jon Leech)
Subject: Space FAQ 04/15 - Calculations
Supersedes: <math_730956451@cs.unc.edu>
Organization: University of North Carolina, Chapel Hill
Lines: 334
Distribution: worl
From: wls@calvin.usc.edu (Bill Scheding)
Subject: Re: "Full page" PB screen
Organization: University of Southern California, Los Angeles, CA
Lines: 14
Distribution: world
NNTP-Posting-Host: calvin.usc
From: ghelf@violet.berkeley.edu (;;;;RD48)
Subject: Re: Soyuz and Shuttle Comparisons
Organization: University of California, Berkeley
Lines: 11
NNTP-Posting-Host: violet.berkeley.eduAre you guys ta
From: gsh7w@fermi.clas.Virginia.EDU (Greg Hennessy)
Subject: Re: Keeping Spacecraft on after Funding Cuts.
Organization: University of Virginia
Lines: 13In article <1r6aqr$dnv@access.digex.net> prb@
From: oeth6050@iscsvax.uni.edu
Subject: ****COMIC BOOK SALE****
Organization: University of Northern Iowa
Lines: 36Hello,my name is John and I have the following comic books for sale - plea
From: shafer@rigel.dfrf.nasa.gov (Mary Shafer)
Subject: Re: Inner Ear Problems from Too Much Flying?
Article-I.D.: rigel.SHAFER.93Apr6095951
Organization: NASA Dryden, Edwards, Cal.
Lines: 33
In-Reply
Hmm some of these texts do not seem to have much to do with space, let’s set a higher threshold.topic_df["content"] = X_train
sample = topic_df[topic_df["23_satellite_space_launch_nasa"] > 0.15].content.sample(10)
for text in sample:print(text[:200])

嗯,其中一些文本似乎与空间没有太大关系,让我们设置一个更高的阈值。

topic_df["content"] = X_train
sample = topic_df[topic_df["23_satellite_space_launch_nasa"] > 0.15].content.sample(10)
for text in sample:print(text[:200])
rom: gene@theporch.raider.net (Gene Wright)
Subject: NASA Special Publications for Voyager Mission?
Organization: The MacInteresteds of Nashville, Tn.
Lines: 12I have two books, both NASA Special P
From: 18084TM@msu.edu (Tom)
Subject: Billsats
X-Added: Forwarded by Space Digest
Organization: [via International Space University]
Original-Sender: isu@VACATION.VENARI.CS.CMU.EDU
Distribution: sci
Li
From: pww@spacsun.rice.edu (Peter Walker)
Subject: Re: The Universe and Black Holes, was Re: 2000 years.....
Organization: I didn't do it, nobody saw me, you can't prove a thing.
Lines: 28In article
From: da709@cleveland.Freenet.Edu (Stephen Amadei)
Subject: Project Help
Organization: Case Western Reserve University, Cleveland, Ohio (USA)
Lines: 17
NNTP-Posting-Host: hela.ins.cwru.eduHello, From: dbm0000@tm0006.lerc.nasa.gov (David B. Mckissock)
Subject: Washington Post Article on SSF Redesign
News-Software: VAX/VMS VNEWS 1.41    
Nntp-Posting-Host: tm0006.lerc.nasa.gov
Organization: NAS
From: u920496@daimi.aau.dk (Hans Erik Martino Hansen)
Subject: Commercials on the Moon
Organization: DAIMI: Computer Science Department, Aarhus University, Denmark
Lines: 16I have often thought abou
From: wb8foz@skybridge.SCL.CWRU.Edu (David Lesher)
Subject: Re: No. Re: Space Marketing would be wonderfull.
Organization: NRK Clinic for habitual NetNews abusers - Beltway Annex
Lines: 11
Reply-To: w
From: 18084TM@msu.edu (Tom)
Subject: Solid state vs. tube/analog
X-Added: Forwarded by Space Digest
Organization: [via International Space University]
Original-Sender: isu@VACATION.VENARI.CS.CMU.EDU
D
From: pgf@srl03.cacs.usl.edu (Phil G. Fraering)
Subject: Re: Gamma Ray Bursters. positional stuff.
Organization: Univ. of Southwestern Louisiana
Lines: 24belgarath@vax1.mankato.msus.edu writes:>  
From: rnichols@cbnewsg.cb.att.com (robert.k.nichols)
Subject: Re: Permanaent Swap File with DOS 6.0 dbldisk
Summary: PageOverCommit=factor
Organization: AT&T
Lines: 50In article <93059@hydra.gatech.

这些似乎确实与空间相关,所以让我们保留 0.15 作为阈值。

2.4 分类管道

        现在我们已经有了如何查看哪些文本与空间相关的规则,我们应该将这些知识合并到机器学习管道中,以便我们可以在未来的工作或生产中轻松使用。

        为此,我们将使用令人惊叹的人类学习库,您可以在其中创建基于规则的组件,甚至可以绘制东西(这真的很棒)。

        为此,我们必须冻结主题模型,以便在管道上调用 fit() 时不会对其进行训练

pip install human-learn
from hulearn.classification import FunctionClassifier
from sklearn.pipeline import make_pipeline# Creating rule for classifying something as a space document
def space_rule(df, threshold=0.15):return df["23_satellite_space_launch_nasa"] > threshold# Freezing topic pipeline
topic_pipeline.freeze = True
classifier = FunctionClassifier(space_rule)
cls_pipeline = make_pipeline(topic_pipeline, classifier).fit(X_train)

        我们现在有了一个与空间相关的文本的分类器,不是很漂亮吗?请记住,我们甚至还没有触及标签,只是使用了主题模型和我们自己的人类直觉。

三、评估

        为了检查这是否确实是一种有效的方法,让我们根据测试数据评估我们的分类管道。

from sklearn.metrics import classification_reporty_pred = cls_pipeline.predict(X_test)
print(classification_report(y_test, y_pred))
   precision    recall  f1-score   supportFalse       0.98      0.98      0.98      4475True       0.65      0.70      0.68       237accuracy                           0.97      4712macro avg       0.82      0.84      0.83      4712
weighted avg       0.97      0.97      0.97      4712

        考虑到我们对标签的查看绝对为零,并且数据集非常不平衡,这些结果非常好!

        我怀疑我们仍然可以调整这一点,并通过更干净的数据、更明智的主题模型选择和潜在的更多主题来获得更好的结果,以便我们可以捕获数据中的更多差异。

马顿·卡多斯

 

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

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

相关文章

枚举的用法总结

1 背景 在java语言中还没有引入枚举类型之前&#xff0c;表示枚举类型的常用模式是声明一组具有int常量。之前我们通常利用public final static 方法定义的代码如下&#xff0c;分别用1 表示春天&#xff0c;2表示夏天&#xff0c;3表示秋天&#xff0c;4表示冬天。 public c…

docker-compose一键搭建zookeeper集群

1、setup.sh setup.sh脚本用来创建本地文件夹&#xff0c;这些文件夹会被挂载到docker容器。 #!/bin/bashmkdir -p "$PWD\zoo1\data" mkdir -p "$PWD\zoo1\datalog"mkdir -p "$PWD\zoo2\data" mkdir -p "$PWD\zoo2\datalog"mkdir -p…

计算机缺失msvcp120.dll的最新解决方法,实测可以完美修复

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp120.dll丢失”。msvcp120.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;它是运行许多基于Windows操作系统的应用程序所必需的动态链接库文件之一。如果计算机…

Jetson_yolov8_解决模型导出.engine遇到的问题、使用gpu版本的torch和torchvision、INT8 FP16量化加快推理

1、前情提要 英伟达Jetson搭建Yolov8环境过程中遇到的各种报错解决&#xff08;涉及numpy、scipy、torchvision等&#xff09;以及直观体验使用Yolov8目标检测的过程&#xff08;CLI命令行操作、无需代码&#xff09;-CSDN博客和YOLOv8_测试yolov8n.pt&#xff0c;yolov8m.pt训…

【springboot 中集成 knife4j 时,报错 No mapping for GET /doc.html】

出现这种情况可能是项目中含有继承WebMvcConfigurationSupport的类&#xff0c;这会导致 swagger 配置失效。 解决方法&#xff0c;继承WebMvcConfigurationSupport下重写addResourceHandlers方法 Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry)…

[C#]winform部署yolov5-onnx模型

【官方框架地址】 https://github.com/ultralytics/yolov5 【算法介绍】 Yolov5&#xff0c;全称为You Only Look Once version 5&#xff0c;是计算机视觉领域目标检测算法的一个里程碑式模型。该模型由ultralytics团队开发&#xff0c;并因其简洁高效的特点而备受关注。Yol…

Tampermonkey油猴插件-某红薯一键导出收藏+一键下载单个笔记内容

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列

nova组件讲解和glance对接swift

1、openstack架构 &#xff08;1&#xff09;openstack是一种SOA架构&#xff08;微服务就是从这种架构中剥离出来的&#xff09; &#xff08;2&#xff09;这种SOA架构&#xff0c;就是把每个服务独立成一个组件&#xff0c;每个组件通过定义好的api接口进行互通 &#xff…

使用递归将list转换成tree

在产品研发时遇到这样一个问题&#xff0c;对于省市区县这类三级联动的数据&#xff0c;前端插件需要一次把数据全部返回&#xff0c;单纯的使用接口查询字节的没办法满足要求。 如果一次把数据全部返回&#xff0c;前端使用起来很麻烦需要一条一条的进行查找。 常规的使用方…

软件测试|解读Python的requirements.txt文件:管理项目依赖的完整指南

简介 在Python项目中&#xff0c;管理依赖库是必不可少的。requirements.txt文件是一种常用的方式&#xff0c;用于列出项目所需的所有依赖库及其版本。本文将详细介绍requirements.txt的用法&#xff0c;帮助你更好地管理项目的依赖。 使用步骤 创建requirements.txt文件&am…

2024 爱分析 · AI 与大模型高峰论坛:和鲸喜获两项殊荣!

1 月 9 日下午&#xff0c;“2024 爱分析 AI 与大模型高峰论坛”在京举办。本次论坛以“智能涌现&#xff0c;价值焕新”为主题&#xff0c;汇聚众多专家学者、实践先驱&#xff0c;共同探讨 AI 与大模型在企业内的新场景、新价值、新路径。论坛中&#xff0c;和鲸科技成功入选…

全网最全postman接口测试教程和项目实战~从入门到精通!!!

Postman实现接口测试内容大纲一览&#xff1a; 一、什么是接口&#xff1f;为什么需要接口&#xff1f; 接口指的是实体或者软件提供给外界的一种服务。 因为接口能使我们的实体或者软件的内部数据能够被外部进行修改。从而使得内部和外部实现数据交互。所以需要接口。 比如&…

2023年全国职业院校技能大赛软件测试赛题—单元测试卷①

单元测试 一、任务要求 题目1&#xff1a;根据下列流程图编写程序实现相应分析处理并显示结果。返回文字“xa*a*b的值&#xff1a;”和x的值&#xff1b;返回文字“xa-b的值&#xff1a;”和x的值&#xff1b;返回文字“xab的值&#xff1a;”和x的值。其中变量a、b均须为整型…

虚拟主机操作系统 Windows、Linux

操作系统将直接影响服务器的性能、安全性和可用性&#xff0c;因此确保选择合适的操作系统对于成功运行您的网站或应用程序至关重要。以下是一些考虑因素&#xff0c;可帮助您选择适合您需求的虚拟主机操作系统。 1. 熟悉度和技术支持&#xff1a; 如何选择操作系统应该考虑您…

力扣120. 三角形最小路径和(Java 动态规划)

Problem: 120. 三角形最小路径和 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 Problem:64. 最小路径和 本题目可以看作是在上述题目的基础上改编而来&#xff0c;具体的思路&#xff1a; 1.记录一个int类型的大小的 n 乘 n n乘n n乘n的数组&#xff08;其中 n n n为…

使用 Github、Hugo 搭建个人博客

Hugo 静态网站构建手册&#xff1a;https://jimmysong.io/hugo-handbook/ 关键字&#xff1a;开源 博客 框架 1、GitHub Pages 官网&#xff1a;https://pages.github.com/ 文档&#xff1a;https://docs.github.com/zh Github Pages 简介 Websites for you and your project…

jax.vmap和jax.pmap介绍

jax.vmap 和 jax.pmap 是 JAX 中用于在不同层面进行并行计算的重要工具&#xff0c;它们有助于提高深度学习模型的效率。 import jax import jax.numpy as jnp# 定义一个简单的函数 def example_fn(x):return jnp.sum(x**2)# 输入数据 key jax.random.PRNGKey(42) x_data ja…

HarmonyOS——ArkUI状态管理

一、状态管理 在声明式UI编程框架中&#xff0c;UI是程序状态的运行结果&#xff0c;用户构建了一个UI模型&#xff0c;其中应用的运行时的状态是参数。当参数改变时&#xff0c;UI作为返回结果&#xff0c;也将进行对应的改变。这些运行时的状态变化所带来的UI的重新渲染&…

python 异常处理 try...except...finally..

python 异常处理&#xff1a; 简单的异常处理主要依靠内置异常处理结构体&#xff0c;代码结构如下&#xff1a; try: … except ValueError as e: # 异常判断&#xff0c;出现ValueError错误时处理机制 … except ZeroDivisionError as e: # 异常判断&#xff0c;出现ZeroDiv…

2024年免费服务器活动整理汇总

随着科技的发展&#xff0c;服务器在各行各业的应用越来越广泛&#xff0c;而免费服务器活动也成为了许多企业和个人关注的焦点。目前有许多免费服务器活动可供选择&#xff0c;本文将为大家整理汇总免费服务器活动&#xff0c;帮助大家更好地了解和参与。 一、腾讯云免费服务器…