Apa itu Named Entity Recognition (NER)?
Named Entity Recognition (NER) adalah proses otomatis untuk mendeteksi dan mengklasifikasi entitas penting dalam sebuah teks, misal: nama orang, organisasi, lokasi, malware, APT group, dsb.
Dalam konteks Cyber Threat Intelligence (CTI), NER sangat vital untuk mengekstrak threat actor, malware, attack technique, campaign, dan entitas relevan lain dari laporan insiden siber (PDF).
Kenapa NER Penting dalam Pipeline CTI?
- Mendeteksi pola ancaman: Dengan NER, kita bisa mengidentifikasi siapa melakukan apa, dengan teknik/malware apa, dalam operasi kapan.
- Membangun knowledge graph: Node utama dalam KG berasal dari entitas hasil NER.
- Otomatisasi: NER mempercepat ekstraksi data dari ratusan dokumen tanpa kerja manual.
Pendekatan NER dalam Kode Pipeline Ini
Pada pipeline CTI ini, NER dilakukan dengan dua pendekatan kombinasi:
-
spaCy NER Model (en_core_web_sm):
- Menggunakan model NLP bahasa Inggris yang sudah dilatih untuk entitas umum (PERSON, ORG, GPE, dsb).
- Mudah digunakan, cukup panggil
self.nlp = spacy.load('en_core_web_sm')
.
-
Custom Regex Patterns:
- Untuk entitas yang spesifik CTI dan tidak umum di spaCy, dipakai regex custom.
- Contoh:
THREAT_ACTOR
dengan polaAPT\d+
, atauMALWARE
sepertiEmotet
,WannaCry
, dsb. - Regex bisa diubah sesuai kebutuhan (diatur di
CTIConfig
).
Kedua hasil NER ini digabungkan dan dideduplicate agar hasil lebih akurat dan relevan untuk CTI.
Bagian Kode: CTIEntityRecognizer
Berikut inti kode class NER pipeline:
class CTIEntityRecognizer:
def __init__(self, config):
self.config = config
self.nlp = spacy.load(config.ner_model)
self.custom_patterns = self._compile_custom_patterns()
def _compile_custom_patterns(self):
patterns = {}
for ent_type, pattern in self.config.custom_entity_types.items():
patterns[ent_type] = re.compile(pattern, re.IGNORECASE)
return patterns
def extract_entities(self, text, doc_metadata=None):
doc = self.nlp(text)
entities = []
# 1. spaCy entities
for ent in doc.ents:
if ent.text.strip():
entities.append({
"text": ent.text.strip(),
"type": ent.label_,
"source": "spaCy",
"doc_metadata": doc_metadata
})
# 2. Custom regex entities
for ent_type, pattern in self.custom_patterns.items():
for match in pattern.finditer(text):
entities.append({
"text": match.group(),
"type": ent_type,
"source": "custom",
"doc_metadata": doc_metadata
})
return self._deduplicate_entities(entities)
def _deduplicate_entities(self, entities):
unique_ents = {}
for ent in entities:
key = (ent['text'].lower(), ent['type'])
if key not in unique_ents:
unique_ents[key] = ent
elif len(ent['text']) > len(unique_ents[key]['text']):
unique_ents[key] = ent
return list(unique_ents.values())
Penjelasan Setiap Bagian
1. Inisialisasi Model spaCy dan Regex Custom
Saat objek dibuat:
- Memuat model spaCy (
en_core_web_sm
) untuk NER dasar. - Compile regex dari config untuk entitas CTI custom (bisa APT, malware, dsb).
2. Ekstraksi Entitas: Dua Sumber
- spaCy NER: Jalankan spaCy pada teks → dapat entity umum.
- Regex custom: Jalankan regex pada teks → hasil entity spesifik CTI.
Semua entity disimpan dengan tipe, sumber, dan metadata dokumen asal.
3. Deduplication Entity
Banyak entity bisa tumpang tindih (misal, "APT28" & "APT28 group" di satu segmen).
Kode melakukan deduplikasi:
- Jika ada entity sama (teks+tipe), simpan yang lebih panjang.
- Hasil akhirnya adalah daftar entity unik untuk setiap segmen/dokumen.
Customisasi NER untuk Kebutuhan CTI
Bagian custom_entity_types
pada CTIConfig
sangat powerful:
self.custom_entity_types = {
"THREAT_ACTOR": r"(APT\d+|APT-\w+|Group\d+|Wicked Rose|NCPH)",
"MALWARE": r"\b(Emotet|TrickBot|Conti|WannaCry|Aurora)\b",
"TECHNIQUE": r"(T\d{4}\.\d{3}|MITRE \w+)",
"CAMPAIGN": r"(Operation \w+|GhostNet)"
}
Tips:
- Tambahkan/ubah regex sesuai kebutuhan dataset CTI kamu (misal: nama malware baru, teknik MITRE, dsb).
- Bisa ditambah entity lain: IP, hash, CVE, dsb.
Output Entity
Hasil dari NER ini adalah list dict berisi:
-
text
(teks entity) -
type
(tipe entity: THREAT_ACTOR, MALWARE, dsb) -
source
(spaCy/custom) -
doc_metadata
(dokumen asal) - (ditambah context & hash di pipeline utama)
Integrasi ke Pipeline
- Hasil NER dipakai untuk node di knowledge graph.
- Setiap entity bisa dikaitkan ke segmen teks dan dokumen asal, sehingga memudahkan tracing.
- Entity dengan frekuensi rendah bisa di-filter, sehingga graph lebih ringkas dan informatif.
Tips Praktis & Best Practice
- Selalu review hasil NER pada sampel dokumen. Tambah regex jika ada entity penting yang belum tertangkap.
- Update regex untuk malware/aktor/teknik terbaru secara berkala.
- Untuk penelitian dalam bahasa selain Inggris, ganti model spaCy ke model bahasa yang sesuai.
- Entity hasil NER bisa digunakan untuk labeling dataset machine learning lanjutan!
Contoh Output
text | type | source | doc_metadata.Title | context snippet |
---|---|---|---|---|
"APT28" | THREAT_ACTOR | custom | GhostNet Report | ...APT28 conducted... |
"WannaCry" | MALWARE | custom | Ransomware 2018 | ...by WannaCry... |
"Conti" | MALWARE | custom | Conti Analysis | ...Conti group... |
"Microsoft" | ORG | spaCy | Threat Actors | ...target Microsoft... |
Penutup
NER adalah jantung pipeline knowledge graph CTI.
Kombinasi spaCy & regex custom memberikan fleksibilitas tinggi untuk riset atau produksi.
Dengan pipeline ini, ekstraksi entity dari ratusan PDF jadi jauh lebih cepat, konsisten, dan mudah dieksplorasi dalam bentuk graph.
Ingin hasil NER makin akurat? Eksperimenlah dengan regex dan tambahkan entity baru sesuai kebutuhanmu! 🚀
Top comments (0)