基于NLP的恶意网页识别

基于NLP的恶意网页识别

  • 基于NLP的恶意网页识别
    • 引言
    • 项目目录回顾
    • 优化HTML标签提取结果
    • 使用预训练模型Fine-tune
    • 数据处理和模型训练
    • 模型训练与评估
    • 模型导出
    • 部署与预测
    • 总结

基于NLP的恶意网页识别

引言

欢迎阅读《 基于NLP的恶意网页识别》,在前三篇中,我们已经使用PaddleNLP进行了恶意网页的分类,包括使用文本分类模型和预训练模型Fine-tune。本篇文章将着重优化模型,处理HTML标签提取结果不理想的情况,并最终将训练好的模型部署成可用的Python应用程序。
在这里插入图片描述

项目目录回顾

在前三篇文章中,我们已经完成了以下内容:

  1. 使用PaddleNLP的文本分类模型进行简单的正常网页与被黑网页的二分类。
  2. 使用PaddleNLP的预训练模型Fine-tune,提高HTML网页内容处理结果的判断准确率。
  3. 进行正常网页与恶意网页的二分类,提取HTML标签信息判断网页是否正常。

本篇文章将以第四篇为基础,继续优化HTML标签提取结果,训练并评估模型,并最终将模型部署成可用的Python应用程序。

优化HTML标签提取结果

在之前的训练中,我们发现有些样本的HTML标签提取结果不够理想,主要集中在<script>标签内的信息清理不完整。为了解决这个问题,我们可以设计逻辑判断,将这部分内容留给下一个流程(比如提取文本信息或人工核验)。通过观察样本,我们发现这部分内容大多是恶意网页,所以即使略过也不会对模型的准确性产生太大影响。接下来,我们将优化标签提取结果。

with open("train_list.txt", "r", encoding="utf-8") as f:lines = f.readlines()with open("train_list2.txt", "w", encoding="utf-8") as f_w:for line in lines:if ";" in line or "+" in line:continuef_w.write(line)with open("eval_list.txt", "r", encoding="utf-8") as f:lines = f.readlines()with open("eval_list2.txt", "w", encoding="utf-8") as f_w:for line in lines:if ";" in line or "+" in line:continuef_w.write(line)

这段代码将原始的训练集和验证集中包含<script>标签内信息不完整的样本去除,得到新的训练集train_list2.txt和验证集eval_list2.txt

使用预训练模型Fine-tune

接下来,我们使用PaddleNLP进行预训练模型Fine-tune,以优化HTML标签提取结果的预测准确率。首先,我们需要定义自定义数据集和加载预训练模型。

from paddlenlp.datasets import load_datasetdef read(data_path):with open(data_path, 'r', encoding='utf-8') as f:for line in f:line = line.strip('\n').split('\t')words = ''.join(line[:-1])labels = line[-1]yield {'text': words, 'label': labels}train_ds = load_dataset(read, data_path='train_list2.txt', lazy=False)
dev_ds = load_dataset(read, data_path='eval_list2.txt', lazy=False)# 手动添加标签列表
train_ds.label_list = ['0', '1']
dev_ds.label_list = ['0', '1']

这段代码定义了自定义数据集,并手动添加了标签列表。接下来,我们加载预训练模型和tokenizer。

MODEL_NAME = "ernie-2.0-large-en"ernie_model = paddlenlp.transformers.ErnieModel.from_pretrained(MODEL_NAME)model = paddlenlp.transformers.ErnieForSequenceClassification.from_pretrained(MODEL_NAME, num_classes=len(train_ds.label_list))tokenizer = paddlenlp.transformers.ErnieTokenizer.from_pretrained(MODEL_NAME)

数据处理和模型训练

我们使用PaddleNLP提供的数据处理和模型训练的接口,定义了数据处理函数和模型训练的参数。

