<jupyter_start><jupyter_text>Natural Language Processing and Text Mining (NLPTM) Unstructured Data Analysis (UDA)*     02 - Dasar-Dasar Natural Language Processing (NLP)- Bagian ke-01      (C) <NAME> - 2020  tau-data Indonesia ~ https://tau-data.id  Outline Module NLPTM-02/UDA-02:* Tokenisasi* Stemming dan Lemma  Instalasi Modul:1. Google Colab ==> Jalankan Cell Berikutnya, stop reading the rest of this cell.2. Local (Windows/Linux)* Coba di terminal jalankan perintah **pip install --upgrade spacy*** **Kalau gagal**, unduh spacy dari sini (Asumsi menggunakan Python 3.6 - Recommended, Baca ADSP-01):  - Link: https://www.lfd.uci.edu/~gohlke/pythonlibs/spacy - thinc‑7.4.1‑cp36‑cp36m‑win_amd64.whl - srsly‑2.2.0‑cp36‑cp36m‑win_amd64.whl - preshed‑3.0.2‑cp36‑cp36m‑win_amd64.whl - murmurhash‑1.0.2‑cp36‑cp36m‑win_amd64.whl - cymem‑2.0.3‑cp36‑cp36m‑win_amd64.whl - spacy‑2.3.2‑cp36‑cp36m‑win_amd64.whldi terminal jalankan perintah "**pip install XYZ**" dimana **XYZ** adalah file-file diatas secara terurut. "Setelah" berhasil menginstall spacy, jalankan perintah berikut di terminal/command prompt. - python -m spacy download en - python -m spacy download xx - python -m spacy download en_core_web_smSetelah itu (masih di terminal/command prompt): - python (lalu enter) - import nltk  - nltk.download('popular')Semua langkah diatas hanya dilakukan 1x (karena sudah terinstall di komputer). Jika tidak suka repot, maka gunakan saja Google Colaboratory.<jupyter_code># Jalankan Cell ini "HANYA" jika anda menggunakan Google Colab
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

!pip install spacy python-crfsuite unidecode textblob sastrawi
!python -m spacy download en
!python -m spacy download xx
!python -m spacy download en_core_web_sm

nltk.download('popular')<jupyter_output><empty_output><jupyter_text>TokenisasiTokenisasi adalah pemisahan kata, simbol, frase, dan entitas penting lainnya (yang disebut sebagai token) dari sebuah teks untuk kemudian di analisa lebih lanjut. Token dalam NLP sering dimaknai dengan &quot;sebuah kata&quot;, walau tokenisasi juga bisa dilakukan ke kalimat, paragraf, atau entitas penting lainnya (misal suatu pola string DNA di Bioinformatika).Mengapa perlu tokenisasi?	Langkah penting dalam preprocessing, menghindari kompleksitas mengolah langsung pada string asal.	Menghindari masalah (semantic) saat pemrosesan model-model natural language.	Suatu tahapan sistematis dalam merubah unstructured (text) data ke bentuk terstruktur yang lebih mudah di olah.[Image Source]: https://www.softwareadvice.com/resources/what-is-text-analytics/ Tokenisasi dengan modul NLTKKelebihan:	Well established dengan dukungan bahasa yang beragam	Salah satu modul NLP dengan fungsi terlengkap, termasuk WordNet	Free dan mendapat banyak dukungan akademis.Kekurangan:	&quot;Tidak support&quot;&nbsp;bahasa Indonesia	Murni Python: relatif lebih lambathttps://www.nltk.org/<jupyter_code>import nltk

