基于NLP的恶意网页识别

news2024/9/24 8:21:46

基于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:
                continue
            f_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:
                continue
            f_w.write(line)

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

使用预训练模型Fine-tune

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

from paddlenlp.datasets import load_dataset

def 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_dataloader

batch_size = 128
max_seq_length = 64

trans_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.1

num_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 = batch
            logits = 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 += 1
            if 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 tags

text = ','.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.coloradmin.cn/o/1380638.html

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

相关文章

如何保证数据库和缓存双写一致性-----一篇足以

保证数据库和缓存双写一致性的必要性和优点在于确保系统数据的准确性和可靠性。通过双写一致性机制&#xff0c;系统可以防止因为缓存数据与数据库数据不一致而导致的业务错误。这种做法有效降低了系统的脆弱性&#xff0c;提高了数据的完整性。同时&#xff0c;通过缓存加速读…

AI智能分析网关V4烟火检测算法解决方案

一、背景需求 根据国家消防救援局公布的数据显示&#xff0c;2023年共接报处置各类警情213.8万起&#xff0c;督促整改风险隐患397万处。火灾危害巨大&#xff0c;必须引起重视。传统靠人工报警的方法存在人员管理难、场地数量多且分散等问题&#xff0c;无法有效发现险情降低…

部署Tomcat及其负载均衡

简介 在前面已经学习了Nginx服务器的安装配置&#xff0c;本章主要采用案例课的形式介绍Tomcat及NginxTomcat负载均衡群集。Tomcat案例首先介绍其应用场景&#xff0c;然后重点介绍Tomcat的安装配置&#xff0c;NginxTomcat负载均衡群集案例是应用于生产环境下的一套可靠的Web站…

牛仔行头目标检测竞赛 李沐老师Kaggle(有代码有注释)

一、比赛地址 CowBoy Outfits Detection | Kaggle 二、数据介绍 这次比赛的数据集一共有4879个image&#xff0c;需要自己划分训练集和验证集。annotation的格式是json&#xff0c;因此如果用yolo系列的算法会涉及到json2txt这一步。当然如果不用yolo系列的就不要这段代码了。…

[vivado ] report_utilization -name

可以Open Synthesiezed或 Implementation 后的Design使用下面的命令&#xff0c;一定要加-name这个option, 后面的utilization_1可以可以自定义。 report_utilization -name utilization_1

【Python机器学习】分类器的不确定估计——预测概率

predict_proba的输出是每个类别的概率&#xff0c;通常比decision_function的输出更容易理解&#xff0c;对于二分类问题&#xff0c;它的形状始终是(n_samples,2)。 import mglearn.tools from sklearn.ensemble import GradientBoostingClassifier from sklearn.datasets im…

从DETR到Mask2Former(3):masked attention的attention map可视化

Mask2Former的论文中有这样一张图&#xff0c;表示masked attenion比cross attention效果要好 那么这个attention map是怎么画出来的&#xff1f; 在mask2attention的源代码中 CrossAttentionLayer这个类中&#xff0c;在forward_post函数中做如下修改&#xff1a; def forwar…

轴组【CAN】

如果有126个轴&#xff0c;你程序里挨个添加轴很麻烦。 可以用轴组批量添加。【数组】 CAN驱动器 0x164 就是下个驱动器 p_CAN主站地址:ADR(IoConfig_Globals.CANopen_Manager_SoftMotion);p_CAN从站地址1:ADR(IoConfig_Globals.DMA882_CAN);p_CAN从站地址2:ADR(IoConfig_Gl…

重磅!OpenAI正式发布,自定义ChatGPT商店!

1月11日凌晨&#xff0c;OpenAI在官网正式发布了&#xff0c;自定义GPT商店&#xff0c;可以帮助用户找到目前最好用、流行的自定义ChatGPT助手。 在2024年第一季度&#xff0c;OpenAI将启动GPT 开发者收入计划。首先&#xff0c;美国地区的开发者将根据用户对其 GPT 的使用情…

HTML--超链接

超链接 作用&#xff1a;点击跳转到相应位置 a标签 语法&#xff1a; <a href"链接地址">文本或图片</a>范例&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"/><title>跳转到百度</t…

