论文 STIOCS: Active learning-based semi-supervised training framework for IOC extraction
代码解读:https://github.com/MuscleFish/SeqMask.
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,那么它会使用FastTextModel
的embedding
方法获取tokens
的嵌入表示,并将结果返回。
如果tokens
的第一个元素的长度大于1,那么这个方法将对tokens
中的每个元素进行处理。对于每个元素,它首先将其转换为一个列表,然后使用FastTextModel
的embedding
方法获取这个列表的嵌入表示,并将结果添加到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)