T = "Hello, Mr. Man. He smiled!! This, i.e. that, is it."
Word_Tokens = nltk.word_tokenize(T)
print(Word_Tokens) # tokenisasi kata
# Bandingkan jika menggunakan fungsi split di Python, apakah bedanya? 
print(T.split())
# Apakah kesimpulan yang bisa kita tarik?
# Split() ==> Bukan Tokenisasi!.
Sentence_Tokens = nltk.sent_tokenize(T)
print(Sentence_Tokens) # Tokenisasi kalimat
# Perhatikan hasilnya, ada berapa kalimat yang di deteksi? setuju?<jupyter_output>['Hello, Mr. Man.', 'He smiled!!', 'This, i.e.', 'that, is it.']<jupyter_text>Trigger Diskusi Forum:	Apakah tanda baca seperti &quot;?&quot; atau &quot;!&quot; akan memisahkan kalimat?	Apakah tanda &quot;carriage return&quot;/enter/ganti baris memisahkan kalimat?	Apakah &quot;;&quot; memisahkan kalimat?	Apakah tanda dash &quot;-&quot; memisahkan kata? Dalam bahasa Indonesia/Inggris?Tips: Perhatikan bentuk struktur data &quot;output&quot; dari tokenisasi NLTK.Catatan: pindah baris di Python string bisa dilakukan dengan menggunakan symbol &quot;\n&quot;Contoh:  Tokenisasi dengan modul SpacyKelebihan:	Di claim lebih cepat (C-based)	License termasuk untuk komersil	Dukungan bahasa yang lebih banyak dari NLTK (termasuk bahasa Indonesia*)Kekurangan:	Fungsi yang lebih terbatas (dibandingkan NLTK).	Karena berbasis compiler, sehingga instalasi cukup menantang.https://spacy.io/<jupyter_code># Contoh tokenisasi menggunakan Spacy
from spacy.lang.en import English
nlp_en = English()

T = "Hello, <NAME>. He smiled!! This, i.e. that, is it."
nlp = nlp_en(T)
for token in nlp:
    print(token.text, end =', ')
nlp_en.add_pipe(nlp_en.create_pipe('sentencizer')) # New in latest Spacy

nlp = nlp_en(T)
for kalimat in nlp.sents:
    print(kalimat)
# Hati-hati! ... token bukan string di Spacy, karena C-based, ia bekerja di byte bukan unicode.
token = nlp[0]
print(token)
type(token)
#token=='Hello'<jupyter_output>Hello<jupyter_text>Trigger Diskusi Forum:	Apakah hasil tokenisasi Spacy = NLTK? Mengapa?	Lakukan latihan seperti yang dilakukan sebelumnya dengan modul NLTK, apakah hasilnya sama dengan Spacy?Catatan: Contoh sederhana ini menekankan perbedaan ilmu linguistik dan computational linguistic.  Tokenisasi dengan  TextBlobKelebihan:	Sederhana &amp; mudah untuk digunakan/pelajari.	Textblob objects punya behaviour/properties yang sama dengan string di Python.	TextBlob dibangun dari kombinasi modul NLTK dan (Clips) PatternKekurangan:	Tidak secepat Spacy dan NLTK	Language Model terbatas: English, German, French*Blob : Binary large Object<jupyter_code># Tokenizing di TextBlob
from textblob import TextBlob

T = "Hello, <NAME>. He smiled!! This, i.e. that, is it."
print(TextBlob(T).words)
kalimatS = TextBlob(T).sentences
print([str(kalimat) for kalimat in kalimatS])<jupyter_output>['Hello, Mr. Man.', 'He smiled!!', 'This, i.e.', 'that, is it.']<jupyter_text>Trigger Diskusi Forum:	Ada yang berbeda dari hasilnya?&nbsp;Apakah lebih baik seperti ini?Tips: TextBlob biasa digunakan untuk prototyping pada data yang tidak terlalu besar.Catatan: Hati-hati tipe data Blob tidak biasa (objek).<jupyter_code># Saat melakukan coding di Python, selalu perhatikan "tipe data" yang dihasilkan oleh modul.
A = TextBlob(T).sentences
B = TextBlob(T).words
print(A[0], type(A[0]))
print(B[0], type(B[0]))
# Apakah bedanya dengan tipe data str biasa di python?
# Di Spacy ini tidak berlaku
B[0]=='Hello'
# "properties" Blob word
print(dir(C))
# "properties" string di Python
print(dir(D))<jupyter_output>['__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']<jupyter_text>Tokenisasi tidak hanya language dependent, tapi juga environment dependentTokenization sebenarnya tidak sesederhana memisahkan berdasarkan spasi dan removing symbol. Sebagai contoh dalam bahasa Jepang/Cina/Arab suatu kata bisa terdiri dari beberapa karakter.[Image Source]<jupyter_code># Contoh Tokenizer untuk twitter
from nltk.tokenize import TweetTokenizer

Tokenizer = TweetTokenizer(strip_handles=True, reduce_len=True)
tweet = "@Kirana_Sutanto I am so happpppppppy"
print(Tokenizer.tokenize(tweet))

