在Keras模型中使用预训练的词向量

在Keras模型中使用预训练的词向量

注:训练词向量的时候很可能需要设置VOCAB_MIN_COUNT=1,否则在数据集可能出现不在词典中的情况。

pad_sequences的操作数据为list of list。而CountVectorizer的操作数据为list of str。

0. 数据预处理

0.1 添加新数据

file_handle = open('new_data.txt', 'r') new_data = [] api_list = pd.read_pickle(r'api_list.pkl') api_list = [i.lower() for i in api_list] old_data_set = set(api_list) for line in file_handle.readlines(): new_line = line.strip().split(' ') new_data_set = set(new_line) if len(new_data_set - old_data_set) == 0: new_data.append(new_line) 

0.2 转换原数据

import zipfile import pandas as pd import numpy as np from functools import partial #提取压缩文件中的csv的内容 def get_data(path): with zipfile.ZipFile(path, 'r') as z: #传入训练集或测试集数据路径 if len(z.filelist) == 1: filename = z.filelist[0].filename if filename.endswith('.csv'): f = z.open(filename) data = pd.read_csv(f) return data def keep_elements(api_list, seq): api_set = set(api_list) seq_set = set(seq) if len(seq_set - api_set) != 0: return None list_value = [] for index, element in enumerate(seq): list_value.append(element.lower()) return list_value #由于同一个文件包括了多个API序列,将所有API序列合并到一起 def get_sequence(df, period_idx): seq_list = [] #list of list #第一个到倒数第二个文件的API for _id,begin in enumerate(period_idx[:-1]): seq_list.append(df.iloc[begin: period_idx[_id+1]]['api'].values) #最后一个文件的API seq_list.append(df.iloc[period_idx[-1]:]['api'].values) return seq_list unique_api = pd.read_pickle('api_list.pkl') train = get_data('security_train.zip') test = get_data('security_test.zip') keep_all_elements= partial(keep_elements, unique_api) #api2index = {item:(i+1) for i,item in enumerate(unique_api)} #留0进行padding #index2api = {(i+1):item for i,item in enumerate(unique_api)} #train['api_idx'] = train['api'].map(api2index) train_period_idx = train.file_id.drop_duplicates(keep='first').index.values #train_peroid_idx表示的是每个file最开始的index train_df = train[['file_id','label']].drop_duplicates(keep='first') train_df['seq'] = get_sequence(train, train_period_idx) train_df['seq'] = train_df['seq'].apply(keep_all_elements) train_seq = train_df[train_df['seq'].notnull()]['seq'].values train_seq = train_seq.tolist() #test['api_idx'] = test['api'].map(api2index) test_period_idx = test.file_id.drop_duplicates(keep='first').index.values #test_peroid_idx表示的是每个file最开始的index test_df = test[['file_id']].drop_duplicates(keep='first') test_df['seq'] = get_sequence(test, test_period_idx) test_df['seq'] = test_df['seq'].apply(keep_all_elements) test_seq = test_df[test_df['seq'].notnull()]['seq'].values test_seq = test_seq.tolist() 

1. 训练词向量

1.1 Word2Vec词向量

训练词向量的输入有两种方式,一种是list of list,如下所示。也可以使用文件输入,如

model = gensim.models.Word2Vec(corpus_file=r'/home/learn/code/glove/glove.txt', size=100, window=5, min_count=1, workers=8, sg=0, iter=5) 
import gensim import pickle vector_size = 100 #词向量维度 sentences = train_seq + test_seq + new_data model = gensim.models.Word2Vec(sentences=sentences, size=vector_size, window=5, min_count=1, workers=8, sg=0, iter=5) #window=5效果更好 wv = model.wv vocab_list = wv.index2word word_idx_dict = {} for idx, word in enumerate(vocab_list): word_idx_dict[word] = idx + 1 vectors_arr = wv.vectors vectors_arr = np.concatenate((np.zeros(vector_size)[np.newaxis, :], vectors_arr), axis=0)#此处0位置的向量指代的是padding f_vectors = open('./word_seg_vectors_arr.pkl', 'wb') pickle.dump(vectors_arr, f_vectors) f_vectors.close() import json with open(r'word2idx_vec.json', 'w') as f: json.dump(word_idx_dict, f) 

1.2 训练glove词向量

  1. git clone http://github.com/stanfordnlp/glove
  2. 生成文本
