SpaCy merupakan library natural language processing (NLP) yang sangat powerful, terutama untuk pemrosesan bahasa Inggris. Tidak hanya fungsi-fungsi dasar seperti tokenizer, library ini juga mendukung fungsi NLP yang bergantung pada solusi berbasis machine learning seperti part-of-speech (POS) tagging, Named entity recognition (NER), dan dependency parsing.
Buat yang belum tahu, mulai dari spacy versi 2.0.0, sebagian fungsi NLP bahasa Indonesia sudah didukung oleh SpaCy. Kredit setinggi-tingginya perlu kita berikan kepada Mas Jim Geovedi atas pull request-nya ke SpaCy. Tidak semua fungsi NLP ada di bahasa Indonesia, karena tidak seperti bahasa Inggris, fungsi-fungsi yang bergantung pada model machine learning yang disebutkan diatas belum didukung secara langsung. Lalu apa saja fungsi NLP yang bisa dapat dari SpaCy? Yuk kita cari tahu.
Sebelum kita mulai, tentu kita harus meng-install SpaCy terlebih dahulu
pip install spacy>2.0.0
Setelah itu kita mulai dengan import module SpaCy
import spacy
lalu kita load bahasa Indonesia
nlp = spacy.blank('id')
Perhatikan perbedaan dengan cara me-load bahasa Inggris yang diperlihatkan di tutorial.
Di bahasa Indonesia tidak tersedia pre-trained model untuk NER, POS, dll, sehingga kita aktivasi dengan spacy.blank
, bukan spacy.load
# ini akan gagal
spacy.load('id')
Setelah kita load, berikut paparan singkat fungsi-fungsi yang bisa kita dapatkan dari SpaCy.
Tokenizer¶
Walau tanpa pre-trained model, kita akan tetap mendapatkan banyak fitur SpaCy.
Fitur pertama yaitu tokenizer. Caranya kita load satu kalimat ke dalam spacy Doc
.
Doc
sendiri merupakan iterable
dimana setiap elemennya yaitu kelas Token
. Secara otomatis tokenisasi dilakukan ketika kita menginstansiasi kelas Doc
dengan dokumen/kalimat yang kita inginkan.
s = 'Galaxy Note 8, flagship terbaru dari Samsung, bisa ditebus dengan harga 11 juta rupiah (cashback 1 juta).'
doc = nlp(s)
print(type(doc))
print(type(doc[0]))
for i, token in enumerate(doc):
print(f'token-{i}', token)
Dari contoh diatas kita lihat proses tokenisasi berhasil. Namun sayangnya sentence tokenization (segmentation) untuk bahasa Indonesia belum didukung, layaknya bahasa Inggris.
par = (
'Seiring perkembangan, kebutuhan kini semakin mahal saja harganya. '
'Lalu apa yang bisa kita lakukan? '
'Alih-alih mengeluh sepanjang hari dan menyalahkan banyak orang, kini Anda harus memulai perubahan pada kehidupan Anda.'
)
print(par)
doc_par = nlp(par)
for sentence in doc_par.sents:
print(sentence)
# bahasa Inggris sudah didukung oleh sentence tokenizer
nlp_en = spacy.load('en')
par_en = (
'After an uneventful first half, Romelu Lukaku gave United the lead on 55 minutes with a close-range volley.'
'Sanchez was then fouled by Huddersfield defender Michael Hefele to win a penalty and the Chilean, a January signing from Arsenal, stepped up to take the spot-kick.'
'The forward saw his low shot saved by Jonas Lossl, but made no mistake with the rebound to double United\'s lead on his home debut.'
)
doc_en = nlp_en(par_en)
for sent in doc_en.sents:
print(sent)
Stop Words¶
SpaCy juga mencakup daftar stop words untuk bahasa Indonesia. Daftar tersebut bisa diakses melalui
from spacy.lang.id.stop_words import STOP_WORDS
# STOP WORDS is a set
# convert to list
print(list(STOP_WORDS)[:10])
setiap Token
di dalam SpaCy mempunyai attribute is_stop
untuk mengecek apakah token tsb merupakan stop word
doc = nlp('saya menyukai kemewahan')
for token in doc:
print(token, token.is_stop)
Atribut Linguistik¶
is_stop
merupakan satu dari banyak atribut linguistik dari Token
yang didukung SpaCy.
token = doc[0]
attributes = [attr for attr in dir(token) if not attr.startswith('_')]
for attr in attributes:
print(attr)
Ortografi¶
Salah satu atribut yang berguna yaitu attribut-atribut yang terkait dengan ortografi token seperti is_upper
, is_lower
, is_digit
, is_title
, is_punct
.
Sesuai namanya, attribut tersebut akan mengecek apakah token tersebut ditulis dengan huruf kecil, huruf besar, mengandung digit, mengandung tanda baca, dll.
doc = nlp('HP Samsung Galaxy Note 8 bisa ditebus dengan harga 11 juta rupiah (cashback 1jt).')
str_template = '{:>15} {:>10} {:>10} {:>10} {:>10} {:>10}'
print(str_template.format('token', 'is_lower', 'is_title', 'is_upper', 'is_digit', 'is_punct'))
for token in doc:
print(str_template.format(str(token),
str(token.is_lower),
str(token.is_title),
str(token.is_upper),
str(token.is_digit),
str(token.is_punct)))
Lemma¶
SpaCy token juga mengandung atribut lemma
, yaitu bentuk lemma dari sebuah kata. Ini menarik, karena sepengatahuan saya, ini pertama kali saya melihat library lematisasi dalam bahasa Indonesia. Bentuk lemma di SpaCy didapatkan dengan cara manual, layaknya melihat sebuah kamus. Terdapat satu dictionary besar di spacy.lang.id.LOOKUP
, dimana key merupakan kata dan value adalah bentuk lemmanya.
from spacy.lang.id import LOOKUP
import random
lemma_as_list = list(LOOKUP.items())
samples = random.choices(lemma_as_list, k=20)
for k, v in samples:
print(f'{k}: {v}')
kalau dilihat, dictionary tersebut mengandung kata-kata formal bahasa Indonesia. Karena sistemnya adalah kamus, maka untuk kata yang tidak ada, attribut lemma dari token
tersebut merupakan kata aslinya.
doc = nlp('tertidur tidur tercyduk')
for token in doc:
ori = token.text
lemma = token.lemma_ # token.lemma is integer index
print(ori, lemma)
POS, NER, Dependency Tree¶
Atribut-attribut seperti POS, NER, dependency tree, dan embedded vector membutuhkan model machine learning, sedangkan kita menggunakan spacy.blank
, bukan spacy.load
, maka attribut tersebut tidak tersedia.
missing_attrs = ['pos_', 'tag_', 'dep_', 'prob', 'cluster', 'vector']
doc = nlp('selamat malam semuanya')
for token in doc:
print(token.text, token.pos_, token.tag_, token.dep_, token.ent_iob_)
print(token.prob, token.cluster, token.vector)
Word Shape¶
Word shape, juga tersedia sebagai attribut. Fungsi ini sangat berguna untuk mengurangi jumlah vocabulary anda.
doc = nlp('10 Mei 2018 - 15 Juni 2018')
for token in doc:
print(f'{token.text} {token.shape_:>5}')
Penutup¶
Tulisan diatas menggambarkan secara singkat fitur-fitur yang dapat anda gunakan untuk membantu pekerjaan NLP bahasa Indonesia menggunakan SpaCy. Tentunya tulisan ini tidak bisa mengulas semua fitur yang dimiliki library SpaCy. Pembaca disarankan untuk coba mengeksplorasi SpaCy lebih jauh. Banyak fitur-fitur yang ditulis diatas yang disediakan juga oleh library lain seperti NLTK, namun beberapa fungsi menurut saya cukup unik seperti lemma. Sekian!