# Masih salah (i.e. "happpy"), nanti kita akan perbaiki ini dengan "spell check"
# catatan: pada permasalahan "Sentiment analysis" kata yang ditulis panjang seperti diatas 
# bisa mengindikasikan sentiment yang kuat<jupyter_output>['I', 'am', 'so', 'happpy']<jupyter_text>Tokenisasi (NLP) Bahasa Indonesia:NLTK belum support Bahasa Indonesia, bahkan module NLP Python yang support bahasa Indonesia secara umum masih sangat langka. Beberapa resources yang dapat digunakan:	KirraLabs: Mix of NLP-TextMining resources	Sastrawi 1.0.1:&nbsp;untuk &quot;stemming&quot; &amp;&nbsp;stopwords&nbsp;bahasa Indonesia.	Daftar Kata Dasar Indonesia:&nbsp;Bisa di load sebagai dictionary di Python	Wiktionary: ProyekWiki bahasa Indonesia [termasuk Lexicon]	WordNet Bahasa Indonesia: Bisa di load&nbsp;sebagai dictionary (atau NLTK*) di Python.	Daftar Kata Baku-Tidak Baku: Bisa di load sebagai dictionary di Python.	Spacy: Cepat/efisien, MIT License, tapi language model Indonesia masih terbatas.	UdPipe: Online request &amp; restricted license (support berbagai bahasa -&nbsp;pemrograman).<jupyter_code># Contoh Tokenisasi dalam bahasa Indonesia dengan Spacy
from spacy.lang.id import Indonesian
nlp_id = Indonesian()  # Language Model

teks = 'Sore itu, Hamzah melihat kupu-kupu di taman. Ibu membeli oleh-oleh di pasar'
tokenS_id = nlp_id(teks)
#T = []
#for token in tokenS_id:
#    T.append(token)
print([t for t in tokenS_id])
# Jika menggunakan Language model English:
tokenS_en = nlp_en(teks)
print([token.text for token in tokenS_en])<jupyter_output>['Sore', 'itu', ',', 'Hamzah', 'melihat', 'kupu', '-', 'kupu', 'di', 'taman', '.', 'Ibu', 'membeli', 'oleh', '-', 'oleh', 'di', 'pasar']<jupyter_text>Word Case (Huruf BESAR/kecil):	Untuk menganalisa makna (semantic) dari suatu (frase) kata dan mencari informasi dalam proses textmining, seringnya (*) kita tidak membutuhkan informasi huruf besar/kecil dari kata&nbsp;tersebut.	Text case normaliation dapat dilakukan pada string secara efisien tanpa melalui tokenisasi (mengapa?).	Namun, bergantung pada analisa teks yang akan digunakan pengguna harus berhati-hati dengan urutan proses (pipelining) dalam preprocessing. Mengapa dan apa contohnya?(*) Coba temukan minimal 2 pengecualian dimana&nbsp; huruf kapital/kecil (case) mempengaruhi makna/pemrosesan teks.<jupyter_code># Ignore case (huruf besar/kecil)
T = "Hi there!, I am a student. Nice to meet you :)"
print(T.lower())
print(T.upper())
# Perintah ini sangat efisien karena hanya merubah satu bit di setiap (awal) bytes dari setiap karakter
# Sehingga tetap efisien jika ingin dilakukan sebelum tokenisasi<jupyter_output>hi there!, i am a student. nice to meet you :)
HI THERE!, I AM A STUDENT. NICE TO MEET YOU :)<jupyter_text>Morphological-Linguistic Normalization: Stemming &amp; Lemmatization(Canonical Representation)  Stemming dan Lemma		Stemmer&nbsp;akan menghasilkan sebuah bentuk kata yang disepakati oleh suatu sistem tanpa mengindahkan konteks kalimat. Syaratnya beberapa kata dengan makna serupa hanya perlu dipetakan secara konsisten ke sebuah kata baku.&nbsp;Banyak digunakan di IR &amp;&nbsp;komputasinya relatif sedikit. Biasanya dilakukan dengan menghilangkan imbuhan (suffix/prefix).			lemmatisation akan menghasilkan kata baku (dictionary word) dan bergantung konteks.			Lemma &amp; stemming bisa jadi sama-sama menghasilkan suatu akar kata (root word). Misal : Melompat ==&gt; lompat	 Mengapa melakukan Stemming &amp; Lemmatisasi?	Sering digunakan di IR (Information Retrieval) agar ketika seseorang mencari kata tertentu, maka seluruh kata yang terkait juga diikutsertakan.	Misal:&nbsp;organize,&nbsp;organizes, and&nbsp;organizing&nbsp;&nbsp;dan&nbsp;democracy,&nbsp;democratic, and&nbsp;democratization.	Di Text Mining Stemming dan Lemmatisasi akan mengurangi dimensi (mengurangi variasi morphologi), yang terkadang akan meningkatkan akurasi.	Tapi di IR efeknya malah berkebalikan: meningkatkan recall, tapi menurunkan akurasi&nbsp;[Link]. Contoh: kata&nbsp;operate, operating, operates, operation, operative, operatives, dan operational&nbsp;jika di stem menjadi operate, maka ketika seseorang mencari &quot;operating system&quot;, maka entry seperti&nbsp;operational and research dan&nbsp;operative and dentistry&nbsp;akan muncul sebagai entry dengan relevansi yang cukup tinggi. Stemming tidak perlu &quot;benar&quot;, hanya perlu konsisten. Sehingga memiliki berbagai variansi, (sebagian) contoh di NLTK:<jupyter_code># Contoh Stemming di NLTK
from nltk.stem.lancaster import LancasterStemmer
from nltk.stem.porter import PorterStemmer
from nltk.stem.snowball import SnowballStemmer

