【人工智能】利用TensorFlow.js在浏览器中实现一个基本的情感分析系统
使用TensorFlow.js在浏览器中进行情感分析是一个非常实用的应用场景。TensorFlow.js 是一个用于在JavaScript环境中训练和部署机器学习模型的库,使得开发者能够在客户端直接运行复杂的机器学习任务。对于情感分析,我们可以使用预先训练好的模型来识别文本中的积极、消极或中性情感。
下面我会给你一个简化的项目计划,包括原理和方法、技术栈的选择、模型的设计,以及一个简单的示例代码,来演示如何使用TensorFlow.js实现一个基本的情感分析器。
一、项目原理和方法
1.情感分析原理
- 特征提取:将文本转换成数值特征,常见的方法有词袋模型、TF-IDF 和词嵌入(如Word2Vec、GloVe)。
- 模型训练:使用监督学习算法,如逻辑回归、支持向量机、递归神经网络 (RNN) 或者长短期记忆网络 (LSTM) 来分类文本情感。
- 模型部署:将训练好的模型部署到生产环境,在本例中是在浏览器中使用TensorFlow.js。
2.使用的方法
- 预训练模型:可以使用预训练的模型,例如使用BERT或其他Transformer模型进行情感分类。
- 自定义模型:也可以从头开始训练一个简单的模型,例如使用LSTM进行文本分类。
二、技术栈
- 前端:HTML, CSS, JavaScript
- 后端(可选):Node.js + Express
- 机器学习库:TensorFlow.js
- 模型训练:TensorFlow.js 或 TensorFlow (Python) 进行模型训练,然后转换为TensorFlow.js格式
三、架构设计
- 模型训练:在服务器端或本地训练一个简单的情感分析模型。
- 模型部署:将模型导出为TensorFlow.js格式,并通过HTTP服务提供给客户端。
- 前端应用:用户输入文本,前端调用TensorFlow.js API进行预测,并显示结果。
四、示例代码
在这个示例中,我们将使用一个简单的LSTM模型来进行情感分析。首先,我们需要创建一个简单的模型并在服务器端训练它,然后将其转换为TensorFlow.js格式,并部署到一个简单的前端应用中。
4.1 训练模型 (Python)
首先,我们需要在Python环境中训练一个模型。这里我们假设已经有一个预处理过的数据集 sentiment_data.csv,其中包含两列:text 和 label(0表示负面,1表示正面)。
import tensorflow as tf
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
import pandas as pd# 加载数据
data = pd.read_csv('sentiment_data.csv')
texts = data['text'].values
labels = data['label'].values# 分词器
tokenizer = Tokenizer(num_words=10000, oov_token="<OOV>")
tokenizer.fit_on_texts(texts)
sequences = tokenizer.texts_to_sequences(texts)# 序列填充
padded_sequences = pad_sequences(sequences, padding='post', maxlen=128)# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(padded_sequences, labels, test_size=0.2)# 定义模型
model = tf.keras.Sequential([tf.keras.layers.Embedding(10000, 16, input_length=128),tf.keras.layers.LSTM(64, return_sequences=True),tf.keras.layers.LSTM(32),tf.keras.layers.Dense(1, activation='sigmoid')
])# 编译模型
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])# 训练模型
model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test), verbose=2)# 导出模型
model.save('sentiment_model.h5')
4.2 转换模型到TensorFlow.js
使用TensorFlow.js Converter将模型转换为TensorFlow.js格式。
tensorflowjs_converter --input_format keras sentiment_model.h5 models/sentiment_model
4.3 前端应用
创建一个简单的HTML文件,使用TensorFlow.js进行预测。
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>Sentiment Analysis with TensorFlow.js</title><script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@3.9.0/dist/tf.min.js"></script><script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/universal-sentence-encoder@4.1.0/dist/index.min.js"></script><style>body { font-family: Arial, sans-serif; }#output { margin-top: 20px; }</style>
</head>
<body><h1>Sentiment Analysis Demo</h1><textarea id="inputText" rows="4" cols="50">Enter text here...</textarea><button onclick="analyzeSentiment()">Analyze Sentiment</button><div id="output"></div><script>// Load the modelconst modelUrl = 'models/sentiment_model/model.json';let model;async function loadModel() {model = await tf.loadLayersModel(modelUrl);}// Analyze the sentiment of the input textasync function analyzeSentiment() {const inputText = document.getElementById('inputText').value;const encodedText = await universalSentenceEncoder.embed(inputText);const prediction = model.predict(encodedText.expandDims());const sentiment = prediction.dataSync()[0];const outputDiv = document.getElementById('output');outputDiv.innerHTML = `Sentiment Score: ${sentiment.toFixed(2)}<br />`;if (sentiment > 0.5) {outputDiv.innerHTML += "The sentiment is positive.";} else {outputDiv.innerHTML += "The sentiment is negative.";}}// Load the model when the page loadswindow.onload = loadModel;</script>
</body>
</html>
4.4 注意事项
- 在这个示例中,我们使用了Universal Sentence Encoder来将文本编码为向量,这简化了模型的复杂度。但在实际应用中,你可能需要使用相同的分词器和序列填充策略来确保输入的一致性。
- 如果你的模型使用了不同的预处理步骤,你需要确保前端能够正确地复制这些步骤。
- 这个示例假设你已经有了一定规模的标注数据集。在实际应用中,你可能需要收集和标记更多的数据。
五、完善项目
上面我们已经完成了情感分析的基本框架,接下来我们可以进一步完善这个项目,使其更加完整和实用。这包括以下几个方面:
- 增强前端界面:添加更多的交互元素和样式,提升用户体验。
- 优化模型:考虑使用更先进的模型,比如BERT,以及对模型进行微调以提高准确性。
- 集成API:为模型提供一个RESTful API接口,方便其他应用程序调用。
- 部署到服务器:将前端和后端部署到云服务器上,使其对外界可用。
1. 增强前端界面
让我们先来改进前端界面,增加一些交互元素,比如按钮、进度条和结果展示区等,以提升用户体验。
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>Sentiment Analysis with TensorFlow.js</title><script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@3.9.0/dist/tf.min.js"></script><script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/universal-sentence-encoder@4.1.0/dist/index.min.js"></script><style>body { font-family: Arial, sans-serif; }#inputText { width: 100%; height: 150px; }#output { margin-top: 20px; }#progressBar { display: none; width: 100%; height: 20px; background-color: #ddd; }#progressBar .progress-bar { height: 100%; background-color: #4caf50; }</style>
</head>
<body><h1>Sentiment Analysis Demo</h1><textarea id="inputText" placeholder="Enter text here..."></textarea><button onclick="analyzeSentiment()">Analyze Sentiment</button><div id="progressBar"><div class="progress-bar"></div></div><div id="output"></div><script>// Load the modelconst modelUrl = 'models/sentiment_model/model.json';let model;async function loadModel() {model = await tf.loadLayersModel(modelUrl);}// Analyze the sentiment of the input textasync function analyzeSentiment() {const inputText = document.getElementById('inputText').value.trim();if (!inputText) {alert("Please enter some text to analyze.");return;}showProgressBar();const encodedText = await universalSentenceEncoder.embed(inputText);const prediction = model.predict(encodedText.expandDims());const sentiment = prediction.dataSync()[0];hideProgressBar();const outputDiv = document.getElementById('output');outputDiv.innerHTML = `Sentiment Score: ${sentiment.toFixed(2)}<br />`;if (sentiment > 0.5) {outputDiv.innerHTML += "The sentiment is positive.";} else {outputDiv.innerHTML += "The sentiment is negative.";}}function showProgressBar() {const progressBar = document.getElementById('progressBar');const progress = progressBar.querySelector('.progress-bar');progressBar.style.display = 'block';progress.style.width = '0%';const intervalId = setInterval(() => {let width = parseFloat(progress.style.width);if (width >= 100) {clearInterval(intervalId);progress.style.width = '100%';setTimeout(() => {hideProgressBar();}, 500);} else {progress.style.width = `${width + 10}%`;}}, 50);}function hideProgressBar() {const progressBar = document.getElementById('progressBar');progressBar.style.display = 'none';}// Load the model when the page loadswindow.onload = loadModel;</script>
</body>
</html>
2. 优化模型
我们可以考虑使用更先进的模型,比如BERT。BERT是一个基于Transformer的预训练模型,它在多种自然语言处理任务上取得了非常好的效果。这里我们使用TensorFlow.js的@tensorflow-models/bert库来加载一个预训练的BERT模型,并进行微调。
2.1 更新模型训练代码 (Python)
由于BERT模型的训练较为复杂,我们在这里只提供一个概览。你可以在Python环境中训练一个基于BERT的模型,并将其转换为TensorFlow.js格式。
import tensorflow as tf
import tensorflow_hub as hub
import tensorflow_text as text
from official.nlp import optimization # to create AdamW optimizer
import tensorflow_datasets as tfds
import os# Load BERT model and tokenizer
bert_preprocess_model = hub.KerasLayer("https://tfhub.dev/tensorflow/bert_en_uncased_preprocess/3")
bert_encoder = hub.KerasLayer("https://tfhub.dev/tensorflow/bert_en_uncased_L-12_H-768_A-12/4")# Define model architecture
def create_model():text_input = tf.keras.layers.Input(shape=(), dtype=tf.string, name='text')preprocessing_layer = hub.KerasLayer(bert_preprocess_model, name='preprocessing')encoder_inputs = preprocessing_layer(text_input)encoder = hub.KerasLayer(bert_encoder, trainable=True, name='BERT_encoder')outputs = encoder(encoder_inputs)net = outputs['pooled_output']net = tf.keras.layers.Dropout(0.1)(net)net = tf.keras.layers.Dense(1, activation=None, name='classifier')(net)return tf.keras.Model(text_input, net)# Compile the model
model = create_model()
loss = tf.keras.losses.BinaryCrossentropy(from_logits=True)
metrics = tf.metrics.BinaryAccuracy()epochs = 5
steps_per_epoch = tf.data.experimental.cardinality(list(train_data)).numpy()
num_train_steps = steps_per_epoch * epochs
num_warmup_steps = int(0.1*num_train_steps)optimizer = optimization.create_optimizer(init_lr=3e-5,num_train_steps=num_train_steps,num_warmup_steps=num_warmup_steps,optimizer_type='adamw')model.compile(optimizer=optimizer,loss=loss,metrics=metrics)# Train the model
model.fit(x=train_data,y=train_labels,validation_data=(val_data, val_labels),epochs=epochs)# Save the model
model.save('sentiment_bert_model.h5')
2.2 转换模型到TensorFlow.js
使用TensorFlow.js Converter将模型转换为TensorFlow.js格式。
tensorflowjs_converter --input_format keras sentiment_bert_model.h5 models/sentiment_bert_model
2.3 更新前端应用
更新前端应用以使用BERT模型进行预测。
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>Sentiment Analysis with TensorFlow.js (BERT)</title><script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@3.9.0/dist/tf.min.js"></script><script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/bert@1.0.0/dist/index.min.js"></script><style>/* ... existing styles ... */</style>
</head>
<body><!-- ... existing HTML elements ... --><script>// Load the modelconst modelUrl = 'models/sentiment_bert_model/model.json';let model;async function loadModel() {model = await tf.loadLayersModel(modelUrl);}// Analyze the sentiment of the input textasync function analyzeSentiment() {const inputText = document.getElementById('inputText').value.trim();if (!inputText) {alert("Please enter some text to analyze.");return;}showProgressBar();// Use BERT to encode the input textconst encoder = new BertEncoder('uncased_L-12_H-768_A-12');const encodedText = await encoder.encode(inputText);const prediction = model.predict(encodedText);const sentiment = prediction.dataSync()[0];hideProgressBar();const outputDiv = document.getElementById('output');outputDiv.innerHTML = `Sentiment Score: ${sentiment.toFixed(2)}<br />`;if (sentiment > 0.5) {outputDiv.innerHTML += "The sentiment is positive.";} else {outputDiv.innerHTML += "The sentiment is negative.";}}// ... existing functions ...// Load the model when the page loadswindow.onload = loadModel;</script>
</body>
</html>
3. 集成API
为了让其他应用程序能够调用情感分析模型,我们可以创建一个RESTful API。
3.1 创建API (Node.js + Express)
const express = require('express');
const bodyParser = require('body-parser');
const tf = require('@tensorflow/tfjs-node');
const { BertEncoder } = require('@tensorflow-models/bert');const app = express();
app.use(bodyParser.json());// Load the model
let model;async function loadModel() {model = await tf.loadLayersModel('file://./models/sentiment_bert_model/model.json');
}loadModel().then(() => {console.log('Model loaded successfully.');
});// Analyze sentiment endpoint
app.post('/analyze', async (req, res) => {const { text } = req.body;if (!text) {return res.status(400).send({ error: 'Missing text' });}const encoder = new BertEncoder('uncased_L-12_H-768_A-12');const encodedText = await encoder.encode(text);const prediction = model.predict(encodedText);const sentiment = prediction.dataSync()[0];res.json({ sentimentScore: sentiment, isPositive: sentiment > 0.5 });
});// Start the server
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {console.log(`Server is running on port ${PORT}`);
});
4. 部署到服务器
你可以将前端和后端分别部署到云服务器上,例如使用Heroku或AWS。这里就不详细展开部署过程了,但你可以参考各个云服务商的文档来进行部署。
通过这些步骤,你将能够构建一个功能完整的情感分析应用,其中包括了用户友好的前端界面、先进的BERT模型以及一个可被其他应用程序调用的API。希望这个项目对你有所帮助!如果有任何疑问或需要进一步的帮助,请随时告诉我。
相关文章:
【人工智能】利用TensorFlow.js在浏览器中实现一个基本的情感分析系统
使用TensorFlow.js在浏览器中进行情感分析是一个非常实用的应用场景。TensorFlow.js 是一个用于在JavaScript环境中训练和部署机器学习模型的库,使得开发者能够在客户端直接运行复杂的机器学习任务。对于情感分析,我们可以使用预先训练好的模型来识别文本…...
Python——扩展数据类型
Python 的扩展数据类型是对内置数据类型的增强,旨在解决特定需求,提供更高级的功能。我们来看一些常见的扩展数据类型及其原理、用途,并通过示例逐步讲解。 1. collections.namedtuple namedtuple 是增强的元组,允许用名称访问元…...
JavaScript 详解——Vue基础
第一章 JavaScript简介 为什么学习javascript ? JavaScript 是全球最流行的编程语言。 JavaScript 是属于 Web 的编程语言。 JavaScript 是 web 开发者必学的三种语言之一: HTML 定义网页的内容 CSS 规定网页的布局 JavaScript 对网页行为进行编程 …...
机械行业数字化生产供应链产品解决方案(十二)
我们为机械行业提供的数字化生产供应链解决方案通过集成物联网、人工智能和大数据技术,打造了一套智能化的生产和供应链管理系统,实现了从设计、生产到物流的全程数字化、智能化。该系统通过实时数据采集与分析,优化生产计划和资源配置&#…...
Git——命令集合
Git命令集合 1. 基本操作 1.1 创建版本库 初始化本地仓库:git init添加文件到仓库:git add | git add file file2… | git add.提交文件到本地仓库:git commit -m “message” 1.2 版本回退 查看状态: git status查看全部修改…...
python 数据可视化折线图练习(下:代码演示)
根据上篇对三国疫情情况数据的罗列,构建折线图完成数据展示。(示例如下) 接下来是具体代码演示 import json from pyecharts.charts import Line from pyecharts.options import TitleOpts , LegendOpts , ToolboxOpts ,VisualMapOpts , T…...
深入探索 Go 1.18 的 debug/buildinfo:构建信息的获取与应用
标题:深入探索 Go 1.18 的 debug/buildinfo:构建信息的获取与应用 引言 Go 语言自 1.18 版本起,引入了对构建信息的标准化处理,这一特性极大地简化了获取程序构建信息的过程。debug/buildinfo 包提供了访问 Go 二进制文件中嵌入…...
Nios II的BSP Editor
1.菜单打开BSP Editor (1) (2) (3) 项目文件夹 -> software文件夹 -> ... _bsp文件夹 -> settings.bsp文件 2.文件打开BSP Editor 选中项目文件,右键,Nios II -> …...
Android-自适用高度的ViewPager
需求 在项目中,我们常常遇到需要动态调整 ViewPager 的高度,以适应其内容大小的需求。默认情况下,ViewPager 的高度是固定的,无法根据每个页面的内容高度进行调整。这会导致在内容高度不一致时,出现不必要的空白区域或…...
代码随想录day38|| 322零钱兑换 279完全平方数 139单词拆分
322零钱兑换 力扣题目链接 题目描述: 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,…...
Cesium天空盒子(Skybox)制作(js代码)和显示
介绍 在Cesium中,星空背景是通过天空盒子方式(6张图片)来显示的,原生的图片分辨率太低,本项目用于生成天空盒子的6张图片。最终生成的6个图片大小约为500kb(每个),格式为jpg,总共的恒星数目约为…...
JAVA中的缓冲流BufferedInputStream
在Java中,BufferedInputStream 是一种用于包装其他输入流(如 FileInputStream)的过滤流。它通过内部缓冲区机制提高了输入流处理的效率。使用缓冲流可以减少读取数据的次数,因为每次从输入流读取数据时,BufferedInputS…...
WindowContainerTransaction类详解(一)
1、WindowContainerTransaction是什么: windowContainerTransaction类的对象是用来存储对windowContainer的修改的一个集合,windowContainer。因为应用侧是无法直接操作windowContainer的,如果应用侧需要修改windowContainer的话,…...
安装NFS扩展
#添加helm源 helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner #创建个namespace(可选,主要是为了查看资源方便) kubectl create ns nfs-sc-default #使用helm安装(10.1.129.86为NFS地址,/home/data/nfs…...
计算机网络——运输层(进程之间的通信、运输层端口,UDP与TCP、TCP详解)
运输层协议概述 进程之间的通信 运输层向它上面的应用层提供通信服务。 当网络边缘部分的两台主机使用网络核心部分的功能进行端到端的通信时,都要使用协议栈中的运输层;而网络核心部分中的路由器在转发分组时只用到下三层的功能。 Q1:我们…...
代码随想录算法训练营第一天 | 二分查找
文章目录 Leetcode704 二分查找二分法的使用前提:区间选择其他注意事项 Leetcode27 移除元素解题思路:优化思路 Leetcode704 二分查找 链接:https://leetcode.cn/problems/binary-search/ 代码随想录: https://programmercarl.com/ 时间复杂度: O(logN) 空间复杂度:…...
python相关知识
1、注释 共有三种:#、 、””” ””” 2、数据类型 整数、浮点、字符串、布尔、列表、元组、集合、字典 num1 666、num2 3.14、t1 True、t2 False、 列表:list [1,2,3,4] 元组:tuple (11,aaa,ddd,3) 字典:dict {li…...
Visual Studio 2022 LNK2001无法解析的外部符号 _wcscat_s 问题记录
ANSI C程序中,用到了wcsrchr、wcsncpy_s、wcscat_s、wcscpy_s等几个字符串函数,但是编译时提示: 错误 LNK2001 无法解析的外部符号 _wcscat_s 查了挺多帖子,没有解决。 https://bbs.csdn.net/topics/250012844 解决VS编译…...
Java高并发处理机制
高并发处理的思路: 扩容:水平扩容、垂直扩容缓存:将基础的数据放入缓存进行处理使用SpringCloud的注册中心,分服务注册到同一个注册中心,服务器检测使用Spring的熔断操作,检测服务器的心跳那个正常随机跳转…...
7 数据存储单位,整型、浮点型、字符型、布尔型数据类型,sizeof 运算符
目录 1 数据类型的分类 2 数据存储单位 2.1 位 2.2 字节 2.3 其余单位 3 整数类型 3.1 基本介绍 3.2 整型的类型 3.2.1 整数类型多样性的原因 3.2.2 整型类型之间的相对大小关系 3.3 整型注意事项 3.4 字面量后缀 3.5 格式占位符 3.6 案例:声明并输出…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...
React核心概念:State是什么?如何用useState管理组件自己的数据?
系列回顾: 在上一篇《React入门第一步》中,我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目,并修改了App.jsx组件,让页面显示出我们想要的文字。但是,那个页面是“死”的,它只是静态…...
「Java基本语法」变量的使用
变量定义 变量是程序中存储数据的容器,用于保存可变的数据值。在Java中,变量必须先声明后使用,声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例:声明与初始化 public class VariableDemo {publi…...
学习 Hooks【Plan - June - Week 2】
一、React API React 提供了丰富的核心 API,用于创建组件、管理状态、处理副作用、优化性能等。本文档总结 React 常用的 API 方法和组件。 1. React 核心 API React.createElement(type, props, …children) 用于创建 React 元素,JSX 会被编译成该函数…...
