spaCy Named Entity Recognition

spaCy Named entity recognition akan mengklasifikasikan token dengan kategori seperti person names, organization, locations, medical codes, time expression, quantities, monetary values dan lainnya.

import spacy
nlp = spacy.load('en_core_web_sm')

def show_ents(doc):
    if doc.ents:
        for ent in doc.ents:
            print(ent.text+' - '+ent.label_+' - '+str(spacy.explain(ent.label_)))
    else:
        print('No named entities found.')


doc = nlp(u'May I go to Washington, DC next May to see the Washington Monument?')

show_ents(doc)
Washington, DC - GPE - Countries, cities, states
next May - DATE - Absolute or relative dates or periods
the Washington Monument - ORG - Companies, agencies, institutions, etc.

Pembahasan Code

Pertama kita load library spacy dan model language yang digunakan.

import spacy
nlp = spacy.load('en_core_web_sm')

Lalu, kita buat fungsi untuk menampilkan isi entitas. Jika doc object memiliki entitas, maka akan ditampilkan, bila tidak maka akan ditampilkan ‘no entities found.’

def show_ents(doc):
    if doc.ents:
        for ent in doc.ents:
            print(ent.text+' - '+ent.label_+' - '+str(spacy.explain(ent.label_)))
    else:
        print('No entities found.')

Dari hasil output diatas, dapat dilihat spaCy cukup smart dapat membedakan may pada kata pertama dengan next may sebagai date.

spaCy juga mengenali Washington, DC sebagai satu kesatuan, dan mengenali sebagai states.

Serta memahami the Wahsington Monument adalah suatu entitas, dalam hal ini dimasukan dalam kategori ORG.

Attribute Doc.ents

  • ent.text : text asli dari entitas, contoh: Washington, DC
  • ent.label : nilai hash dari entitas.
  • ent.label_ : string deskripsi dari entitas.
  • ent.start : token spans start index pada doc.
  • ent.end : token span end index pada doc.

Menambahkan NER kedalam Span

Umumnya kita mentraining spaCy untuk membuat library named entities dengan menggunakan sample text.

Namun ada kalanya dalam praktek, kita hanya perlu menambahkan 1 entitas baru dan tidak ingin melakukan training. Kita dapat menambahkan secara manual.

doc = nlp(u'Tesla to build a U.K. factory for $6 million')

show_ents(doc)
U.K. - GPE - Countries, cities, states
$6 million - MONEY - Monetary values, including unit

Dari code diatas, spacy tidak mengenali Tesla sebagai entitas perusahaan. Kita dapat tambahkan Tesla kedalam library NER.

from spacy.tokens import Span

# ambil hash value dari ORG entity label
ORG = doc.vocab.strings[u'ORG']  

# buat entitas baru dengan mengambil dari doc.
# 0 adalah start index, 1 adalah end index.
new_ent = Span(doc, 0, 1, label=ORG)

# tambahkan entitas kedalam doc object
doc.ents = list(doc.ents) + [new_ent]

show_ents(doc)
Tesla - ORG - Companies, agencies, institutions, etc.
U.K. - GPE - Countries, cities, states
$6 million - MONEY - Monetary values, including unit

Sharing is caring: