【论文代码】① STIOCS: Active learning-based semi-supervised training framework for IOC extraction

简介: 【论文代码】① STIOCS: Active learning-based semi-supervised training framework for IOC extraction



写在最前面

论文 STIOCS: Active learning-based semi-supervised training framework for IOC extraction

代码解读:https://github.com/MuscleFish/SeqMask.

DataDeal.py

FastTextDeal

getToken方法

getToken方法接受一个参数words,默认值为空字符串。这个方法的目的是将输入的字符串或字符串列表进行分词处理。如果输入的words是一个字符串,那么它会被cut_sentences函数处理,并将结果作为一个列表返回。如果输入的words是一个列表,那么列表中的每个元素都会被cut_sentences函数处理,并将所有结果作为一个列表返回。如果输入的words既不是字符串也不是列表,那么这个方法将返回一个空列表。

def getToken(self, words=""):
        if isinstance(words, str):
            return [cut_sentences(words)]
        if isinstance(words, list):
            return [cut_sentences(w) for w in words]
        return []

clean_sentences方法

clean_sentences方法接受一个参数max_sentence,它的目的是清理paper_emb_list列表中的每个元素。这个方法首先创建一个空列表clear_pem,然后遍历paper_emb_list中的每个元素。对于每个元素,它首先获取其形状,然后检查形状的长度。如果形状的长度为3,那么它会使用numpy.pad函数对元素进行填充,以使其第一维度的长度等于max_sentence,然后将填充后的元素重塑为一个新的形状,并将其添加到clear_pem列表中。如果形状的长度不为3,那么它会创建一个全零的新元素,并将其添加到clear_pem列表中。最后,这个方法使用numpy.concatenate函数将clear_pem列表中的所有元素沿着第0轴连接起来,并返回结果。

def clean_sentences(self, max_sentence):
        clear_pem = []
        for pem in self.paper_emb_list:
            pem_shape = pem.shape
            if len(pem_shape) == 3:
                npem = np.pad(pem, ((0, max_sentence - pem.shape[0]), (0, 0), (0, 0)), 'constant',
                              constant_values=(0, 0))
                npem = np.reshape(npem, (1, npem.shape[0], npem.shape[1], npem.shape[2]))
                clear_pem.append(npem)
            else:
                clear_pem.append(
                    np.zeros((1, max_sentence, self.paper_emb_list[0].shape[1], self.paper_emb_list[0].shape[2])))
        return np.concatenate(clear_pem, axis=0)

getEmbedding方法

getEmbedding方法是FastTextDeal类的一部分,它的目的是获取输入词汇的嵌入表示。

这个方法接受三个参数:words(默认为空字符串)、tokens(默认为None)和max_len(默认为512)。如果没有提供tokens,那么它会使用getToken方法获取words的分词。

如果tokens的长度为0,那么这个方法将返回None。如果tokens的第一个元素的长度小于或等于1,那么它会使用FastTextModelembedding方法获取tokens的嵌入表示,并将结果返回。

如果tokens的第一个元素的长度大于1,那么这个方法将对tokens中的每个元素进行处理。对于每个元素,它首先将其转换为一个列表,然后使用FastTextModelembedding方法获取这个列表的嵌入表示,并将结果添加到paper_emb_list列表中。同时,它还会更新max_sentence的值,使其等于paper_emb_list中所有元素的第一维度的最大长度。最后,这个方法使用clean_sentences方法清理paper_emb_list,并将结果返回。

def getEmbedding(self, words="", tokens=None, max_len=512):
        if not tokens:
            tokens = self.getToken(words)
        if len(tokens) <= 0:
            return None
        if len(tokens[0]) <= 1:
            return self.FastTextModel.embedding(tokens, max_row=max_len)
        else:
            max_sentence = 0
            self.paper_emb_list = []
            for i, paper in enumerate(tokens):
                paper_text = [[w] for w in paper]
                print(i + 1, '/', len(tokens))
                paper_emb = self.FastTextModel.embedding(paper_text, max_row=max_len)
                max_sentence = max(paper_emb.shape[0], max_sentence)
                self.paper_emb_list.append(paper_emb)
                print(self.paper_emb_list[-1].shape, max_sentence)
            return self.clean_sentences(max_sentence)

全部代码