蓝桥杯单片机进阶教程4——需要分配进程的模块

前言&#xff1a; 【蓝桥杯单片机保姆级教学】 https://www.bilibili.com/video/BV1h3411m7Aw/?p117&share_sourcecopy_web&vd_sourcec4fc67867c5218768e783d04475bc5a2 P117-118 比赛的时候也按照这个顺序来写 一、数码管显示 分析考题 &#xff08;1&#xff09;…

大文件上传切片上传

大文件上传&切片上传 简历中如何写项目经验&技术 切片上传相关面试题 基础实现流程 实现核心&#xff1a;秒传 断点续传 切片 …… 如何实现的 最基本的视图 加上拖拽 加上拖拽事件。监听drop事件&#xff0c;event.dataTransfer.files文件对象。其他dragenter dragove…

odoo17基础培训1-odoo开发基础知识准备以及odoo17开发环境安装

odoo17基础培训 一、odoo开发基础知识准备以及odoo17开发环境安装 1、odoo是什么&#xff1f; 当我介绍客户使用odoo系统作为业务管理平台时&#xff0c;有时会被问到Odoo是什么&#xff1f; 简单点&#xff0c;可以这么说&#xff1a; Odoo是一套完整的系统&#xff0c;是…

Pycharm安装numpy库失败解决办法

一、出现错误&#xff08;以matplotlib为例&#xff09;&#xff1a; 二、解决办法&#xff1a; 方法一&#xff08;失败&#xff09;&#xff1a;PyCharm中有一个安装库的方法是&#xff1a;Settings>>Python Interpreter>>点击右侧的加号 第二个图 失败原因&am…

【开源】基于JAVA语言的固始鹅块销售系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 鹅块类型模块2.3 固始鹅块模块2.4 鹅块订单模块2.5 评论管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 鹅块类型表3.2.2 鹅块表3.2.3 鹅块订单表3.2.4 鹅块评论表 四、系统展示五、核心代码5.…

x-cmd pkg | jless - 受 Vim 启发的命令行 JSON 查看器

目录 简介首次用户功能特点类似工具与竞品进一步探索 简介 jless 是一个命令行 JSON 查看器&#xff0c;设计用于读取、探索和搜索 JSON 数据。可以使用它来替代 less 、 jq 、 cat 以及您当前用于查看 JSON 文件的编辑器的任何组合。它是用 Rust 编写的&#xff0c;可以作为单…

确保CentOS系统中的静态HTTP服务器的数据安全

确保CentOS系统中的静态HTTP服务器的数据安全是一项重要的任务&#xff0c;它有助于保护网站免受未经授权的访问、数据泄露和其他安全威胁。以下是一些关键步骤和最佳实践&#xff0c;以确保CentOS系统中静态HTTP服务器的数据安全&#xff1a; 限制访问权限确保只有授权用户可…

Python爬虫---scrapy shell 调试

Scrapy shell是Scrapy提供的一个交互式shell工具&#xff0c;它可以帮助我们进行爬虫的开发和调试。可以使用它来测试xpath或css表达式&#xff0c;查看它们是如何工作的&#xff0c;以及它们从你试图抓取的网页中提取的数据。它允许你在编写spider时交互地测试表达式&#xff…

JFinal学生信息管理系统

JFinal学生信息管理系统 项目地址&#xff1a;mendianyu/StudentManage: JFinal学生信息管理系统 (github.com) 环境介绍&#xff1a; IDE&#xff1a;IDEA 2021.2.3 jdk:1.8 maven:3.6.3 项目介绍&#xff1a;JFinal框架实现的学生信息管理系统&#xff0c;完成简单的学生信…

MATLAB | 龙年大吉,使用MATLAB绘制会动的中国风神龙

hey各位好久不见&#xff0c;龙年到了&#xff0c;这期画一期配色非常中国风的龙&#xff0c;这个造型的龙参考了某些html绘制龙的视频&#xff0c;但是由于html版全网都是也不咋给代码和代码出处&#xff0c;因此自己写了个MATLAB版本&#xff1a; 可以看到还是非常酷炫的&…