NLPTM-01: Pendahuluan Natural Language Processing dan Text Preprocessing


Natural Language Processing and Text Mining (NLPTM)
Bagian dari Combined Module: Unstructured Data Analysis (UDA)

“We are moving slowly into an era where big data is the starting point, not the end.” — Pearl Zhu

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.

"Side-by-Side": Ilustrasi bagaimana menggunakan code dan video dalam pembelajaran di tau-data. untuk mendapatkan pengalaman belajar yang baik.

Video Lesson NLPTM-01



nlptm-01

Natural Language Processing and Text Mining (NLPTM)
Unstructured Data Analysis (UDA)*

01 - Pendahuluan Natural Language Processing dan Text Processing

(C) Taufik Sutanto - 2020
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".

[Image Source]: https://www.turn-on.de/primetime/topliste/zehn-film-gadgets-die-wir-uns-im-wahren-leben-wuenschen-4413

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.

Modul-modul yang digunakan di Lesson ini

Silahkan install melalui terminal jika dijalankan secara lokal (PC/Laptop)

Perhatian: Anda harus menjalankan setiap cell secara berurutan dari paling atas, tanpa terlewat satu cell-pun.

In [ ]:
"""
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

In [1]:
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
In [2]:
# Sehingga kita bisa melakukan preprocessing dasar dengan string manipulation seperti berikut:
S = 'cob762a '
print(dir(S))
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
In [3]:
X = '84 '
X.isdigit() 
Out[3]:
False
In [4]:
help(X.isdigit)
Help on built-in function isdigit:

isdigit(...) method of builtins.str instance
    S.isdigit() -> bool
    
    Return True if all characters in S are digits
    and there is at least one character in S, False otherwise.

In [5]:
# String adalah Tuple, sehingga
S1 = 'apa '
S2 = 'kabar'
S1+S2
Out[5]:
'apa kabar'
In [6]:
# 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:])
7 character pertama:  NLP dan
7 character terakhir:   Python
In [7]:
# Tapi hati-hati karena ia tuple maka:
try:
    S[5] = 'o'
except:
    print('Error, tuple tidak bisa dirubah nilainya (inplace)')
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, ...
In [8]:
# 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))
['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', "you're"]
['yang', 'untuk', 'pada', 'ke', 'para', 'namun', 'menurut', 'antara', 'dia', 'dua']
['&gt', '&lt', '&nbsp', 'a', 'able', 'about', 'above', 'abst', 'accordance', 'according']
['ada', 'adalah', 'adanya', 'adapun', 'agak', 'agaknya', 'agar', 'akan', 'akankah', 'akhir']
126 758 179 2659

Diskusi: Apakah sebaiknya kita menggunakan daftar stopwords bawaan modul atau custom milik kita sendiri?

In [9]:
# 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.
In [10]:
%%timeit
99000000 in L
131 ms ± 28.3 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
In [11]:
%%timeit
99000000 in S
50.2 ns ± 16.5 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
In [12]:
# 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)
In [13]:
'adalah' in id_stop
Out[13]:
True
In [14]:
# 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).
nlp tau-data indonesia belajar nlp tau-data indonesia

Menangani Slang atau Singkatan di Data Teks

In [15]:
# 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
janjuragan ragu juragan, langsung saja di order pajanjuragannya.
In [16]:
D = {'yg':'yang', 'gan':'juragan'}
D['yg']
Out[16]:
'yang'
In [17]:
# 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
Out[17]:
WordList(['jangan', 'ragu', 'gan', 'langsung', 'saja', 'di', 'order', 'pajangan', 'yg', 'diatas'])
In [18]:
for i,t in enumerate(T):
    if t in slangs.keys():
        T[i] = slangs[t]
print(' '.join(T))
jangan ragu juragan langsung saja di order pajangan yang diatas
In [19]:
# 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] 
Out[19]:
['& : dan\n',
 '1pun : satupun\n',
 '7an : tujuan\n',
 '@ : di\n',
 'Dr : dokter\n']
In [20]:
slangS = [t.strip('\n').strip() for t in slangS]
print(slangS[:5])
['& : dan', '1pun : satupun', '7an : tujuan', '@ : di', 'Dr : dokter']
In [21]:
A = 'luv:love'
B = A.split(':')
B
Out[21]:
['luv', 'love']
In [22]:
A ='  apa  '
A.strip()
Out[22]:
'apa'
In [23]:
# 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'])
[['&', 'dan'], ['1pun', 'satupun'], ['7an', 'tujuan']]
tujuan
In [24]:
# 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))
I love untuk sayang serius juragan tapi tidak tahu kalau besok

Tujuan Spellcheck:

  1. Cleaning Data
  2. Word suggestions
  3. OCR/hand writing (Image) recognition
  4. Speech Recognition
  5. Machine Translation
In [25]:
# aplikasi spell check di textBlob
from textblob import Word

w = Word('industri')
w.spellcheck()
Out[25]:
[('industry', 1.0)]
In [26]:
w = Word('jang4n')
w.spellcheck()
# Kendalanya kalau Bahasa Indonesia ==> perlu pendekatan umum
Out[26]:
[('jang4n', 0.0)]

Norvig Spell Checker: Menggunakan Aturan Probabilitas Bayes 

image source: https://norvig.com/spell-correct.html

In [27]:
import taudataNlpTm as tau
# http://norvig.com/spell-correct.html
# corpus = 'data/kata_dasar.txt'
print(tau.correction('jang4n'))
jangan
In [28]:
kombinasi = tau.edits1('benul')
print(list(kombinasi))
['boenul', 'bequl', 'beyul', 'cbenul', 'benoul', 'benulh', 'benux', 'benulg', 'benuz', 'beuul', 'bentul', 'benur', 'benwl', 'bgenul', 'oenul', 'benful', 'benugl', 'benuil', 'benql', 'benuls', 'venul', 'betul', 'bensul', 'benurl', 'benull', 'besnul', 'bsenul', 'bexnul', 'benunl', 'bebnul', 'benulr', 'benuml', 'bqenul', 'bvenul', 'bwenul', 'berul', 'bendul', 'enul', 'benjul', 'benuvl', 'benpl', 'benmul', 'xenul', 'fenul', 'bnnul', 'bjenul', 'beinul', 'beznul', 'benulb', 'bneul', 'lbenul', 'bznul', 'besul', 'benuhl', 'beynul', 'benuzl', 'bdenul', 'bmnul', 'benuk', 'benlu', 'yenul', 'beoul', 'bunul', 'benuql', 'benkul', 'bhnul', 'benule', 'blenul', 'begul', 'benyl', 'btenul', 'benqul', 'benul', 'bbnul', 'benulu', 'becnul', 'benfl', 'bejnul', 'beknul', 'benulf', 'benut', 'benusl', 'beeul', 'benuc', 'buenul', 'bennul', 'benyul', 'benukl', 'benvl', 'benua', 'benkl', 'benol', 'benbl', 'bepul', 'benal', 'zbenul', 'behnul', 'benulj', 'zenul', 'bengul', 'bpenul', 'benuln', 'benun', 'benup', 'qenul', 'bepnul', 'bezul', 'bzenul', 'fbenul', 'benpul', 'dbenul', 'bekul', 'ebenul', 'bengl', 'benud', 'gbenul', 'benue', 'beonul', 'jenul', 'binul', 'brenul', 'benuq', 'befnul', 'benl', 'beiul', 'benulc', 'vbenul', 'bpnul', 'bexul', 'benxul', 'benum', 'benulx', 'benufl', 'benula', 'benhl', 'benzl', 'benuo', 'benulk', 'eenul', 'blnul', 'bencl', 'ebnul', 'bxnul', 'benuu', 'pbenul', 'benuxl', 'ybenul', 'benutl', 'bsnul', 'bevul', 'denul', 'benil', 'xbenul', 'bemnul', 'benupl', 'beunl', 'beful', 'bedul', 'benuyl', 'bebul', 'benulo', 'bwnul', 'bentl', 'brnul', 'benuh', 'benrl', 'bbenul', 'jbenul', 'qbenul', 'bxenul', 'benlul', 'bienul', 'benulp', 'benulz', 'bejul', 'bfenul', 'bencul', 'begnul', 'bqnul', 'bhenul', 'beunul', 'benu', 'wbenul', 'benujl', 'benulq', 'betnul', 'bcnul', 'sbenul', 'benml', 'becul', 'kenul', 'tenul', 'beanul', 'beniul', 'mbenul', 'obenul', 'benel', 'benuy', 'benug', 'benbul', 'benhul', 'bensl', 'bgnul', 'senul', 'bmenul', 'benual', 'hbenul', 'bknul', 'benuf', 'benuli', 'benjl', 'bjnul', 'ibenul', 'benuld', 'bfnul', 'bonul', 'bednul', 'beul', 'nbenul', 'benulm', 'bendl', 'bvnul', 'bernul', 'benrul', 'bynul', 'menul', 'benwul', 'henul', 'rbenul', 'ubenul', 'benulv', 'benuol', 'wenul', 'beenul', 'aenul', 'benvul', 'benubl', 'genul', 'behul', 'bcenul', 'banul', 'lenul', 'cenul', 'bennl', 'belnul', 'benulw', 'benuw', 'bewnul', 'benaul', 'nenul', 'tbenul', 'benucl', 'benus', 'benuwl', 'benult', 'belul', 'byenul', 'uenul', 'benxl', 'renul', 'benub', 'kbenul', 'bnul', 'baenul', 'beqnul', 'bevnul', 'benudl', 'bewul', 'ienul', 'benuul', 'benuv', 'bkenul', 'beneul', 'bemul', 'benzul', 'benll', 'penul', 'benui', 'abenul', 'benuel', 'benuly', 'btnul', 'bnenul', 'bdnul', 'beaul', 'benuj']
In [29]:
tau.known(tau.edits1('benul'))
Out[29]:
{'bendul', 'bengul', 'bentul', 'benua', 'benum', 'benur', 'betul'}
In [30]:
print(tau.known(tau.edits2('benul')))
{'bencol', 'menur', 'kenur', 'bentul', 'benur', 'bekil', 'senuh', 'bunuh', 'tenuk', 'belu', 'betul', 'butul', 'endul', 'gecul', 'senuk', 'ketul', 'benalu', 'sentul', 'bel', 'bentus', 'bendul', 'beni', 'banal', 'kenal', 'bincul', 'renjul', 'kedul', 'mentul', 'menu', 'benah', 'beril', 'beol', 'bandul', 'belut', 'bakul', 'gemul', 'venus', 'bentur', 'fenol', 'renal', 'sepul', 'benua', 'senur', 'benjol', 'beru', 'bengul', 'sekul', 'bacul', 'benda', 'jengul', 'berui', 'bajul', 'bekuk', 'beku', 'bentulu', 'beduk', 'besuk', 'benum', 'serul', 'benak', 'banua', 'benzil', 'bendu', 'benta', 'buhul', 'bentol', 'bebal', 'jendul', 'bekel', 'bedel', 'bunut', 'kepul', 'bubul', 'benguk', 'benar', 'bedal', 'belel', 'benam', 'bonus', 'belur', 'bendi', 'kerul', 'benzol', 'genus', 'bengu', 'tenun', 'benci', 'bendel', 'beluk', 'besut', 'bintul', 'bekal', 'berus', 'belum', 'penuh', 'bedol', 'belus', 'bengal', 'senil', 'beruk', 'bebel', 'benjut', 'kebul', 'begal', 'begu', 'bentuk', 'besel', 'bende', 'becus', 'becuk', 'bisul', 'senu', 'binal', 'jenuh', 'kemul', 'bagul', 'venal', 'bendo', 'benih', 'bena', 'beguk', 'bedil'}
In [31]:
print(tau.WORDS.most_common(10))
[('tidak', 135), ('tak', 83), ('hati', 37), ('dengan', 32), ('salah', 29), ('tanpa', 28), ('baik', 26), ('rasa', 24), ('penuh', 23), ('lebih', 22)]
In [32]:
#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())
id
jw
In [33]:
# 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
I want to understand NLP in English. I love you
أريد أن أفهم البرمجة اللغوية العصبية باللغة الإنجليزية. أحبك
NLPを英語で理解したい。わたしは、あなたを愛しています
In [34]:
# 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'))
I just wanted to say ... I'm hungry ... hungry bro

Beberapa Reguler Expression yang sering digunakan di NLP/Text Mining

  1. Menghilangkan/extract email
  2. Menghilangkan/extract nomer telephone
  3. Menghilangkan/extract URL di string.
  4. Alpha Numeric filtering
  5. Wild Card Search
  6. Cleaning hashTags di Media Sosial
In [35]:
# 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) )
Contact kami di  ,  , atau  
email yang ditemukan:  ['admin@nlpindonesia.org', 'nlp.indonesia@sci.yahoo.co.id', 'nlp_nusantara@internet.net']
In [36]:
# 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))
Contact kami di *** atau *** atau *** atau *** atau +***88
Nomer telephone yang ditemukan:  ['021-7634562', '021-763-4562', '021 763 4562', '0822959020', '6281992586']
In [37]:
# 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))
Contact kami di *** atau +***
082295203040
+6282295203040
In [38]:
# 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))
website reguler expression & my site :   &  
URL yang ditemukan:  ['https://www.regular-expressions.info/', 'https://tau-data.id']
In [39]:
# 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)
Hi   Mukidi  apa kabar   sapa_Pagi 
In [40]:
# alternative 2:
print(''.join([t for t in txt if t.isalnum() or t==' ' or t=='_']))
# ada perbedaan?
Hi Mukidi apa kabar sapa_Pagi

In [41]:
# 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
Tags = ['AndaiSajaIaTahu', 'ApaYangAkuRasah', 'AlayersTweet', 'd2d']
In [42]:
pisahtags = re.compile(r'[A-Z][^A-Z]*')

for tags in re.findall(getHashtags, tweet):
    print(re.findall(pisahtags, tags))
['Andai', 'Saja', 'Ia', 'Tahu']
['Apa', 'Yang', 'Aku', 'Rasah']
['Alayers', 'Tweet']
[]
In [43]:
# 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)
oh IoT, Andai Saja Ia Tahu Apa Yang Aku Rasah... Alayers Tweet
In [44]:
s = 'The25XYZ3abc'
re.split('(\d+)',s)
Out[44]:
['The', '25', 'XYZ', '3', 'abc']

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.
In [45]:
# 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
dear god, please help me
In [46]:
# 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'))
Satu < Tiga & © adalah simbol Copyright

Latihan 1:

Diberikan tweet berikut:
tweet =  "The #OctopiPower is &gt; Sharks! &amp; 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:

  1. Buat satu atau lebih fungsi untuk memudahkan, misal fungsi fixTags dan cleanText.
  2. fix kata "they're" dan awsm dengan teknik sederhana dictionary fix.
  3. Hati-hati terhadap urutan aksi di preprocessing karena akan mengakibatkan hasil yang berbeda.
    Kelak di segmen berikutnya urutan aksi ini akan disebut sebagai "Pipelining".
  4. Code solusi latihan ini dengan dasar fikiran bahwa solusinya nanti akan bisa digunakan untuk sembarang preprocessing.
  5. At this point, jangan hawatirkan dulu scalability/efisiensi.
In [47]:
%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
Wall time: 0 ns

Latihan 2:

Bagaimana caranya memfilter kata-kata (token) yang terdiri dari huruf dan angka (misal b29nf, _24x_, dsb)?

In [48]:
%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.
Wall time: 0 ns

End of Module NLPTM-01


Referensi lain untuk belajar Text Mining di Python

  1. Farzindar, A., & Inkpen, D. (2017). Natural language processing for social media. Synthesis Lectures on Human Language Technologies, 10(2), 1-195.
  2. Kao, A., & Poteet, S. R. (Eds.). (2007). Natural language processing and text mining. Springer Science & Business Media.
  3. Perkins, J. (2014). Python 3 Text Processing with NLTK 3 Cookbook. Packt Publishing Ltd.
  4. http://www.nltk.org/book/

Tidak ada komentar:

Posting Komentar

Relevant & Respectful Comments Only.