机器学习 | 无特征URL异常模式检测


背景:很多情况下,对于异常URL的判别是一项重要的工作,特别是在风控或者是安全防护的环境下。而在很多情况下,是无法获取很多跟URL本身相关的信息源的。比如,数据源受限,你无法获取到URL相关的数据。或者是对于URL判别有实时性的要求,所以无法通过爬取URL的任何内容来提取特征进行判断。
方案:在以上的限定情况下,唯一能使用的关于URL的特征只有URL文本本身。所以,如何通过url文本挖掘来进行异常模式的判别,是具有意义的。同时,通过最近大热的神经网络,能够对url进行自动提取特征,表示学习的效果要比人工构造特征更好。


URL文本挖掘模式?


对于url文本挖掘来说,主要通过几种方式:

  • 【固定切词】
    通过对url进行按固定模式切词,比如按照『/』以及『:』等进行切分,然后对切分后的相关特征进行分析建模。

    • 优点
      1. 每个切词都有明确的划分含义。
      2. 模型的可解释性强。
    • 缺点
      1. 需要手动确认需要切分词。
      2. 每个划分域的可能性太多,导致数据字典过大,训练数据相对来说稀疏,不容易训练。
      3. 采用划分域过宽,丢失细节信息过多。
  • 【k-gram切词】
    通过对url按照固定长度切词,比如按照k-gram进行切词,切词完之后的list成为文本构成词语进行分析建模。

    • 优点
      1. 无需进行固定切分词确认。
    • 缺点
      1. 需要对参数k进行合适的调参,来获取有意义的切分效果。
      2. 同时如果k较大的时候,词库可能会非常大,导致不易获取好的embeding效果。
  • 【字母切词】
    通过对url按照单个字母进行切词,将每一个字母视为构成句子的基本单元,然后进行分析建模。为k-gram中k为1的特殊情况。

    • 优点
      1. 无需调参。
      2. 固定切分词确认。
    • 缺点
      1. 丢失了网址本身划分字段的信息。
      2. 模型解释能力较弱。
  • 【结论】
    通过上述的优缺点分析,在数据量不大,尽可能避免丢失信息量,并且对于模型的解释性要求不高的情况下,采用【字母切词】作为url文本挖掘的算法,相对来说预期效果会更好。

从0到1构建算法


  • 数据前期处理
    • 【步骤一】:设定url统一长度。
      通过对所有url的长度的分布进行统计画出长度分布图,这里需要考虑的问题主要是在不损失过多的url信息长度的条件下,尽可能的降低需要考虑的url长度来提升神经网络的构建复杂度和计算效率(当然,如果你的数据量和计算能力足够的情况下,考虑max长度可能会是保留信息量更好的方式)。基本设定的原则是要让80%左右的url保留80%以上的信息长度。当然,这个数字也是可以调的超参数。

    • 【步骤二】:转换url字母到对应字典数字。
      主要通过Python中printable中对于常见所有字符的收录作为字典。将对应url字母转换为printable中字母对应的index。这一步将字符类型的向量转换为one-hot编码的数字格式。

    • 【步骤三】:补齐url长度。
      这一步的主要目的是为了将左右的向量长度整理成一致的长度,适合作为神经网络的输入。利用Keras中的API,代码如下:

      from keras.preprocessing import sequence
      url_features = sequence.pad_sequences(url_int_tokens, maxlen=max_len)
      


  • 神经网络构建
    • 【第一层】:Embeding Layer
      主要采用word2vec的embeding层,对one-hot编码转换为有意义的向量形式。这一层融合在整个训练神经网络中,方便后续梯度训练更新的时候,不断更新embeding层的参数。同时,因为url单字母的embeding具有场景和切分的特殊性,不采用对其他迁移embending参数refine的方式。

       emb = Embedding(input_dim=max_vocab_len, output_dim=emb_dim, input_length=max_len, W_regularizer=regularizers.l2(weight_reg))(main_input)
      
    • 【第二层】:1D-CNN Layer
      添加一层一维的CNN,采用Inception结构。主要目的是更丰富的抽取不同深度上下文相关的特征。

      conv1 = Convolution1D(kernel_size=conv_kernel_size, filters=conv_filters, border_mode='same')(emb)
      conv2 = Convolution1D(kernel_size=conv_kernel_size + 3, filters=conv_filters, border_mode='same')(emb)
      conv3 = Convolution1D(kernel_size=conv_kernel_size - 2, filters=conv_filters, border_mode='same')(emb)
      conv = Add()([conv1, conv2, conv3])
      
    • 【第三层】:1D-MaxPooling Layer
      添加一层最大池化层,对url字符数据进行降维处理,最后得到对url的压缩张量表示。这一步的目的,一是为了压缩上下文信息;二是为了降低网络参数的数量,防止在数据量不大的情况下,神经网络过于复杂导致的过拟合。

      conv = MaxPooling1D(pool_size=max_pool_size)(conv)
      
    • 【第四层】:LSTM Layer
      采用浅层LSTM,对url的时序信息进行整理和提取。

      lstm = LSTM(lstm_output_size)(conv)
      
    • 【第五层】:Fully-Connected Layer
      在最后增加一层全连接层,来判断是否是异常url的概率。

      output = Dense(1, activation='sigmoid', name='output')(lstm)
      
    • 【附加】
      在层与层之间可以增加一些dropout和batchnormalization的层,来对模型进行正则化,以保持模型良好的泛化能力。

  • 效果分析

从最后的效果来看,对于url字符组织有意义和分层明确url的识别效果较好。但是对于存在随机生成字符模式(如图片名)的url的区分识别效果有待提高,或者通过文本挖掘对这类随机字符模式的url的挖掘精确达到了理论上的极限,有待后续分析。

附:
GitHub项目地址:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,290评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,107评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,872评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,415评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,453评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,784评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,927评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,691评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,137评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,472评论 2 326
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,622评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,289评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,887评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,316评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,490评论 2 348

推荐阅读更多精彩内容