from functools import partial
from paddlenlp.data import Stack, Tuple, Pad
from utils import convert_example, create_dataloaderbatch_size = 128
max_seq_length = 64trans_func = partial(convert_example,tokenizer=tokenizer,max_seq_length=max_seq_length)
batchify_fn = lambda samples, fn=Tuple(Pad(axis=0, pad_val=tokenizer.pad_token_id),Pad(axis=0, pad_val=tokenizer.pad_token_type_id),Stack(dtype="int64")): [data for data in fn(samples)]train_data_loader = create_dataloader(train_ds,mode='train',batch_size=batch_size,batchify_fn=batchify_fn,trans_fn=trans_func)
dev_data_loader = create_dataloader(dev_ds,mode='dev',batch_size=batch_size,batchify_fn=batchify_fn,trans_fn=trans_func)learning_rate = 5e-6
epochs = 5
warmup_proportion = 0.1
weight_decay = 0.1num_training_steps = len(train_data_loader) * epochs
lr_scheduler = LinearDecayWithWarmup(learning_rate, num_training_steps, warmup_proportion)
optimizer = paddle.optimizer.AdamW(learning_rate=lr_scheduler,parameters=model.parameters(),weight_decay=weight_decay,apply_decay_param_fun=lambda x: x in [p.name for n, p in model.named_parameters()if not any(nd in n for nd in ["bias", "norm"])])criterion = paddle.nn.loss.CrossEntropyLoss()
metric = paddle.metric.Accuracy()

模型训练与评估

我们使用PaddleNLP提供的训练和评估接口,进行模型的训练与评估。同时,使用VisualDL进行可视化记录。

global_step = 0
for epoch in range(1, epochs + 1):with LogWriter(logdir="./visualdl") as writer:for step, batch in enumerate(train_data_loader, start=1):input_ids, segment_ids, labels = batchlogits = model(input_ids, segment_ids)loss = criterion(logits, labels)probs = F.softmax(logits, axis=1)correct = metric.compute(probs, labels)metric.update(correct)acc = metric.accumulate()global_step += 1if global_step % 50 == 0:print("global step %d, epoch: %d, batch: %d, loss: %.5f, acc: %.5f" % (global_step, epoch, step, loss, acc))writer.add_scalar(tag="loss", step=global_step, value=loss)writer.add_scalar(tag="acc", step=global_step, value=acc)loss.backward()optimizer.step()lr_scheduler.step()optimizer.clear_grad()evaluate(model, criterion, metric, dev_data_loader)model.save_pretrained('/home/aistudio/checkpoint')
tokenizer.save_pretrained('/home/aistudio/checkpoint')

模型导出

训练完成后,我们可以将模型导出为静态图参数,以便后续部署使用。

state_dict = paddle.load('/home/aistudio/checkpoint/model_state.pdparams')
model.set_dict(state_dict)
model.eval()model = paddle.jit.to_static(model,input_spec=[paddle.static.InputSpec(shape=[None, None], dtype="int64"),paddle.static.InputSpec(shape=[None, None], dtype="int64")])
paddle.jit.save(model, '/home/aistudio/static_graph_params')

部署与预测

最后,我们将训练好的模型导出并进行部署,以便进行预测。这里我们假设已经准备好了一个HTML页面的内容,可以使用BeautifulSoup进行解析,提取HTML标签信息,然后使用训练好的模型进行预测。

html = BeautifulSoup(open('sample.html'), 'html.parser', from_encoding='utf-8')def read_tags(text):tags = []class MyHTMLParser2(HTMLParser):def handle_endtag(self, tag):tags.append(tag)parser = MyHTMLParser2()parser.feed(text)return tagstext = ','.join(read_tags(str(html.get_text)))
with open('sample.txt', 'w', encoding='utf-8') as f:f.write(text)!python predict.py --model_file=static_graph_params.pdmodel --params_file=static_graph_params.pdiparams

以上代码将HTML页面的标签信息提取并保存到sample.txt文件中,然后使用训练好的模型进行预测。

总结