def keep_all_elements(seq): list_value = [] for index, element in enumerate(seq): list_value.append(element) return list_value train_df['seq'] = train_df['seq'].apply(keep_all_elements) train_df['seq'] = train_df['seq'].apply(lambda x:' '.join(x)) train_array = train_df['seq'].tolist() with open('train_seq.txt', 'w') as f: for item in train_array: f.write("%s\n" % item) test_df['seq'] = test_df['seq'].apply(keep_all_elements) test_df['seq'] = test_df['seq'].apply(lambda x:' '.join(x)) test_array = test_df['seq'].tolist() with open('test_seq.txt', 'w') as f: for item in test_array: f.write("%s\n" % item) 
  1. make进行编译。
  2. 修改参数(如VECTOR_SIZE设置成100),然后sh demo.sh即可产生glove词向量。(其中VOCAB_MIN_COUNT大概率需要设置成1)。

1.2.2 训练bigram word2vec

def get_bigram(text): pieces = text.split() return ' '.join('_'.join(pieces[i:i+2]) for i in range(0, len(pieces), 2)) for index, file in enumerate(files): files[index] = get_bigram(file) with open('train_bigram.txt', 'w') as f: for item in files: f.write("%s\n" % item) for index, file in enumerate(outfiles): outfiles[index] = get_bigram(file) with open('test_bigram.txt', 'w') as f: for item in outfiles: f.write("%s\n" % item) 
cat train_bigram.txt test_bigram.txt > glove.txt 

1.3 合并word2vec和glove词向量

此步骤是根据需要进行。

import pandas as pd import numpy as np w2v = pd.read_csv(r'E:\work\competition\security\word_embedding\word2vec.vec', sep=' ', header = None, index_col=0, error_bad_lines=False, skiprows = [0]) w2v.reset_index(inplace=True) w2v.columns = w2v.columns - 1 w2v.rename(columns={-1:'API'}, inplace=True) glove = pd.read_csv(r'E:\work\competition\security\word_embedding\glove.txt', sep=' ', header = None, index_col=0, error_bad_lines=False) glove.reset_index(inplace=True) glove = glove.iloc[:-1,:] glove.columns = glove.columns + 100 glove.rename(columns={100: 'API'}, inplace=True) total_embeddings = pd.merge(w2v, glove, on='API') total_embeddings_array = total_embeddings.iloc[:, 1:].values #去除第一列API的名称 total_embeddings_array = np.concatenate((np.zeros(150)[np.newaxis, :], total_embeddings_array), axis=0) #增加填充0对应的数据 pd.to_pickle(total_embeddings_array, r'E:\work\competition\security\word_embedding\word2vec\windows5\word_seg_vectors_arr_add_glove.pkl') 

1.4 使用keras对API序列进行数字化

from keras.preprocessing.sequence import pad_sequences import json def get_dict_data(file_path): with open(file_path, 'r') as f: dict_data = json.load(f) return dict_data def keep_all_elements_word2vec(seq): ret_value = [] dict_data = get_dict_data(r'./new_data/word2idx_vec.json') #此路径需要修改 ret_value = [dict_data[i] for i in seq] return ret_value train_df['seq'] = train_df['seq'].apply(keep_all_elements_word2vec) train_seq = pad_sequences(train_df['seq'], maxlen=50000, padding='post', truncating='post') test_df['seq'] = test_df['seq'].apply(keep_all_elements_word2vec) test_seq = pad_sequences(test_df['seq'], maxlen=50000, padding='post', truncating='post') pd.to_pickle(train_seq, "train_word2vec_w10_seq.pkl") pd.to_pickle(test_seq, "test_word2vec_w10_seq.pkl") 

2. 使用预训练的词向量

embedding_matrix_path = 'word_seg_vectors_arr.pkl' embedding_matrix = pickle.load(open(os.path.join(data_folder_path, embedding_matrix_path), 'rb')) _embed = Embedding(max_cnt, embed_size, input_length=max_len, mask_zero=mask_zero, weights=[embedding_matrix], trainable=False)(_input) 

Read more

基于FPGA的北斗导航自适应抗干扰算法的设计与实现(任务书+开题报告+文献综述+代码+仿真+实物+毕业论文)

基于FPGA的北斗导航自适应抗干扰算法的设计与实现(任务书+开题报告+文献综述+代码+仿真+实物+毕业论文)