from DataPreprocess import cut_sentences
import joblib
import numpy as np
class FastTextDeal(object):
    def __init__(self):
        self.FastTextModel = joblib.load("./FastTextModels/fastText_20210126.model")
        self.paper_emb_list = []
    def getToken(self, words=""):
        if isinstance(words, str):
            return [cut_sentences(words)]
        if isinstance(words, list):
            return [cut_sentences(w) for w in words]
        return []
    def clean_sentences(self, max_sentence):
        clear_pem = []
        for pem in self.paper_emb_list:
            pem_shape = pem.shape
            if len(pem_shape) == 3:
                npem = np.pad(pem, ((0, max_sentence - pem.shape[0]), (0, 0), (0, 0)), 'constant',
                              constant_values=(0, 0))
                npem = np.reshape(npem, (1, npem.shape[0], npem.shape[1], npem.shape[2]))
                clear_pem.append(npem)
            else:
                clear_pem.append(
                    np.zeros((1, max_sentence, self.paper_emb_list[0].shape[1], self.paper_emb_list[0].shape[2])))
        return np.concatenate(clear_pem, axis=0)
    def getEmbedding(self, words="", tokens=None, max_len=512):
        if not tokens:
            tokens = self.getToken(words)
        if len(tokens) <= 0:
            return None
        if len(tokens[0]) <= 1:
            return self.FastTextModel.embedding(tokens, max_row=max_len)
        else:
            max_sentence = 0
            self.paper_emb_list = []
            for i, paper in enumerate(tokens):
                paper_text = [[w] for w in paper]
                print(i + 1, '/', len(tokens))
                paper_emb = self.FastTextModel.embedding(paper_text, max_row=max_len)
                max_sentence = max(paper_emb.shape[0], max_sentence)
                self.paper_emb_list.append(paper_emb)
                print(self.paper_emb_list[-1].shape, max_sentence)
            return self.clean_sentences(max_sentence)
目录
相关文章
|
机器学习/深度学习 自然语言处理
自然语言处理技术(NLP)
自然语言处理技术(NLP)
390 1
|
11月前
|
开发框架 Java Linux
libgdx的完整教程
本文概述了LibGDX作为一个跨平台的2D/3D游戏开发框架,以其强兼容性、高效性及全面支持游戏开发的多个模块,成为开发者的受欢迎选择。
465 2
libgdx的完整教程
|
10月前
|
API
天气预报15日-墨迹天气-地址查询版免费API接口教程
该接口提供15日天气预报服务,通过指定地址获取墨迹天气预报。支持POST或GET请求,需提供用户ID、KEY、省份名称及地点等参数。返回数据包括15天内每天的天气详情,如最高最低温度、天气变化及图标等。示例中使用的ID和KEY为公共测试账号,建议使用个人账号以获得更高调用频率。
|
Android开发 UED 开发者
Android经典实战之WindowManager和创建系统悬浮窗
本文详细介绍了Android系统服务`WindowManager`,包括其主要功能和工作原理,并提供了创建系统悬浮窗的完整步骤。通过示例代码,展示了如何添加权限、请求权限、实现悬浮窗口及最佳实践,帮助开发者轻松掌握悬浮窗开发技巧。
1802 1
|
人工智能
一文秒懂ChatGPT官方提示词最佳实践(中)(二)
一文秒懂ChatGPT官方提示词最佳实践(中)
|
11月前
|
Java Shell C++
Springboot加载注入bean的方式
本文详细介绍了Spring Boot中Bean的装配方法。首先讲解了使用@Component、@Service、@Controller、@Repository等注解声明Bean的方式,并解释了这些注解之间的关系及各自适用的层次。接着介绍了通过@Configuration和@Bean注解定义Bean的方法,展示了其灵活性和定制能力。最后讨论了@Component与@Bean的区别,并提供了在Spring Boot应用中装配依赖包中Bean的三种方法:使用@ComponentScan注解扫描指定包、使用@Import注解导入特定Bean以及在spring.factories文件中配置Bean。
698 0
|
前端开发 JavaScript 开发者
实用技巧:提高前端开发效率的5个方法
提高前端开发效率是每个开发者都追求的目标。本文将介绍5个实用的技巧,帮助前端开发者提升工作效率:使用代码片段加速开发、合理利用浏览器开发者工具、充分利用现有框架和库、使用自动化构建工具、保持学习和不断优化工作流程。
b站如何一次性把up主全部取消关注,让自己去学习
b站如何一次性把up主全部取消关注,让自己去学习
|
机器学习/深度学习 人工智能 数据处理
详解机器学习中的数据处理(一)——缺失值处理(附完整代码)
详解机器学习中的数据处理(一)——缺失值处理(附完整代码)
1067 0
|
SQL 存储 分布式计算
ODPS SQL优化总结
ODPS(Open Data Processing Service)是一个海量数据处理平台,基于阿里巴巴自主研发的分布式操作系统(飞天)开发,是公司云计算整体解决方案中最核心的主力产品之一。本文结合作者多年的数仓开发经验,结合ODPS平台分享数据仓库中的SQL优化经验。
3596 0
ODPS SQL优化总结