在本文中,我们通过优化HTML标签提取结果,使用PaddleNLP进行预训练模型Fine-tune,最终将训练好的模型导出并部署成可用的Python应用程序。这一系列步骤构建了一个完整的恶意网页识别系统,可以帮助企业更好地保护用户免受网络攻击。在未来的工作中,我们可以考虑将网页内容的其他组成部分,如URL链接、图片信息等,加入到系统中,进一步提升恶意网页识别的准确性。

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

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

相关文章

VS+QT编译环境中字符乱码问题详解

字符乱码问题详解 1 编码字符集与字符编码方式2 字符乱码原因3 字符乱码解决方案 在解释字符乱码问题之前&#xff0c;我们需要先理清一些基本概念 1 编码字符集与字符编码方式 编码字符集 编码字符集是所有字符以及对应代码值的集合。编码字符集中的每个字符都对应一个唯一的…

npm换源

检查现在的源地址 npm config get registry 使用淘宝镜像 npm config set registry https://registry.npm.taobao.org 使用官方镜像 npm config set registry https://registry.npmjs.org/

jeecgboot 前端bug or 后端 看图

无法显示文本 只能显示value 很恶心 如果用 varchar 就可以 不知道有没有别的方式 用int 解决 ,可能是我没有发现好的方法

渗透测试之如何部署和使用Supershell

环境: Supershell v2.0.0 Centos 7.6 docker v. 21 问题描述: 如何部署和使用Supershell 解决方案: 1、下载最新release源码,解压后进入项目目录 wget https://github.com/tdragon6/Supershell/releases/latest/download/Supershell.tar.gz如果在线下很慢,用浏览…

测试驱动开发:基于Jenkins+GoTest+HTML的持续化集成

目录 前言 一、项目框架 1.项目迭代 2.项目时序图 3.项目测试执行 二、项目具体实现 1.创建流水线 2.拉取代码 3.执行测试代码 4.生成测试报告 5.报告内容解读 6.数据统计 7.邮件通知 8.企业微信通知 三、项目遇到的问题 1.go test -args 2.go test生…

【Qt】Qt配置

需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云<--/-->阿里云<--/-->华为云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、Qt SDK下载 二、配置环境变量 三、新建工程(QWidget) 四、QWidg…

Kafka-消费者-KafkaConsumer分析-SubscriptionState

KafkaConsumer从Kafka拉取消息时发送的请求是FetchRequest(具体格式后面介绍),在其中需要指定消费者希望拉取的起始消息的offset。 为了消费者快速获取这个值&#xff0c;KafkaConsumer使用SubscriptionState来追踪TopicPartition与offset对应关系。 图展示了SubscriptionSta…

物联网与智慧城市的无界未来:如何打破传统束缚,开启智能生活新篇章

目录 一、物联网&#xff1a;连接万物的技术革命 1、物联网的发展历程 2、物联网的核心技术 二、智慧城市&#xff1a;未来城市的蓝图与挑战 1、智慧城市的蓝图 2、智慧城市建设面临的挑战 3、应对挑战的措施 三、物联网与智慧城市的融合&#xff1a;打破传统束缚&…

Android Matrix绘制PaintDrawable设置BitmapShader,手指触点为圆心scale放大原图,Kotlin

Android Matrix绘制PaintDrawable设置BitmapShader&#xff0c;手指触点为圆心scale放大原图&#xff0c;Kotlin 在 Android基于Matrix绘制PaintDrawable设置BitmapShader&#xff0c;以手指触点为中心显示原图的圆切图&#xff0c;Kotlin&#xff08;4&#xff09;-CSDN博客 的…

使用 Neo4j 和 LangChain 集成非结构化知识图增强 QA

目前基于大模型的信息检索有两种方法&#xff0c;一种是基于微调的方法&#xff0c;一种是基于 RAG 的方法。 信息检索和知识提取是一个不断发展的领域&#xff0c;随着大型语言模型&#xff08;LLM&#xff09;和知识图的出现&#xff0c;这一领域发生了显着的变化&#xff0…

全球移动通信市场,正在经历哪些新变化?

