折腾笔记[37]-使用ML.NET进行文本情感分类

news/2025/11/9 23:02:33/文章来源:https://www.cnblogs.com/qsbye/p/19205505

摘要

使用.NET框架的ML.NET深度学习框架训练数据集并进行文本情感分类.

关键信息

  • .net8

原理简介

ML.NET简介

[https://www.nuget.org/packages?page=2&q=Microsoft.ML&sortBy=relevance]
[https://learn.microsoft.com/zh-cn/dotnet/machine-learning/]
[https://learn.microsoft.com/zh-cn/dotnet/api/microsoft.ml.torchsharp?view=ml-dotnet]
[https://github.com/dotnet/TorchSharp]
ML.NET is a cross-platform open-source machine learning framework which makes machine learning accessible to .NET developers.
ML.NET 是面向 .NET 开发人员的开源跨平台机器学习框架,支持将自定义机器学习模型集成到 .NET 应用程序中。 它包含一个 API,其中包含不同的 NuGet 包、名为 模型生成器的 Visual Studio 扩展,以及作为 .NET 工具安装的 命令行接口。

  • ML.NET 包:
    • Microsoft.ML
    • Microsoft.ML.AutoML
    • Microsoft.ML.Probabilistic
    • Microsoft.ML.Tokenizers
    • 许多其他包
  • Visual Studio 扩展:
    • 适用于 Visual Studio 的 Model Builder 扩展

ML.NET CLI 自动为 .NET 开发人员生成模型。

若要单独使用 ML.NET API(无需 ML.NET AutoML CLI),需要选择训练器(针对特定任务的机器学习算法实现),以及应用于数据的数据转换(特征工程)集。 每个数据集的最佳管道将有所不同,并从所有选项中选择最佳算法会增加复杂性。 更进一步,每个算法都有一组要优化的超参数。 因此,你可以花费数周和有时几个月的时间进行机器学习模型优化,试图找到特征工程、学习算法和超参数的最佳组合。

sentiment数据集简介

[https://huggingface.co/datasets/dejanseo/sentiment]
本数据集包含13,650个文本样本,每个样本由llama-3-8b-Instruct-bnb-4bit模型生成,并关联一个从'非常积极'到'非常消极'的情感标签。数据存储在CSV文件中,包含'文本'和'情感标签'两个列,情感标签从0到6,分别代表不同的情感级别。

文本情感分类简介

[https://zh.gluon.ai/chapter_natural-language-processing/sentiment-analysis-rnn.html]
文本分类是自然语言处理的一个常见任务,它把一段不定长的文本序列变换为文本的类别。本节关注它的一个子问题:使用文本情感分类来分析文本作者的情绪。这个问题也叫情感分析(sentiment analysis),并有着广泛的应用。例如,我们可以分析用户对产品的评论并统计用户的满意度,或者分析用户对市场行情的情绪并用以预测接下来的行情。
同求近义词和类比词一样,文本分类也属于词嵌入的下游应用。应用预训练的词向量和含多个隐藏层的双向循环神经网络,来判断一段不定长的文本序列中包含的是正面还是负面的情绪。

实现

1. 获取数据集

[https://huggingface.co/datasets/dejanseo/sentiment/blob/main/data.csv]
csv文件容易解析错误
使用sentiment.xml文件(WPS打开csv文件->另存为->导出为xml文件)
转换完成的数据集: [https://bafybeifvlr3kkxkodmlieise4hlsbubuwo6isyfabvbttpxbna7ogkvmpa.pinme.dev/sentiment.xml]

2. 构建工程

命令:

dotnet new console
cd ./
dotnet add package Microsoft.ML
dotnet add package Microsoft.ML.FastTree
# 添加 sentiment.xml 文件到工程目录
dotnet run
// 文件: Program.cs
// 功能: 7-class 情感分类,数据源改为 sentiment.xml
#nullable disable
using Microsoft.ML;
using Microsoft.ML.Data;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Xml.Linq;public class SentimentData
{public int Label { get; set; }      // 0-6public string Text { get; set; }    // 原文本
}public class SentimentPrediction
{[ColumnName("PredictedLabel")]public int PredictedLabel { get; set; }public float[] Score { get; set; }
}class Program
{static void Main(){const string xmlFile = "sentiment.xml";var ml = new MLContext();// 1. 从 XML 中解析出 List<SentimentData>var samples = ParseXml(xmlFile);// 2. List -> IDataViewvar data = ml.Data.LoadFromEnumerable(samples);// 3. 训练 / 评估拆分var split = ml.Data.TrainTestSplit(data, testFraction: 0.2);var trainData = split.TrainSet;var testData = split.TestSet;// 4. 管道:文本→特征→One-vs-Rest(FastTree)var pipeline =ml.Transforms.Text.FeaturizeText("Features", nameof(SentimentData.Text)).Append(ml.Transforms.Conversion.MapValueToKey("Label")).Append(ml.MulticlassClassification.Trainers.OneVersusAll(ml.BinaryClassification.Trainers.FastTree())).Append(ml.Transforms.Conversion.MapKeyToValue("PredictedLabel"));// 5. 训练var model = pipeline.Fit(trainData);// 6. 评估var metrics = ml.MulticlassClassification.Evaluate(model.Transform(testData));Console.WriteLine($"MacroAcc: {metrics.MacroAccuracy:P2}");// 7. 单次预测var predEngine = ml.Model.CreatePredictionEngine<SentimentData, SentimentPrediction>(model);var sample = new SentimentData { Text = "Today is a great day!" };var pred = predEngine.Predict(sample);Console.WriteLine($"Text: {sample.Text}");Console.WriteLine($"Predicted label: {pred.PredictedLabel}");}// 解析 XML 的核心函数private static List<SentimentData> ParseXml(string path){XNamespace ns = "urn:schemas-microsoft-com:office:spreadsheet";return XDocument.Load(path).Descendants(ns + "Worksheet").Where(ws => (string)ws.Attribute(ns + "Name") == "sentiment").Descendants(ns + "Row").Skip(1)                       // 跳过表头.Select(row => row.Elements(ns + "Cell").ToArray()).Where(cells => cells.Length >= 2)   // 至少两列.Select(cells =>{var text = cells[0].Elements(ns + "Data").FirstOrDefault()?.Value;var rawLabel = cells[1].Elements(ns + "Data").FirstOrDefault()?.Value;bool ok = int.TryParse(rawLabel, out int label);return (ok, label, text);}).Where(x => x.ok && !string.IsNullOrWhiteSpace(x.text)).Select(x => new SentimentData{Label = x.label,Text  = x.text}).ToList();}}

3. 运行效果

MacroAcc: 57.62%
Text: Today is a great day!
Predicted label: 2

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

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

相关文章

从API调用到智能体编排:GPT-5时代的AI开发新模式 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Spring AI Alibaba 项目源码学习(一)-整体介绍

Spring AI Alibaba 项目目录结构说明 请关注微信公众号:阿呆-bot 项目概述 Spring AI Alibaba 是一个多模块 Maven 项目,采用分层架构设计,从底层到上层依次为:Graph 核心运行时、Agent 框架、Studio 应用和 Sprin…

技术架构师到CIO如何转型

目录第一阶段:从“技术实现者”到“业务理解者”——支撑“提高运营效率(操作层)”修炼重点:第二阶段:从“业务支持者”到“管理赋能者”——支撑“加强运营管控(管理层)”修炼重点:第三阶段:从“管理赋能者”…

Layout

1,gen4速度或以上的差分需要在经过阻容焊盘,芯片pin脚,连接器pin脚挖空参考层再隔层补地,改善阻抗。

OS 任务调度

1 什么是任务调度?操作系统为什么需要它? 任务调度是决定哪个任务在何时使用CPU的过程。因为CPU核心数量远少于需要运行的任务(进程/线程)数,需要通过调度来公平、高效地分配计算资源,实现多任务并发/并行的假象…

【Linux】初始线程 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

对于多个图片如何喂给大模型

对于多个图片如何喂给大模型解决办法就是是使用claude和gemini识别图片内容格式化输出后用纯文字输出

Spring Boot + JWT + jjwt 建立前后端分离登录认证(详细教程 + 工具类封装)入门教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

python:pip配置国内源

一,创建目录 说明:是在用户的home目录下创建 liuhongdi@liuhongdi-pc:~$ mkdir .pip liuhongdi@liuhongdi-pc:~$ cd .pip liuhongdi@liuhongdi-pc:~/.pip$ vi pip.conf 二,在配置文件中添加国内源 pip.conf的内容: …

nest目录结构

NestJS目录结构 1. NestJS目录结构 user: nestjs如何组织目录结构assistant: 当然!在 NestJS 中,组织良好的目录结构对于项目的可维护性、可扩展性和团队协作至关重要。虽然没有唯一的“正确”答案,但社区已经形成了…

第十一届中国大学生程序设计竞赛 女生专场(CCPC 2025 Womens Division)题解

目录Problem A. 环状线Problem B. 爬山Problem C. 短视频Problem D. 网络改造Problem E. 购物计划Problem F. 丝之歌Problem G. 最大公约数Problem H. 缺陷解码器Problem I. 调色滤镜Problem J. 后鼻嘤Problem K. 左儿…

什么?从分子变化到四大关键特征解析就是重排反应

什么?从分子变化到四大关键特征解析就是重排反应2025-11-09 22:41 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displa…

高三日记

开坑于 \(11.9\)。 一模考完终于有时间写一下了,先补一下历次考试战绩吧。 G12 名校协作体(\(9.1 \sim 9.2\)) 退役 \(1.5\) 个月,目标是上一下特控线。 语文考完直接破防了。 数学屁也不会。 英语听力错三个,根本…

AI agent framework langgraph

https://docs.langchain.com/oss/python/langgraph/workflows-agentsgraph vs workflow Agents are typically implemented as an LLM performing actions using tools. They operate in continuous feedback loops, a…

计算机毕设项目推荐:基于SpringBoot+Vue的非物质文化遗产再创新系统 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

基于实际字节码解析Python链式赋值:从ls1[i]=2到a=b=c=10的完整机制

基于实际字节码解析Python链式赋值:从ls1[i]=2到a=b=c=10的完整机制 针对你提出的“无固定‘左右顺序’?”的疑问,结合你提供的真实字节码(dis模块输出),我们可以明确:Python链式赋值不存在绝对统一的“左→右”…

实用指南:基于python写的PDF表格提取到excel文档

实用指南:基于python写的PDF表格提取到excel文档pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas",…

侯捷C++面向对象高级开发(上)

一、complex类 1、内联函数 class complex { public:complex(double r=0,double i=0):re(r),im(i){}complex& operator += (const complex&);double real () const {return re;}double imag () const {return …

企业微信scrm源码开发-渠道活码数据库表设计

wx: llike620CREATE TABLE `wxwork_channel` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`name` varchar(100) NOT NULL DEFAULT COMMENT 活码名称,`config_id` varchar(64) NOT NULL DEFAULT COMMENT 企微返回的配…

Python助力数据分析如何用Pandas高效处理大规模资料

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …