基于Python垃圾短信识别程序(KNN、逻辑回归、随机森林、决策树和多项式分布朴素贝叶斯、伯努利分布朴素贝叶斯等算法进行融合)—含python工程全源码

目录

  • 前言
  • 总体设计
    • 系统整体结构图
    • 请求流程图
    • 系统流程图
  • 运行环境
    • Python 环境
    • jieba分词库
    • Scikit-learn 库
    • nginx
    • php
  • 模块实现
    • 1. 前端模块
    • 2. 后端模块
  • 系统测试
    • 1. 测试结果
    • 2. 结果对比
    • 3. 可视化部分
  • 工程源代码下载
  • 其它资料下载

在这里插入图片描述

前言

本项目以Python为基础,旨在开发一款垃圾短信识别程序。我们将采用KNN、逻辑回归、随机森林、决策树和朴素贝叶斯等多种算法进行融合,以提高识别准确率,并进行测试和应用。

小伙伴们可以通过二次开发,将它应用来处理实际场景中的短信数据。这项技术可以应用于移动通信网络、社交媒体平台等领域,帮助用户自动过滤和识别垃圾短信,提升通信效率和用户体验。

总体设计

本部分包括系统整体结构图和系统流程图。

系统整体结构图

系统整体结构如图所示。

在这里插入图片描述

请求流程图

请求流程如图所示。

在这里插入图片描述

系统流程图

系统流程如图所示。

在这里插入图片描述

运行环境

本部分包括 Python 环境、jieba 分词库、Scikit-learn 库、nginx 和php。

Python 环境

需要 Python 2.7 环境,在 Windows 环境下载 Anaconda ,完成Python 所需的配置,下载地址:https://www.anaconda.com/,也可以下载虚拟机在 Linux 环境下运行代码。

jieba分词库

使用 pip install jieba 命令进行安装。

Scikit-learn 库

使用 pip install sklearn 命令进行安装。

nginx

nginx下载地址:http://nginx.org/en/download.html。

php

进入 php 安装地址 http://windows.php.net/download 下载最新线程安全版 php.zip 压缩包。

模块实现

本项目包括 2 个模块:前端模块和后端模块,下面分别给出各模块的功能介绍及相关代码。

1. 前端模块

1) 短信输入页面
相关代码如下:

index.php

<html>
<?php
#程序简介
#Spam Message Classifiers
?>
<head>
    <title>垃圾短信识别</title>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
        body {background:#eee;}
        ul {padding:0; margin:0;}
        li {list-style:none;}
        #container {margin: 0 auto; width: 80%;}
        #title {color:#146fdf;font-size:25px; text-align:center; font-family:"YouYuan"; font-weight:bold;margin-top:40px;}
        a {color:#146fdf; text-decoration: none}
        a:hover {color: black; text-decoration: underline}
        #g_list {margin-top:60px; background:#fff;border-radius:4px}
        #g_u,#g_p {position:relative}
        #g_u {border-bottom:1px solid #eaeaea}
        .inputstyle {text-align:center;-webkit-tap-highlight-color:rgba(255,255,255,0); width:100%; height:144px;color:#000;border:0; background:0; font-size:16px;-webkit-appearance:none;line-height:normal; /* for non-ie */}
        #cjsubmit {margin-top:40px; width:100%; height:44px; color:#146fdf}
        .button {border:0px; width:100%; height:100%;color:white; background:#146fdf; border-radius:4px; font-size:16px;}
        #notice {text-align:center; margin-top:60px; color:#246183; line-height:14px; font-size:14px; padding:15px 10px}
    </style>
</head>
<body>
    <div id="container">
        <div id="title">垃圾短信识别</div>  
            <form method=post name="cf" target="_blank" onSubmit=javascript:chkfs()>
                <ul  id="g_list">
                    <li  id="g_u">
                        <div  id="del_touch"  class="del_touch">
                            <span  id="del_u"  class="del_u"  style="display: none;"></span>
                        </div>
                        <textarea  id="u"  class="inputstyle"  name="pmessage"  autocomplete="off" ></textarea>
                    </li>
                </ul>
            <div id="cjsubmit"><input type=submit value=识别 class="button"></div>
            <script language=javascript>  
                function chkfs(){ 
                var frm = document.forms['cf'];  
                frm.action="result.php";
                return true;  
                }
            </script>
        </form>
        <div id="notice">
            支持多种分类器:KNN, LR, RF, DT, GBDT, SVM, MultinomialNB, BernoulliNB<BR>
        <p align=center>
            Powered by <a href=http://JackieLiu.win>Jackie Liu</a>
        </div>
    </div>
</body>
</html>

2)短信输出页面
相关代码如下:

result.php

<html>
<?php
#程序简介#
#Spam Message Classifiers
$nomessage = "<font size=4 color=red>请输入短信内容!</font>";//输入错误时的信息
?>
<head>
    <title>垃圾短信识别</title>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
    #title {color:#146fdf;font-size:25px; text-align:center; font-family:"YouYuan"; font-weight:bold;margin-top:40px;margin-bottom:30px;}
    body {background:#eee;}
    #container {margin:0 auto; width: 80%;}
    a {color:#146fdf; text-decoration: none}
    a:hover {color: black; text-decoration: underline}
    .button {border:0px;width:100%; height:100%; color:white; background:#146fdf; border-radius:4px; font-size:16px;}
    #closewindos {margin-top:60px; width:30%; height:30px; color:#146fdf}
    #notice {text-align:center; margin-top:60px; color:#246183; line-height:14px; font-size:14px; padding:15px 10px}
    table {border:1px solid #eaeaed;}
    td {font-size:20px;border-bottom:1px solid #eaeaed; color:#246183}
    </style>
</head>
<body>
    <div id="container">
        <center>
        <div id="title">垃圾短信识别</div>
        <?php
        error_reporting(0);  //禁用错误报告
        #var_dump($_POST);
        if($_POST[pmessage]=="") echo $nomessage; 
        else{
            $output = shell_exec('python /Users/liu/Sites/Model/demoAPI.py'.' '.$_POST[pmessage]);
            echo"<font color=#246183>各分类器检测结果如下</font> </br></br></br>";
            #返回结果形如:LR:[u'1'],RF:[u'1']
            $array = explode(',', $output);
            echo"<table>";
            for ($i=0;$i<count($array)-1;$i++) {
                $result = explode(':', $array[$i]);
                echo"<tr><td><font color=red>$result[0]</font></td>
                         <td>----------</td>
                         <td>$result[1]</td></tr>";
            }
            echo"</table>";
        }
                ?>
        <div id="closewindos"><input type="button" value="关闭此页" class="button" onClick="javascript:window.close()"></div>
        </center>
        <div id="notice">
            支持多种分类器:KNN, LR, RF, DT, GBDT, SVM, MultinomialNB, BernoulliNB<BR>
        <p align=center>
            Powered by <a href=http://JackieLiu.win>Jackie Liu</a>
        </div>
    </div>
</body>
</html>

2. 后端模块

本部分包括数据预处理、模型训练和 nginx 配置。
1)数据预处理
使用 GitHub 的开源数据集,下载地址 https://github.com/mJackie/SpamMessage,分为标签域与文本域,标签域为 1 或 0,分别代表垃圾短信与正常短信,文本域为短信内容。对数据进行预处理,用 jieba 分词器对文本域进行分词处理,利用数据降维对分词后的文本进行操作,创建词袋。相关代码如下:

DataPreprocess.py

# -*- coding: utf-8 -*-
import json
import jieba
import jieba.posseg as pseg
import sklearn.feature_extraction.text
from sklearn.decomposition import NMF
from sklearn.decomposition import PCA
from scipy import sparse, io
from time import time
#使用TF-IDF产生词向量
class TfidfVectorizer(sklearn.feature_extraction.text.TfidfVectorizer):
    def build_analyzer(self):
        def analyzer(doc):
            words = pseg.cut(doc)
            new_doc = ''.join(w.word for w in words if w.flag != 'x')
            words = jieba.cut(new_doc)
            return words
        return analyzer
#PCA或者NMF降维
def dimensionality_reduction(x, type='pca'):
    if type == 'pca':
        n_components = 500   #降低到n_components
        t0 = time()
        pca = PCA(n_components=n_components)
        print ("pca-----fit begin")
        pca.fit(x)
        print ("pca-----fit ok")
        x_transform = sparse.csr_matrix(pca.transform(x))
        print ("pca-----x ok")
        print("PCA reduction done in %0.3fs" % (time() - t0))
                return x_transform
    if type == 'nmf':
        n_components = 500   
        t1 = time()
        nmf = NMF(n_components=n_components)
        print ("nmf-----fit begin")
        nmf.fit(x)
        print ("nmf-----fit ok")
        x_transform = sparse.csr_matrix(nmf.transform(x))
        print ("nmf-----x ok")
        print("NMF reduction done in %0.3fs" % (time() - t1))
             return x_transform
if '__main__' == __name__:
    print ('******************* data preprocessing ********************')
    t0 = time()
    data_lines = 50000
    data_type = "raw"
    x = []
    y = [] 
    lines =[]
    #加载数据
    with open('message.txt') as fr: 
        for i in range(data_lines):  
            line = fr.readline()
            message = line.split('\t')
            y.append(message[0])
            x.append(message[1])
    #存储y到y.json
    with open('raw50000/y.json', 'w') as f:
        json.dump(y, f)
    print ("save y successfully!")
    vec_tfidf = TfidfVectorizer()   #if df<2 discard it, max_df>0.8 discard as well
    data_tfidf = vec_tfidf.fit_transform(x)
    #写入文件,后续调用
    #pickle.dump(vec_tfidf, open("vec_tfidf", 'wb'))
    if data_type == 'raw':
        io.mmwrite('raw50000/raw', data_tfidf)
    '''
    name_tfidf_feature = vec_tfidf.get_feature_names()#将特征名写入feature.json
    with open('feature.json', 'w') as f:
        json.dump(name_tfidf_feature, f)
    print "save feature successfully!"
    '''
    if data_type == 'nmf' or data_type == 'pca&nmf':
        nmf = dimensionality_reduction(data_tfidf.todense(), type='nmf')
        io.mmwrite('nmf', nmf)	#把nmf写入nmf.mtx
        print ("save nmf successfully!")
    if data_type == 'pca' or data_type == 'pca&nmf':
        pca = dimensionality_reduction(data_tfidf.todense(), type='pca')
        io.mmwrite('pca', pca)	#把pca写入pca.mtx
        print ("save pca successfully!")
    print("******* %s lines data preprocessing done in %0.3fs *******" % (data_lines,(time() - t0)))

2)模型训练

相关代码如下:
Classifiers.py

#!usr/bin/env python  
#-*- coding: utf-8 -*-  
import sys  
import os  
import time  
import json
from sklearn import metrics  
from sklearn.naive_bayes import BernoulliNB
from sklearn.model_selection import train_test_split
import numpy as np
from scipy import sparse, io
import cPickle as pickle
reload(sys)  
sys.setdefaultencoding('utf8')
#KNN分类 
def knn_classifier(train_x, train_y):  
    from sklearn.neighbors import KNeighborsClassifier  
    model = KNeighborsClassifier(n_neighbors = 5, algorithm = 'kd_tree')
    model.fit(train_x, train_y)  
    return model  
#逻辑回归分类
def logistic_regression_classifier(train_x, train_y):  
    from sklearn.linear_model import LogisticRegression  
    model = LogisticRegression(penalty='l2')
    model.fit(train_x, train_y)  
    return model  
#随机森林分类
def random_forest_classifier(train_x, train_y):  
    from sklearn.ensemble import RandomForestClassifier  
    model = RandomForestClassifier(n_estimators=8)  
    model.fit(train_x, train_y)  
    return model  
#决策树分类
def decision_tree_classifier(train_x, train_y):  
    from sklearn import tree  
    model = tree.DecisionTreeClassifier()  
    model.fit(train_x, train_y)  
    return model  
#GBDT(Gradient Boosting Decision Tree)分类 
def gradient_boosting_classifier(train_x, train_y):  
    from sklearn.ensemble import GradientBoostingClassifier  
    model = GradientBoostingClassifier(n_estimators=200)  
    model.fit(train_x, train_y)  
    return model
#SVM分类
def svm_classifier(train_x, train_y):
  from sklearn.svm import SVC
  model = SVC(kernel='rbf', probability=True)
  model.fit(train_x, train_y)
  return model
#分类器用fit()函数训练,用predict()函数预测结果
#使用交叉验证SVM分类
def svm_cross_validation(train_x, train_y):  
    #from sklearn.grid_search import GridSearchCV
    from sklearn.model_selection import GridSearchCV
    from sklearn.svm import SVC  
    model = SVC(kernel='rbf', probability=True)  
    param_grid = {'C': [1e-3, 1e-2, 1e-1, 1, 10, 100, 1000], 'gamma': [0.001, 0.0001]}  
    grid_search = GridSearchCV(model, param_grid, n_jobs = 1, verbose=1)
    grid_search.fit(train_x, train_y)  
    best_parameters = grid_search.best_estimator_.get_params()  
    for para, val in best_parameters.items():  
        print para, val  
    model = SVC(kernel='rbf', C=best_parameters['C'], gamma=best_parameters['gamma'], probability=True)  
    model.fit(train_x, train_y)
    return model
#多项式朴素贝叶斯分类
def multinomial_naive_bayes_classifier(train_x, train_y):  
    from sklearn.naive_bayes import MultinomialNB  
    model = MultinomialNB(alpha=0.01)  
    model.fit(train_x, train_y)  
    return model  
#贝努力朴素贝叶斯分类
def bernoulli_naive_bayes_classifier(train_x, train_y):  
    from sklearn.naive_bayes import MultinomialNB  
    model = BernoulliNB(alpha=0.01)
    model.fit(train_x, train_y)  
    return model  
#确定训练集和测试集
def select_data(x, y, takeup):
    train_x, test_x, train_y, test_y = train_test_split(
        x, y, test_size=takeup, random_state=20)
    return train_x, test_x, train_y, test_y
if '__main__' == __name__:
    #0.1表示测试集占10%
    takeup = 0.02   #KNN要改成0.02才能成功,其他可以是0.1
    x = io.mmread('DataPreprocess/raw50000/raw.mtx')
    with open('DataPreprocess/raw50000/y.json', 'r') as f:
        y = json.load(f)
        train_x, test_x, train_y, test_y = select_data(x, y, takeup)
    #test_classifiers = ['LR', 'RF', 'DT',  'MultinomialNB','BernoulliNB','SVM','GBDT', 'KNN']
    #test_classifiers = [ 'KNN','LR', 'RF', 'DT', 'SVM', 'MultinomialNB','BernoulliNB']
    test_classifiers = ['KNN']
    #test_classifiers = ['MultinomialNB','BernoulliNB',]
    classifiers = { 
                    'KNN':knn_classifier,  
                    'LR':logistic_regression_classifier,  
                    'RF':random_forest_classifier,  
                    'DT':decision_tree_classifier, 
                    'GBDT':gradient_boosting_classifier,
                    'SVM':svm_classifier,
                    'MultinomialNB':multinomial_naive_bayes_classifier,  
                    'BernoulliNB':bernoulli_naive_bayes_classifier
    }  
    model_save = {} 
    for classifier in test_classifiers: 
        print '******************* %s ********************' % classifier
        start_time = time.time()
        print classifiers[classifier]
        model = classifiers[classifier](train_x, train_y)  
        print 'training took %fs!' % (time.time() - start_time)
        pickle.dump(model, open('model/'+classifier, 'wb'))
        #预测test_x
        predict = model.predict(test_x)
        #测量
        precision = metrics.precision_score(test_y, predict, pos_label= u'1') #string u'1'
        recall = metrics.recall_score(test_y, predict, pos_label= u'1')  
        print 'precision: %.2f%%, recall: %.2f%%' % (100 * precision, 100 * recall)  
        accuracy = metrics.accuracy_score(test_y, predict)  
        print 'accuracy: %.2f%%' % (100 * accuracy)
        print('RESULT')
        print(metrics.classification_report(test_y, predict))

3)nginx配置

相关代码如下:

nginx.conf

#user  nobody;
worker_processes  1;
error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;
pid        logs/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    #设置日志输出格式和位置
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  logs/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  65;
    #gzip  on;
    server {
        listen       9098;
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
            root   html;
            index  index.php;
        }
        location /Sites {
            root   py;
            index  index.php;
        }
        location /a {
            root   html1;
            index  index.html index.htm;
        }
        #error_page  404              /404.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        #PHP脚本请求全部转发到FastCGI处理,使用FastCGI协议默认配置
            location ~ \.php$ {
            root           py;
            fastcgi_pass   127.0.0.1:9001;
            fastcgi_index  index.php;
#设置脚本文件请求的路径,与fastgi_params配置文件中后面添加的一样,include,可以不要
            #fastcgi_param   SCRIPT_FILENAME  /html1/scripts$fastcgi_script_name; 
            include        fastcgi_params;
        }
    }
}

系统测试

本部分测试结果、结果对比及可视化部分。

1. 测试结果

KNN 临近算法如图1所示,逻辑回归算法如图2所示,随机森林算法如图3所示,决策树算法如图4所示,梯度提升迭代决策树算法如图 5所示,多项式分布朴素贝叶斯算法如图6所示,伯努利分布朴素贝叶斯算法如图 7所示。

在这里插入图片描述

图1 KNN 临近算法结果

在这里插入图片描述

图2 逻辑回归算法结果

在这里插入图片描述

图3 随机森林算法结果

在这里插入图片描述

图4 决策树算法结果

在这里插入图片描述

图5 梯度提升迭代决策树算法结果

在这里插入图片描述

图6 多项式分布朴素贝叶斯算法结果

在这里插入图片描述

图7 伯努利分布朴素贝叶斯算法结果

2. 结果对比

KNN 临近、逻辑回归、随机森林、决策树、梯度提升迭代决策树、多项式分布朴素贝叶斯、伯努利分布朴素贝叶斯对比结果如下表所示。

在这里插入图片描述
通过对比,可以看出 KNN 邻近算法拥有 100%的正确率,召回率只有 4.59%,即 KNN临近算法只将测试集中 4.59%的垃圾短信标记出来。KNN、逻辑回归、朴素贝叶斯的速度很快、随机森林和决策树运行比较慢,梯度提升迭代决策树由于需要对残差进行不断的迭代,速度非常慢。综合召回率与准确率,两种朴素贝叶斯的结果比较理想。

3. 可视化部分

垃圾短信识别如下图所示。

在这里插入图片描述

工程源代码下载

详见本人博客资源下载页

其它资料下载

如果大家想继续了解人工智能相关学习路线和知识体系,欢迎大家翻阅我的另外一篇博客《重磅 | 完备的人工智能AI 学习——基础知识学习路线,所有资料免关注免套路直接网盘下载》
这篇博客参考了Github知名开源平台,AI技术平台以及相关领域专家:Datawhale,ApacheCN,AI有道和黄海广博士等约有近100G相关资料,希望能帮助到所有小伙伴们。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker 安全及日志管理

目录 前言一、Docker 容器与虚拟机的区别1. 隔离与共享2. 性能与损耗 二、Docker 存在的安全问题1.Docker 自身漏洞2.Docker 源码问题 三、Docker 架构缺陷与安全机制四、Docker 安全基线标准五、容器相关的常用安全配置方法六、限制流量流向七、镜像安全八、避免Docker 容器中…

rust 集合、错误处理、泛型、Trait、生命周期、包

集合组织特性相同的数据&#xff1b;泛型可以定义任何抽象数据类型&#xff1b;生命周期限制所有权的作用域范围&#xff1b;错误处理使程序更健壮。 集合 一组特性相同的数据集合&#xff0c;除了基本数据类型的元组、数组。rust 标准库提供了一些非常有用的数据结构。 Vec…

短视频seo源码开发部署技术解析

短视频seo开发需要哪些技术 应用程序优化技术&#xff1a;包括应用程序的各种元素&#xff08;如标题、描述、关键字、图标等&#xff09;的优化和设置&#xff0c;以及应用程序内部链接和导航的合理布局和设置。 视频内容优化技术&#xff1a;包括视频标题、描述、标签、封面…

互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景

多线程访问共享资源的时候&#xff0c;避免不了资源竞争而导致数据错乱的问题&#xff0c;所以我们通常为了解决这一问题&#xff0c;都会在访问共享资源之前加锁。 最常用的就是互斥锁&#xff0c;当然还有很多种不同的锁&#xff0c;比如自旋锁、读写锁、乐观锁等&#xff0…

django中发送get post请求并获得数据

django中发送get post请求并获得数据 项目结构如下注册路由 urls.py在处理函数中处理请求 views.py进行 get的请求01浏览器 get请求传参数02服务器django get参数解析获取01浏览器 post的发送浏览器get 请求 获取页面返回的 form 发送post请求 带参数 02服务器django的post请求…

【嵌入式Qt开发入门】在Ubuntu下编写C++

在 Ubuntu 上面编写 C&#xff0c;本文内容主要介绍在 Ubuntu 在终端窗口下使用 vi/vim 编辑一 个 C源文件。通过编写最简单的示例“Hello,World&#xff01;”。带领大家学习如何在 Ubuntu 终端下编辑和编译 C。这里要求大家会在 Ubuntu 上使用 vi/vim&#xff0c;也就是要求大…

Git分支使用方法

目录 前言 一、查看可用分支 二、创建新分支 三、切换到新分支 四、在新分支上进行工作 五、提交更改 六、切换回主分支 七、删除分支 八、合并分支 前言 分支是指在同一个代码仓库中的不同版本线。它们可以被用来同时开展不同的开发任务、修复bug或实现新功能&#…

【面试题12】HTTP协议三次握手和四次挥手分别是什么

文章目录 一、概览二、三次握手2.1 第一步&#xff1a;客户端向服务端发送 SYN&#xff08;同步&#xff09;包2.2 第二步&#xff1a;服务端返回 ACK&#xff08;确认&#xff09;包和 SYN 包2.3 第三步&#xff1a;客户端返回 ACK&#xff08;确认&#xff09;包 三、四次挥手…

【AudioCaps数据集】windows10下载AudioCaps数据集,附百度网盘下载链接

&#x1f525; AudioCaps是从AudioSet数据集中筛选再加工得到的数据集。 AudioCaps数据集的下载使用python的第三方库 audiocaps-download&#xff0c;根据README.md的提示&#xff0c;先进行配置下载环境&#xff1a; &#x1f4e3; AudioCaps的下载环境配置分为四步&#x…

反AI来了…尼康的Natural Intelligence

a mutant_umbrella tree shaped like a nuclear bomb explosion,a photo-realism photograph, 4k, ultra realistic VS a mutant_umbrella tree shaped like a nuclear bomb explosion 尼康发起了一次名为&#xff1a;Natural Intelligence &#xff0c;“不要放弃现实世界”的…

电商--抢购架构总结

文章目录 背景业务流程业务难点技术难点技术方案技术方向具体落地客户端流控网关流控容器流控后端接口流控数据库流控 流控总结优化读取加速异步化流程处理系统扩容 压测监控 总结参考文献 背景 这是个在做NFT电商项目时遇到的场景&#xff0c;要求运营可以商家某个系列的NFT商…

PHP 文心千帆API接口对接

一&#xff1a;API 调用流程简介 创建一个智能云应用。根据实际需求创建智能云应用。创建成功后&#xff0c;获取AppID、API Key、Secret Key 等信息。API 授权。对应用的 AppID 进行授权。获取接口访问凭证 access_token 。根据第1步获取的 API Key 和 Secret Key &#xff0c…

2023上半年软考系统分析师科目一整理-04

2023上半年软考系统分析师科目一整理-04 企业信息化 企业信息化 企业信息化工程是将( A )相结合&#xff0c;改善企业的经营、管理、产品开发和生产等各个环节&#xff0c;提高生产效率、产品质量和企业的创新能力&#xff0c;从而实现产品设计制造和企业管理的信息化、生产过…

RocketMQ --- 高级篇

一、高级功能 1.1、消息存储 分布式队列因为有高可靠性的要求&#xff0c;所以数据要进行持久化存储。 消息生成者发送消息MQ收到消息&#xff0c;将消息进行持久化&#xff0c;在存储中新增一条记录返回ACK给生产者MQ push 消息给对应的消费者&#xff0c;然后等待消费者返回…

探索uniapp+vue3解析markdown语法|uniapp键盘撑起

最近正在尝试使用uniappvue3开发仿制chatgpt会话功能。 如上图&#xff1a;经过测试在h5/App端/小程序端 均支持markdown语法解析&#xff0c;键盘撑起后&#xff0c;整体页面和顶部自定义导航栏不会被顶起。 uniapp markdown解析及语法高亮 使用了markdown-it和highlight.js…

了解和使用 Docker 镜像仓库

前言 在上文 《了解和使用 Docker》 之后&#xff0c;反响不错&#xff0c;也上了热榜。本来是想直接整理一下容器编排工具 Docker Swarm 和 K8s 博文的&#xff0c;但是半路杀出了这个活动&#x1f602;&#xff0c;为表敬意&#xff0c;先参与一波吧。 本文主要介绍一下容…

HTML 全面入门教程:从基础到高级

目录 一、基本结构和标签1. HTML 文档结构2. 常用标签 二、表单和输入元素1. 表单标签&#xff08;<form>&#xff09;2. 输入元素3.实例 三、样式和布局1. 内联样式2. 内部样式表3. 外部样式表 四、多媒体和嵌入内容1. 图像2. 音频和视频3. 嵌入内容 五、语义化标签语义…

【高频电子线路课程设计】调幅发射机

目录 高频电子线路课程设计 摘要&#xff1a; 1绪论 1.1设计的作用和目的 2调幅发射机的主要性能指标 2.1调幅发射机的工作原理 3小功率调幅发射机的设计 3.1方案的选择 3.1.1简易调幅发射机的工作原理框图 3.1.2功率分配及电源电压确定 3.1.3各级晶体管的选择 3.2…

几个基于springboot在线服务过段时间突然停掉的原因

有几个基于springboot的服务今天发现突然停掉了&#xff0c;也不知道什么原因&#xff0c;所以只能看一下日志了 主要日志如下&#xff1a; 2023-06-17 14:26:21.775 DEBUG o.s.b.f.s.DefaultListableBeanFactory- Retrieved dependent beans for bean dataSource: [mybatisCo…

DAY 79 云原生DOCKER的基本原理及镜像管理

Docker概述 云计算涌现出很多改变传统IT架构和运维方式的新技术&#xff0c;比如虚拟机、容器、微服务、Serverless&#xff08;无服务&#xff09;&#xff0c;无论这些技术应用在哪些场景&#xff0c;降低成本、提升效率是云服务永恒的主题。 1.运行物理机&#xff0c;也称…