Natural Language Processing and Text Mining (NLPTM)
Bagian dari Combined Module: Unstructured Data Analysis (UDA)
Prasyarat:
- ADSP-01
- Statistika Dasar (Probabilitas Bersyarat)
Code Lesson NLPTM-01
Code dari lesson ini dapat di akses di Link berikut (wajib login ke Google/Gmail): Code NLPTM-01
Di link tersebut anda langsung bisa merubah code dan menjalankannya. Keterangan lebih lanjut di Video NLPTM-01.
Sangat disarankan untuk membuka code dan video berdampingan/"side-by-side" untuk mendapatkan pengalaman belajar yang baik. Silahkan modifikasi (coba-coba) hal lain, selain yang ditunjukkan di video untuk mendapatkan pengalaman belajar yang lebih mendalam. Tentu saja juga silahkan akses berbagai referensi lain untuk memperkaya pengetahuan lalu diskusikan di forum yang telah disediakan.
Video Lesson NLPTM-01
Natural Language Processing and Text Mining (NLPTM)
Unstructured Data Analysis (UDA)*
Unstructured Data Analysis (UDA)*
01 - Pendahuluan Natural Language Processing dan Text Processing ¶
(C) Taufik Sutanto - 2020
tau-data Indonesia ~ https://tau-data.id
tau-data Indonesia ~ https://tau-data.id
Outline Lesson NLPTM-01 :¶
- Pendahuluan
- Review String di Python
- Filtering (stopwords)
- Replace slang/typos/singkatan
- Spell Check
- Machine translation
- Pengenalan Reguler expression
- Encodings
Natural Language Processing (NLP) - Pemrosesan Bahasa Alami (PBA):¶
"Sebuah cabang ilmu (AI/Computational Linguistik) yang mempelajari bagaimana bahasa (alami) manusia (terucap/tertulis) dapat dipahami dengan baik oleh komputer dan komputer dapat merespon dengan cara yang serupa ke manusia".
Aplikasi Umum NLP:¶
- Speech Recognition dan Classification
- Machine Translation (Misal https://translate.google.com/ )
- Information Retrieval (IR) (misal www.google.com, bing, elasticsearch, etc.)
- Man-Machine Interface (misal Chatbot, Siri, cortana, atau Alexa)
- Sentiment Analysis
Apakah Perbedaan antara NLP dan Text Mining (TM)?¶
TM (terkadang disebut Text Analytics) adalah sebuah pemrosesan teks (biasanya dalam skala besar) untuk menghasilkan (generate) informasi atau insights. Untuk menghasilkan informasi TM menggunakan beberapa metode, termasuk NLP. TM mengolah teks secara eksplisit, sementara NLP mencoba mencari makna latent (tersembunyi) lewat aturan bahasa (e.g. grammar/idioms/Semantics).
Contoh aplikasi TM : Social Media Analytics (SMA), Insights from customer's review, Sentiment Analysis, Topic Modelling, dsb.
"""
Installing Modules & getting the necessary files for "Google Colab"
Jika dijalankan di komputer lokal (PC/Laptop) silahkan unduh secara manual dan
lakukan instalasi module di terminal/command prompt
"""
import nltk
!mkdir data
!wget -P data/ https://raw.githubusercontent.com/taudata-indonesia/eLearning/master/data/slang.txt
!wget -P data/ https://raw.githubusercontent.com/taudata-indonesia/eLearning/master/data/stopwords_id.txt
!wget -P data/ https://raw.githubusercontent.com/taudata-indonesia/eLearning/master/data/stopwords_en.txt
!wget -P data/ https://raw.githubusercontent.com/taudata-indonesia/eLearning/master/data/corpus_sederhana.txt
!wget -P / https://raw.githubusercontent.com/taudata-indonesia/eLearning/master/lib/taudataNlpTm.py
!pip install unidecode textblob sastrawi
nltk.download('popular')
Review Tipe Variabel di Python¶
a = 2.3 # Floating Point (tidak sama dengan bilangan Real)
b = 3.0 # Integer
c = True # T/F Boolean
d = 'python' # String
e = [a,b,c,d] # List
f = (a,b,c,d) # Tuple
g = set([a,b,c,d]) # Set
h = {'a':1, 'b':2, 7:'abc'} # Dictionary : keys, values, items
# Sehingga kita bisa melakukan preprocessing dasar dengan string manipulation seperti berikut:
S = 'cob762a '
print(dir(S))
X = '84 '
X.isdigit()
help(X.isdigit)
# String adalah Tuple, sehingga
S1 = 'apa '
S2 = 'kabar'
S1+S2
# String adalah Tuple sehingga bisa di akses seperti List
S = 'NLP dan TextMining di Python'
print('7 character pertama: ', S[:7])
print('7 character terakhir: ', S[-7:])
# Tapi hati-hati karena ia tuple maka:
try:
S[5] = 'o'
except:
print('Error, tuple tidak bisa dirubah nilainya (inplace)')
Text Level Normalization: StopWords¶
Di Text Mining kata-kata yang sering muncul (dan jarang sekali muncul) memiliki sedikit sekali informasi (signifikansi) terhadap model (machine learning) yang digunakan. Hal ini di karenakan kata-kata tersebut muncul di semua kategori (di permasalahan klasifikasi) atau di semua cluster (di permasalahan pengelompokan/clustering). Kata-kata yang sering muncul ini biasa disebut "StopWords". Stopwords berbeda-beda bergantung dari Bahasa dan Environment (aplikasi)-nya.
Contoh:
- Stopwords bahasa Inggris: am, is, are, do, the, of, etc.
- Stopwords bahasa Indonesia: adalah, dengan, yang, di, ke, dsb
- Stopwords twitter: RT, ...
# Loading Stopwords: Ada beberapa cara
from nltk.corpus import stopwords
from Sastrawi.StopWordRemover.StopWordRemoverFactory import StopWordRemoverFactory
factory = StopWordRemoverFactory()
NLTK_StopWords = stopwords.words('english')
Sastrawi_StopWords_id = factory.get_stop_words()
df=open('data/stopwords_en.txt',"r",encoding="utf-8", errors='replace')
en_stop = df.readlines()
df.close()
en_stop = [t.strip().lower() for t in en_stop]
df=open('data/stopwords_id.txt',"r",encoding="utf-8", errors='replace')
id_stop = df.readlines()
df.close()
id_stop = [t.strip().lower() for t in id_stop]
N = 10
print(NLTK_StopWords[:N])
print(Sastrawi_StopWords_id[:N])
print(en_stop[:N])
print(id_stop[:N])
print(len(Sastrawi_StopWords_id), len(id_stop), len(NLTK_StopWords), len(en_stop))
Diskusi: Apakah sebaiknya kita menggunakan daftar stopwords bawaan modul atau custom milik kita sendiri?¶
# Tipe variabel memiliki aplikasi optimal yang berbeda-beda, misal
L = list(range(10**7))
S = set(range(10**7)) # selain unik dan tidak memiliki keterurutan, set memiliki fungsi lain.
%%timeit
99000000 in L
%%timeit
99000000 in S
# Tips: selalu rubah list stopwords ke bentuk set, karena di Python jauh lebih cepat untuk cek existence di set ketimbang list
NLTK_StopWords = set(NLTK_StopWords)
Sastrawi_StopWords_id = set(Sastrawi_StopWords_id)
en_stop = set(en_stop)
id_stop = set(id_stop)
'adalah' in id_stop
# Cara menggunakan stopwords
from textblob import TextBlob
T = "I am doing NLP at tau-data Indonesia,... \
adapun saya anu sedang belajar NLP di tau-data Indonesia"
T = T.lower()
id_stop.add('anu')
Tokens = TextBlob(T).words # Tokenisasi
T2 = [t for t in Tokens if t not in id_stop] # Sastrawi_StopWords_id Personal_StopWords_en Personal_StopWords_id
T2 = [t for t in T2 if t not in en_stop] # Sastrawi_StopWords_id Personal_StopWords_en Personal_StopWords_id
print(' '.join(T2))
# Catatan: Selalu lakukan Stopword filtering setelah tokenisasi (dan normalisasi).
Menangani Slang atau Singkatan di Data Teks¶
# Sebuah contoh sederhana
T = 'jangan ragu gan, langsung saja di order pajangannya.'
# Misal kita hendak mengganti setiap singkatan (slang) dengan bentuk penuhnya.
# Dalam hal ini kita hendak mengganti 'gan' dengan 'juragan'
H = T.replace('gan','juragan')
print(H)
# Kita tidak bisa melakukan ini
D = {'yg':'yang', 'gan':'juragan'}
D['yg']
# dengan tokenisasi
slangs = {'gan':'juragan', 'yg':'yang', 'dgn':'dengan'} #dictionary sederhana berisi daftar singkatan dan kepanjangannya
T = 'jangan ragu gan, langsung saja di order pajangan yg diatas.'
T = TextBlob(T).words
T
for i,t in enumerate(T):
if t in slangs.keys():
T[i] = slangs[t]
print(' '.join(T))
# Loading Slang dan Singkatan dari File
# Contoh memuat word fix melalui import file.
df=open('data/slang.txt',"r",encoding="utf-8", errors='replace')
slangS = df.readlines(); df.close()
slangS[:5]
slangS = [t.strip('\n').strip() for t in slangS]
print(slangS[:5])
A = 'luv:love'
B = A.split(':')
B
A =' apa '
A.strip()
# pisahkan berdasarkan ':'
slangS = [t.split(":") for t in slangS]
slangS = [[k.strip(), v.strip()] for k,v in slangS]
print(slangS[:3])
slangS = {k:v for k,v in slangS}
print(slangS['7an'])
# Test it!
tweet = 'I luv u say. serius gan!, tapi ndak tau kalau sesok.'
T = TextBlob(tweet).words
for i,t in enumerate(T):
if t in slangS.keys():
T[i] = slangS[t]
print(' '.join(T))
Spell Check:¶
[image source: http://chasidisheshaigitz.blogspot.com/2006/05/ok.html]Tujuan Spellcheck:
- Cleaning Data
- Word suggestions
- OCR/hand writing (Image) recognition
- Speech Recognition
- Machine Translation
# aplikasi spell check di textBlob
from textblob import Word
w = Word('industri')
w.spellcheck()
w = Word('jang4n')
w.spellcheck()
# Kendalanya kalau Bahasa Indonesia ==> perlu pendekatan umum
Norvig Spell Checker: Menggunakan Aturan Probabilitas Bayes
image source: https://norvig.com/spell-correct.html
import taudataNlpTm as tau
# http://norvig.com/spell-correct.html
# corpus = 'data/kata_dasar.txt'
print(tau.correction('jang4n'))
kombinasi = tau.edits1('benul')
print(list(kombinasi))
tau.known(tau.edits1('benul'))
print(tau.known(tau.edits2('benul')))
print(tau.WORDS.most_common(10))
Machine Language Detection and Translation¶
image Sources:
#Language Detection (TextBlob)
from textblob import TextBlob
T = "Aku ingin mengerti NLP dalam bahasa Inggris"
U = "jarene iki boso jowo"
print(TextBlob(T).detect_language())
print(TextBlob(U).detect_language())
# Machine Translation (TextBlob)
# Butuh koneksi internet, limited calls. Error otherwise. Need "try" and "catch".
T = "Aku ingin mengerti NLP dalam bahasa Inggris. I love you"
print(TextBlob(T).translate(to='en'))
print(TextBlob(T).translate(to='ar-sa'))
print(TextBlob(T).translate(to='ja'))
# daftar kode bahasa : http://www.cardinalpath.com/resources/tools/google-analytics-language-codes/
# Perhatikan TextBlob secara automatis akan mendeteksi bahasa asal
# Kalau secara spesifik ingin translate dari suatu bahasa ke bahasa lain:
T = "Aku hanya ingin mengatakan ... saya lapar ... hungry bro"
print(TextBlob(T).translate(from_lang ='id', to='en'))
Beberapa Reguler Expression yang sering digunakan di NLP/Text Mining
- Menghilangkan/extract email
- Menghilangkan/extract nomer telephone
- Menghilangkan/extract URL di string.
- Alpha Numeric filtering
- Wild Card Search
- Cleaning hashTags di Media Sosial
# Extracting atau replacing eMail.
import re
emailPattern = re.compile(r'[\w._%+-]+@[\w\.-]+\.[a-zA-Z]{2,4}')
txt = 'Contact kami di admin@nlpindonesia.org, nlp.indonesia@sci.yahoo.co.id, atau nlp_nusantara@internet.net'
print( re.sub(emailPattern, ' ', txt) )# clean email
eMailS = re.findall( emailPattern, txt )
print( 'email yang ditemukan: ', str(eMailS) )
# Pola telephone : \d penanda angka di reguler Expression, \s spasi, dan "|" adalah "atau"
# "?" menyatakan pilihan (optional): colou?r sesuai dengan colour atau color.
phonePattern = re.compile(r'(\d{3}[-\.\s]??\d{3}[-\.\s]??\d{4}|\(\d{3}\)\s*\d{3}[-\.\s]??\d{4}|\d{3}[-\.\s]??\d{4})')
txt = 'Contact kami di 021-7634562 atau 021-763-4562 atau 021 763 4562 atau 0822959020 atau +628199258688'
print(re.sub(phonePattern,'***',txt))# clean phone
noTelp = re.findall(phonePattern,txt)
print('Nomer telephone yang ditemukan: ',str(noTelp))
# Pola telephone 2: untuk setiap angka 8-14 digits dipisahkan oleh "spasi", "," atau "."
phonePattern = re.compile(r'\b\d{8,14}\b')
txt = 'Contact kami di 082295203040 atau +6282295203040'
print(re.sub(phonePattern,'***',txt))# clean phone
noTelp = re.findall(phonePattern,txt)
for no in noTelp:
if no[0]!='0':
print('+' + no)
else:
print(no)
#print('Nomer telephone yang ditemukan: ',str(noTelp))
# Website URLS http(s) .... untuk ftp trivial
urlPattern = re.compile(r'http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+')
txt = 'website reguler expression & my site : https://www.regular-expressions.info/ & https://tau-data.id'
print(re.sub(urlPattern,' ',txt))# clean urls
URLs = re.findall(urlPattern,txt)# get URLs
print('URL yang ditemukan: ',str(URLs))
# cleaning non alpha-numeric
txt = 'Hi! @Mukidi, apa kabar? #sapa_Pagi.'
print(re.sub(r'[^\w]',' ',txt))
# atau jika ingin exclude titik dan koma
# re.sub(r'[^.,a-zA-Z0-9 \n\.]','',txt)
# alternative 2:
print(''.join([t for t in txt if t.isalnum() or t==' ' or t=='_']))
# ada perbedaan?
# Cleaning hashTags dalam posting media sosial
tweet = 'oh IoT, #AndaiSajaIaTahu #ApaYangAkuRasah... #AlayersTweet #d2d'
getHashtags = re.compile(r"#(\w+)")
print("Tags = {0}".format(re.findall(getHashtags, tweet)))
# temukan hanya tags ... perhatikan IoT bukan Tags walau ada huruf besar & kecil dalam satu kata
pisahtags = re.compile(r'[A-Z][^A-Z]*')
for tags in re.findall(getHashtags, tweet):
print(re.findall(pisahtags, tags))
# Mengganti hashtags dengan kata dasar pembentuknya
tweet = 'oh IoT, #AndaiSajaIaTahu #ApaYangAkuRasah... #AlayersTweet'
tagS = re.findall(getHashtags, tweet)
for tag in tagS:
proper_words = ' '.join(re.findall(pisahtags, tag))
tweet = tweet.replace('#'+tag,proper_words)
print(tweet)
s = 'The25XYZ3abc'
re.split('(\d+)',s)
Encoding-Decoding:¶
- Hal berikutnya yang perlu diperhatikan dalam memproses data teks adalah encoding-decoding.
- Contoh Encoding: ASCII, utf, latin, dsb.
- saya membahas lebih jauh tetang encoding disini:
https://tau-data.id/memahami-string-python/ - Berikut adalah sebuah contoh sederhana tantangan proses encoding-decoding ketika kita hendak memproses data yang berasal dari internet atau media sosial.
# kita bisa menggunakan modul unidecode untuk mendapatkan representasi ASCII terdekat
from unidecode import unidecode
T = "ḊḕḀṙ ₲ØĐ, p̾l̾e̾a̾s̾e ḧḕḶṖ ṁḕ"
print(unidecode(T).lower())
# Bahasa Indonesia dan Inggris secara umum mampu direpresentasikan dalam encoding ASCII:
# https://en.wikipedia.org/wiki/ASCII
# Kita juga bisa membersihkan posting media sosial/website dengan entitas html menggunakan fungsi "unescape" di modul "html"
from html import unescape
print(unescape('Satu < Tiga & © adalah simbol Copyright'))
Latihan 1:
Diberikan tweet berikut:
tweet = "The #OctopiPower is > Sharks! & they're awsm! So happy to see them here http://www.octopusVSshark.com !"
preprocess tweet diatas sehingga didapatkan tweet seperti ini (Gunakan sembarang modul yang mendukung):
tweet= "the octopus power is > shark ! & they are awesome ! so happy to see them here !"
Petunjuk/Hints:
- Buat satu atau lebih fungsi untuk memudahkan, misal fungsi fixTags dan cleanText.
- fix kata "they're" dan awsm dengan teknik sederhana dictionary fix.
- Hati-hati terhadap urutan aksi di preprocessing karena akan mengakibatkan hasil yang berbeda.
Kelak di segmen berikutnya urutan aksi ini akan disebut sebagai "Pipelining". - Code solusi latihan ini dengan dasar fikiran bahwa solusinya nanti akan bisa digunakan untuk sembarang preprocessing.
- At this point, jangan hawatirkan dulu scalability/efisiensi.
%time
# Coba jawaban Latihan [1] di cell ini:
# Salah satu contoh jawaban latihan ini ada di cell paling bawah.
# Namun coba untuk tidak melihat jawaban tersebut
Latihan 2:
Bagaimana caranya memfilter kata-kata (token) yang terdiri dari huruf dan angka (misal b29nf, _24x_, dsb)?
%time
# Coba jawaban Latihan [2] di cell ini:
# Salah satu contoh jawaban latihan ini ada di cell paling bawah.
# Namun coba untuk tidak melihat jawaban tersebut
T = 'pesawat b29 dan mig276 adalah kepunyaan fhg347x dan _24x_'
# Harapan jawaban T = 'pesawat dan adalah kepunyaan dan'
# Petunjuk: gunakan property "isalpha" pada variabel string di Python.
End of Module NLPTM-01
Referensi lain untuk belajar Text Mining di Python
- Farzindar, A., & Inkpen, D. (2017). Natural language processing for social media. Synthesis Lectures on Human Language Technologies, 10(2), 1-195.
- Kao, A., & Poteet, S. R. (Eds.). (2007). Natural language processing and text mining. Springer Science & Business Media.
- Perkins, J. (2014). Python 3 Text Processing with NLTK 3 Cookbook. Packt Publishing Ltd.
- http://www.nltk.org/book/
Tidak ada komentar:
Posting Komentar
Relevant & Respectful Comments Only.