基于ngram模型挖掘证书颁发者名称与域名关联关系的方法咨询
证书颁发者与域名实体关联挖掘实现思路(Python)
1. 数据预处理
- 用
pandas的read_csv()方法加载CSV文件,仅保留Issuer Name、Domain Name两列即可,过滤掉两列中为空的脏数据 - 对字段做标准化清洗:
Issuer Name统一去掉多余空格、无关特殊符号,全部转为小写,避免同一颁发者因格式差异被识别为不同主体Domain Name统一去掉前后缀冗余字符、转为小写,可根据需求拆分出二级主域名、顶级域等单独作为备用字段
2. 核心关联挖掘实现
2.1 基础统计关联(初步梳理全局关系)
- 统计每个颁发者的签发域名量:调用
pandas的groupby('Issuer Name')['Domain Name'].nunique()即可快速得到所有颁发者的签发规模,识别头部签发机构 - 统计特定域名特征对应的高频颁发者:比如筛选所有
.org后缀的域名,统计对应的颁发者分布,快速定位特定场景下的主流签发主体
2.2 结合Ngram的隐藏关联挖掘
你已掌握的文本Ngram能力可以直接适配两类实体的特征匹配场景:
- 分别对
Issuer Name、Domain Name提取2-gram、3-gram特征,将文本实体转为可计算的特征向量 - 可做两类关联分析:
- 特征共现分析:用Apriori关联规则算法计算「某类Issuer Ngram特征」和「某类域名Ngram特征」的共现支持度、置信度,比如可得到规则:当Issuer包含"free"相关3-gram特征时,76%对应的域名字符串包含随机乱序特征,可用于钓鱼证书识别等安全场景
- 相似度匹配:计算未知Issuer和已知恶意Issuer的Ngram特征余弦相似度,匹配到对应关联的恶意域名集合
3. 最简实现代码示例
import pandas as pd from nltk.util import ngrams from collections import defaultdict # 加载清洗数据 df = pd.read_csv("cert_data.csv", usecols=["Issuer Name", "Domain Name"]) df = df.dropna(subset=["Issuer Name", "Domain Name"]).apply(lambda x: x.str.lower().str.strip()) # Ngram特征提取函数 def extract_ngram(text: str, n: int = 3) -> set: return set(ngrams(text, n)) # 统计各颁发者对应的域名特征分布 issuer_feature_map = defaultdict(list) for _, row in df.iterrows(): issuer = row["Issuer Name"] domain_feat = extract_ngram(row["Domain Name"]) issuer_feature_map[issuer].append(domain_feat) # 示例:输出Let's Encrypt R3对应域名的Top10高频3-gram特征 le_feats = [feat for feat_list in issuer_feature_map["let's encrypt r3"] for feat in feat_list] print(pd.Series(le_feats).value_counts().head(10))
内容的提问来源于stack exchange,提问作者Naveed Jamil
相关产品推荐
相关产品推荐