2023年已经结束了。回顾这一年的全球移动通信市场&#xff0c;如果让我用一个词来总结&#xff0c;那就是——“厚积薄发”。 从表面上来看&#xff0c;似乎并没有什么大事情发生。但实际上&#xff0c;平静的湖面之下&#xff0c;却是一片波涛汹涌、风云激荡。 无论是消费互联…

Zookeeper启动报错常见问题以及常用zk命令

Zk常规启动的命令如下 sh bin/zkServer.sh start 启动过程如果存在失败&#xff0c;是没办法直接看出什么问题&#xff0c;只会报出来 Starting zookeeper … FAILED TO START 可以用如下命令启动&#xff0c;便于查看zk启动过程中的详细错误 sh bin/zkServer.sh start-for…

ros2 基础学习16 - RQT:模块化可视化工具

RQT&#xff1a;模块化可视化工具 ROS中的Rviz功能已经很强大了&#xff0c;不过有些场景下&#xff0c;我们可能更需要一些简单的模块化的可视化工具&#xff0c;比如只显示一个摄像头的图像&#xff0c;使用Rviz的话&#xff0c;难免会觉得操作有点麻烦。 此时&#xff0c;我…

nexus3 npm-hosted仓库迁移

迁移背景&#xff1a; 从nexus 3.33 升级到 nexus 3.64 过程中&#xff0c;私服 npm-hosted 无法上传。由于这个 npm-hosted 和 npm-proxy 放的同一个 blob存储&#xff0c;无法单独拆除去&#xff0c;所以采用迁移的方式 迁移思路&#xff1a; down下来 npm-hosted 仓库&am…

pytest学习和使用-pytest如何进行分布式测试?(pytest-xdist)

1 什么是分布式测试&#xff1f; 在进行本文之前&#xff0c;先了解些基础知识&#xff0c;什么是分布式测试&#xff1f;分布式测试&#xff1a;是指通过局域网和Internet&#xff0c;把分布于不同地点、独立完成特定功能的测试计算机连接起来&#xff0c;以达到测试资源共享…

C——语言内存函数

目录 一、memcpy的使用和模拟实现 1.memcpy函数原型 2.memcpy函数的使用 3.memcpy函数的模拟实现 二、memmove的使用和模拟实现 1.memmove函数原型 2.memmove函数的使用 3.memmove函数的模拟实现 三、memset的使用 1.memset函数原型 2.memset函数的使用 四、memcmp…

蓝桥杯备赛 day 3 —— 高精度(C/C++,零基础,配图)

目录 &#x1f308;前言&#xff1a; &#x1f4c1; 高精度的概念 &#x1f4c1; 高精度加法和其模板 &#x1f4c1; 高精度减法和其模板 &#x1f4c1; 高精度乘法和其模板 &#x1f4c1; 高精度除法和其模板 &#x1f4c1; 总结 &#x1f308;前言&#xff1a; 这篇文…

设计一个网页爬虫

定义 User Case 和 约束 注意&#xff1a;没有一个面试官会阐述清楚问题&#xff0c;我们需要定义Use case和约束 Use cases 我们的作用域只是处理以下Use Case&#xff1a; Service 爬取一批 url 生成包含搜索词的单词到页面的反向索引给页面生成标题和片段– 标题和片段是…

迅为RK3588开发板编译 Buildroot单独编译图形化界面(打包镜像)

上面 Kernel/U-Boot/Recovery/Rootfs 各个部分的编译后&#xff0c;将打包要用到的所有固件移动到 rockdev 目录下&#xff0c;然后打包为完整的 update.img 镜像。 首先在 linux 源码目录下输入以下命令进入编译的 UI 界面&#xff0c;进入之后如下所示&#xff1a; ./buil…

gin+gorm增删改查目录框架

从网上找资料,发现,很多都是直接的结构 路由&#xff0c;后端的controller层&#xff0c;还有model层&#xff0c;都是放在了同一个main.go文件中&#xff0c;如果写项目的话&#xff0c;还得自己去拆文件&#xff0c;拆代码&#xff0c;经过查询和自己总结&#xff0c;下面放…