T = 'presumably I would like to MultiPly my provision, saying tHat without crYing'
print('Sentence: ',T)

StemmerS = [LancasterStemmer, PorterStemmer, SnowballStemmer] 
Names = ['Lancaster', 'Porter', 'SnowBall']

for stemmer_name,stem in zip(Names,StemmerS):
    if stemmer_name == 'SnowBall':
        st = stem('english')
    else:
        st = stem()
        
    print(stemmer_name,': ',' '.join(st.stem(t) for t in T.split()))
# perhatikan, kita tidak melakukan case normalization (lowercase) 
# Hasil stemming bisa tidak bermakna
# Contoh Lemmatizer di NLTK
from nltk.stem import WordNetLemmatizer

lemmatizer = WordNetLemmatizer()
T = "apples and Oranges are similar. boots and hippos aren't, don't you think?"
print('Sentence: ', T)
print('Lemmatize: ',' '.join(lemmatizer.lemmatize(t) for t in T.split()))
# Lemma case sensitive. Dengan kata lain string harus diubah ke dalam bentuk huruf kecil (lower case)
# Lemmatizer menggunakan informasi pos. "pos" (part-of-speech) akan dibahas di segmen berikutnya
print(lemmatizer.lemmatize("better", pos="a")) # adjective
print(lemmatizer.lemmatize("better", pos="v")) # verb
# TextBlob Stemming & Lemmatizer
from textblob import Word
# Stemming
print(Word('running').stem()) # menggunakan NLTK Porter stemmer

# Lemmatizer
print(Word('went').lemmatize('v'))

# default Noun, plural akan menjadi singular dari akar katanya
# Juga case sensitive
# Spacy Lemmatizer English
import spacy
nlp = spacy.load("en_core_web_sm")

E = "I am sure apples and oranges are similar"
doc = nlp(E)

for token in doc:
    print(token.text, token.lemma_)
# Perhatikan huruf besar/kecil<jupyter_output>I -PRON-
am be
sure sure
apples apple
and and
oranges orange
are be
similar similar<jupyter_text>Spacy "tidak" (bukan belum) support Stemming:[Image Source]<jupyter_code># Lemmatizer dengan Sastrawi
from Sastrawi.Stemmer.StemmerFactory import StemmerFactory
stemmer = StemmerFactory().create_stemmer()

I = "perayaan itu Berbarengan dengan saat kita bepergian ke Makassar"
print(stemmer.stem(I))
print(stemmer.stem("Perayaan Bepergian Menyuarakan"))
# Ada beberapa hal yang berbeda antara Sastrawi dan modul-modul diatas.
# Apa sajakah?<jupyter_output>raya itu bareng dengan saat kita pergi ke makassar
raya pergi suara
StarcoderdataJupyterStructuredCleanDedup