Python untuk Pemrosesan Teks Bahasa Indonesia
Peb Ruswono Aryanhttp://about.me/peb
Meetup komunitas pengguna pythonKampus ITB, 28 Januari 2012
Bahasa dan Media : Tulisan
Image source:http://i717.photobucket.com/albums/ww172/AmandaNichelle/Person.png
http://www.school-clipart.com/school_clipart_images/happy_person_in_silhouette_a_woman_clapping_0515-0911-2801-0927_SMU.jpg
Teksgambar
Optical Character Recognition, Handwriting Recognition
Bahasa dan Media : Lisan
Image source:http://i717.photobucket.com/albums/ww172/AmandaNichelle/Person.png
http://www.school-clipart.com/school_clipart_images/happy_person_in_silhouette_a_woman_clapping_0515-0911-2801-0927_SMU.jpg
Teks
Suara
Natural Language Processing (text),Automatic Speech Recognition,Text-to-Speech
Aplikasi Dialog
Pencarian ( bebas konteks ) Antarmuka kueri basisdata Antarmuka kueri umum (mis. Wolfram, Siri)
Tanya-Jawab ( ada konteks pembicaraan ) Chatbot (ELIZA, @begobet)
Transformasi Penterjemahan Peringkasan
Klasifikasi Kategorisasi/Pelabelan Dokumen Analisis Sentimen
Aplikasi : Penerjemahan Otomatis
Aplikasi : Tanya Jawab
Ragam Tugas Pemrosesan Bahasa Pemrosesan Morfologi
Mencari kata dasar (stemming/lematisasi) Identifikasi
Menentukan batas kalimat Klasifikasi kata (Part-of-Speech Tagging) Mencari peranan kata dalam kalimat (Parsing,
Semantic Role Labeling) Ekstraksi Informasi (Orang, Organisasi, Lokasi,
Jabatan, Kejadian, Waktu, Hubungan) ~ Named Entity Recognition
Teknik
Heuristik (Kaidah) Statistik
Template/Pattern Matching
Cepat (umumnya relatif)
sulit dikembangkan
Machine Learning (lebih) Lambat (asumsi) semakin
banyak data semakin baik
Teknologi (python) NLTK (Natural Language Toolkit)
http://www.nltk.org Whoosh (Text Indexing/Search)
http://pypi.python.org/pypi/Whoosh/ https://bitbucket.org/mchaput/whoosh/ (repo)
Topia.Termextract (term/keyword extraction) http://pypi.python.org/pypi/topia.termextract/ https://github.com/turian/topia.termextract (repo)
Pebahasa http://github.com/pebbie/pebahasa (code repo) http://pebahasa.appspot.com (demo site)
NLTK
Natural Language Processing Toolkit
Deskripsi Koleksi Algoritma Pemrosesan Teks
Lematisasi, WordNet Pemisahan Kalimat POS Tag Pemotongan Frasa
Koleksi Dokumen Teks (Korpus) & Model Bahasa Berbagai bahasa
Referensi
Natural Language Processing with Python (S. Bird, O’Reilly 2009) http://www.nltk.org/book
(CC BY-NC-ND 3.0)
Peluang berkontribusi Model & Korpus Bahasa Indonesia Penerjemahan Buku ke Bahasa Indonesia
Whoosh
Fast, Pure-python Fulltext Search
Deskripsi
Indexing Pencarian
Input : Kumpulan dokumen
(unicode) Output :
Indeks untuk mempercepat pencarian
Komponen : Tokenisasi
(pemotongan) Struktur data indeks
terbalik
Input : Kueri pencarian
(unicode) Indeks Dokumen
Output : Daftar dokumen yang
relevan Komponen :
Pencocokan kata/segmen
Pengurutan
Kode : importfrom whoosh.index import create_in, open_dir
from whoosh.fields import *
from whoosh.qparser import QueryParser
Kode : Schemaschema = Schema( title=TEXT(stored=True), cat=TEXT(stored=True), path=TEXT(stored=True), rank=NUMERIC(stored=True, type=float), content=TEXT)
Parameter stored=True akan membuatField tersebut ditampilkan dalam hasilPencarian (result set)
Kode : Indexing_ix = None
if not os.path.exists('indexdir'):
os.mkdir('indexdir')
_ix = create_in('indexdir', schema)
w = _ix.writer()
for root, dirnames, filenames in os.walk('data'):
for filename in fnmatch.filter(filenames, '*.txt'):
doc = os.path.join(root, filename)
f = open(doc)
text = re.sub("[\x80-\xff]", '', f.read())
w.add_document(title=unicode(filename[:-4]), content=unicode(text, 'utf8'), cat=unicode('artikel'), path=unicode(doc))
f.close()
w.commit()
else:
_ix = open_dir('indexdir')
Kode : Searchs = _ix.searcher()
while True:
print "?",
qs = raw_input().lower().strip()
if qs=="exit":
break
q = QueryParser('content', _ix.schema).parse(unicode(qs))
r = s.search(q)
for rr in r:
print rr['title'], rr['path']
s.close()
topia.termextract
Term extraction
Deskripsi Input : Teks (paragraf) Output : Daftar kata/frasa yang sering muncul Komponen :
POS Tagger Rule-based Filter Menggunakan zope.interface Baru tersedia untuk Bahasa Inggris
Kode
from topia.termextract import extractextractor = extract.TermExtractor()print sorted( extractor( text ) )
Pebahasa
Layanan web pemrosesan teks Bahasa Indonesia
Deskripsi Kumpulan Algoritma NLP
Pemenggalan suku kata deteksi batas kalimat Penentuan kelas kata (POS tag) berbasis kamus eksternal
& HMM (Hidden Markov Model) Pemotongan kalimat (Chunking) berdasarkan kapitalisasi *
Ekstraksi istilah (modifikasi dari topia.termextract) *
Peringkasan sederhana *
Ekstraksi informasi *
Dibungkus menjadi layanan web Google AppEngine Bottlepy
*) belum ditambahkan ke repo
Demo
screenshot
Pemenggalan suku kata
Aturan pemisahan digunakan untuk pengucapan(text to speech), bukan untuk stemming/mencariKata dasar
POS Tag
NN : Kata bendaNNP : Proper NounMD : ModalVBT : kata kerja transitif
Alfan Farizki Wicaksono, Ayu Purwarianti. HMM Based POS Tagger for Bahasa Indonesia. On Proceedings of 4th International MALINDO (Malay - Indonesian Language) Workshop. 2nd August 2010.
Term Extraction
Sumber artikel : Kompas.com
Peringkasan
Simple extractive summarization
Named Entity Recognition
keterangan 6 : posisi/jabatan1 : orang 2 : organisasi7 : predikat (untuk relasi antar entitas)8 : abaikan saja
Bottle - GAE
Tutorial tambahan
Bottle Web Microframework :
hanya menyediakan URL routing dan templating (built-in, mako, jinja2)
Hanya 1 file yang perlu diimpor (bottle.py) Berbasis decorator (@<nama decorator> sebelum
definisi fungsi) Session ditangani oleh WSGIMiddleWare (beaker,
gae-sessions) Mendukung berbagai jenis Web Server:
WSGIref, CGI, FCGI Paste, CherryPy, Twisted, Tornado, Bjoern, ... GAE (Google App Engine)
Kode : app.yamlhandlers:
- url: /.*
script: main.py
Kode : main.py
from bottle import *
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
import suku
...
util.run_wsgi_app(default_app())
Kode : main.py (URL routing)@route('/')
@view(‘word_entry’) # views/word_entry.tpl
def index():
return { ‘apptitle’:’pebahasa‘ }
@post('/penggal')
def penggal():
kata = request.forms.get('word', '').strip()
fon = suku.pecah(kata)
return { ‘asal’:kata, ‘hasil’: fon }
decorator
dict akan diubah menjadi JSON secara otomatis
Kode: views/word_entry.tpl
%rebase index apptitle=apptitle<form method="POST" id="newcat" action="/penggal"><label for="word">Kata</label><input type="text" name="word" id="word" size="30"/><input type="submit"/>
</form>
rebase akan menggunakan template lain (index.tpl) sebagai pembungkus
variabel apptitle bisa diakses di index.tpl
Kode: views/index.tpl<!DOCTYPE html>
<html>
<head>
<title>{{apptitle}}</title>
</head>
<body>
<div id="content">
%include
</div>
</body>
</html>
Template yang memanggil rebase akan Diselipkan di sini
Menampilkan isi variabel apptitle (html akan di-escape)
Terima kasih
Komentar , pertanyaan ?