摘   要 如今,随着卫星导航技术的飞速发展,位置信息服务已经融入到我们的日常生活中,导航目前被称为继移动互联网后第三大产业。卫星导航在维护国家的安全中也发挥着不可替代的作用。为了使导航系统不受干扰的影响,本文以北斗导航系统为平台,研究基于阵列天线的自适应抗干扰算法。 首先,文章就自适应抗干扰算法的原理和方法进行了系统介绍,并在MATLAB中建立阵列模型,对基于功率倒置算法的空域抗干扰算法和空时联合抗干扰算法进行性能仿真。然后根据系统的指标,确定了在FPGA中实现抗干扰算法的方案,包括数字下变频、权值计算、数据加权、数字上变频等模块。根据权值计算模块实现方式的不同,本文提供了两种抗干扰算法在FPGA中实现的方案:一种是基于FPGA嵌入式软核NIOS II的抗干扰实现,将权值计算的过程放在NIOS II软核中,用C语言进行实现;另一种是基于逻辑语言的抗干扰算法的实现,即用硬件描述语言Verilog HDL进行权值的计算。权值计算涉及到浮点数运算和Hermite矩阵求逆,本文给出了各模块的设计方法和仿真结果,并与MATLAB仿真结果进行对比。最后给出了两种实现方案的实测结果,表明两种实

FPGA 工程师到底有哪些方向?每个岗位都在干什么?一篇给你讲清楚

FPGA 工程师到底有哪些方向?每个岗位都在干什么?一篇给你讲清楚

很多人说“学 FPGA 就是写 Verilog”,但真正进了行业才发现—— FPGA 工程师并不是一个岗位,而是一整个岗位族群。 不同公司、不同项目,对 FPGA 工程师的要求差异非常大。 如果方向选错,可能学了半年发现岗位根本不对口。 这篇文章就系统地给你拆一拆: 👉 FPGA 工程师到底有哪些岗位? 👉 每个岗位具体干什么? 👉 需要掌握哪些能力? 👉 适合什么样的人? 一、FPGA 工程师整体岗位划分(先给结论) 从企业招聘角度来看,FPGA 岗位大致可以分为 6 类: 岗位方向关键词偏向FPGA 逻辑设计工程师Verilog / 时序 / 接口核心开发FPGA 算法 / 加速工程师图像 / AI / DSP算法落地FPGA 底层驱动工程师DDR / PCIe / SerDes硬件接口FPGA 系统应用工程师Linux + FPGA系统集成FPGA 验证 / 测试仿真 / 验证质量保障FPGA 技术支持 / FA客户 / 项目支持应用型

OpenClaw-多飞书机器人与多Agent团队实战复盘

OpenClaw-多飞书机器人与多Agent团队实战复盘

OpenClaw 多飞书机器人与多 Agent 团队实战复盘 这篇文章完整记录一次从单机安装到多机器人协作落地的真实过程: 包括 Windows 安装报错、Gateway 连通、模型切换、Feishu 配对、多 Agent 路由、身份错位修复,以及最终形成“产品-开发-测试-评审-文档-运维”团队。 一、目标与结果 这次实践的目标很明确: 1. 在 Windows 上稳定跑通 OpenClaw 2. 接入飞书机器人 3. 做到一个机器人对应一个 Agent 角色 4. 支持多模型并行(OpenAI + Ollama) 5. 最终形成可执行的多 Agent 团队 最终落地状态(已验证): * 渠道:Feishu 多账号在线 * 路由:按 accountId

宇树 G1 机器人开发入门:有线 & 无线连接完整指南

宇树 G1 机器人开发入门:有线 & 无线连接完整指南

适用读者:机器人二次开发者、科研人员 开发环境:Ubuntu 20.04(推荐) 机器人型号:Unitree G1 EDU+ 前言 宇树 G1 是一款面向科研与商业应用的高性能人形机器人,支持丰富的二次开发接口。在正式进行算法调试与功能开发之前,首要任务是建立稳定的开发连接。本文将详细介绍两种主流连接方式:有线(网线直连) 与 无线(WiFi + SSH),并附上完整的配置流程,帮助开发者快速上手。 一、有线连接(推荐新手优先使用) 有线连接通过网线直接将开发电脑与 G1 机器人相连,具有延迟低、稳定性高、不依赖外部网络的优势,是新手入门和底层调试的首选方式。 1.1 前置条件 所需物品说明开发电脑推荐安装 Ubuntu 20.04,或在 Windows 上使用虚拟机宇树 G1 机器人确保已开机且处于正常状态网线(