DEV Community

Cover image for Named Entity Recognition (NER) dalam Pipeline Knowledge Graph CTI Multi-PDF: Konsep, Kode, & Tips Praktis
ahmadasroni38
ahmadasroni38

Posted on

Named Entity Recognition (NER) dalam Pipeline Knowledge Graph CTI Multi-PDF: Konsep, Kode, & Tips Praktis

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:

  1. 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').
  2. Custom Regex Patterns:

    • Untuk entitas yang spesifik CTI dan tidak umum di spaCy, dipakai regex custom.
    • Contoh: THREAT_ACTOR dengan pola APT\d+, atau MALWARE seperti Emotet, 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())
Enter fullscreen mode Exit fullscreen mode

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)"
}
Enter fullscreen mode Exit fullscreen mode

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)