如何将分词后的句子数组输入Word2vec获取嵌入向量用于安卓日志异常检测
解决方案
- 修正序列生成逻辑
你当前的seq生成代码存在逻辑错误,循环内追加的是完整的eventArray而非滑动窗口生成的子序列,修正代码如下:
seq = [] # 将eventToken转为一维分词列表,去掉多余嵌套结构 event_list = df['eventToken'].tolist() for sequence in seqGen(event_list, 9): seq.append(sequence)
训练Word2Vec模型(基于gensim库)
支持两种训练粒度,可按需选择:- 基于模板分词粒度训练:
from gensim.models import Word2Vec # vector_size为嵌入维度,可根据业务需求调整 w2v_model = Word2Vec( sentences=seq, vector_size=128, window=5, min_count=1, workers=4 ) # 训练完成后可保存模型复用 w2v_model.save("log_w2v.model")- 基于eventID粒度训练(更适合日志异常检测场景,效率更高):
event_id_list = df['eventID'].tolist() seq_id = [] for sequence in seqGen(event_id_list, 9): seq_id.append(sequence) w2v_model_id = Word2Vec(sentences=seq_id, vector_size=128, window=5, min_count=1, workers=4)直接调用接口获取嵌入向量
# 取单个分词的嵌入(模板分词粒度) token_vec = w2v_model.wv['startingNewTask'] # 取单个事件ID的嵌入(eventID粒度) event_vec = w2v_model_id.wv['E1'] # 取整条日志序列的嵌入,默认取序列内所有元素嵌入的平均值,也可改为拼接等其他策略 import numpy as np def get_seq_embedding(input_seq, model): vec_list = [model.wv[item] for item in input_seq if item in model.wv] if not vec_list: return np.zeros(model.vector_size) return np.mean(vec_list, axis=0) # 调用示例 seq_emb = get_seq_embedding(seq[0], w2v_model)
- 手动通过权重矩阵计算嵌入(对应你提到的独热向量乘权重的需求)
如果不想直接调用wv接口,可手动从模型中提取权重矩阵计算:
# 获取词表到索引的映射 vocab = w2v_model.wv.key_to_index # 获取输入层权重矩阵,形状为(词表大小, 嵌入维度) weight_matrix = w2v_model.wv.vectors # 例如获取startingNewTask的嵌入 target_idx = vocab['startingNewTask'] # 独热向量乘权重矩阵等价于直接取权重矩阵对应行的向量 target_vec = weight_matrix[target_idx]
内容的提问来源于stack exchange,提问作者Tyler Betthauser
相关产品推荐
相关产品推荐

