Text Detection

Anggi Setyawan Riyadi
11 min readJul 26, 2023

--

Hallo teman teman, kali ini aku mau berbagi code nih. Jadi project yang saya buat ini berkaitan tentang text berita datasetnya. mungkin teman teman sudah tidak asing dengan NLP (Natural language processing). Dalam project ini akan mennggunakan python untuk mendeteksi teks dengan dataset teks yang sudah memiliki label atau kelasnya sebagai data latih.

Ok, let’s coding!!

Read Data From Kaggle

!pip install kaggle

Perintah !pip install kaggle adalah perintah yang digunakan untuk menginstal pustaka (library) Kaggle menggunakan pip, yang merupakan manajer paket standar untuk bahasa pemrograman Python.

from google.colab import files
files.upload()

Perintah from google.colab import files dan files.upload() adalah perintah yang digunakan untuk mengunggah file dari komputer lokal Anda ke lingkungan Google Colab. Google Colab adalah layanan cloud yang memungkinkan Anda untuk menjalankan kode Python di lingkungan Jupyter Notebook yang di-hosting oleh Google.

!mkdir -p ~/.kaggle
!cp kaggle.json ~/.kaggle/
!chmod 600 ~/.kaggle/kaggle.json
!kaggle datasets download -d ibamibrahim/indonesian-news-title

Perintah !kaggle datasets download -d ibamibrahim/indonesian-news-title adalah perintah shell yang digunakan untuk mengunduh dataset dengan nama "indonesian-news-title" dari platform Kaggle. Dataset ini merupakan dataset yang berisi judul-judul berita dalam bahasa Indonesia.

import zipfile
zip_ref = zipfile.ZipFile('/content/indonesian-news-title.zip', 'r')
zip_ref.extractall('files')
zip_ref.close()

Kode diatas adalah kode Python untuk mengekstrak (unzip) isi dari file indonesian-news-title.zip ke dalam direktori baru bernama files. Kode tersebut menggunakan pustaka zipfile yang merupakan pustaka bawaan Python untuk bekerja dengan file ZIP.

import pandas as pd
df = pd.read_csv('/content/files/indonesian-news-title.csv')
df

Kode diatas adalah kode Python untuk membaca file CSV bernama indonesian-news-title.csv yang telah diekstrak sebelumnya ke dalam direktori files. Kode tersebut menggunakan pustaka pandas yang merupakan pustaka populer untuk analisis data dan manipulasi data dalam bahasa pemrograman Python. Data tersebut akan di tampilkan dama bentuk dataframe sebagai berikut:

Data input

Explore and Preprocessing Data

# malihat topic dalam berita
print(df.category.unique())
#drop columns
data1 = data[['category','title']]
# mengganti nama kolom
data1.columns=['topic','title']
data1

Output data tersebut akan menjadi sebagai berikut:

Data setelah dibersihkan
#Melihat grafik data berdasarkan topic/label/kelas
counts = data1['topic'].value_counts()
counts.plot(kind='bar', legend=False, grid=True, figsize=(8, 5))
grafik perbandingan topic/label

Compute the bag-of-word vector for each topic

y = data1['topic']
X = data1['title']

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

Kode tersebut adalah pemanggilan fungsi train_test_split dari pustaka scikit-learn (sklearn) untuk membagi data menjadi data latih (train data) dan data uji (test data).

# creating the feature matrix
from sklearn.feature_extraction.text import CountVectorizer
matrix = CountVectorizer(max_features=5000)
X_train_tok = matrix.fit_transform(X_train).toarray()
X_train_tok

Kode diatas bertujuan untuk mengonversi teks dari kolom ‘title’ (judul berita) dalam dataset X_train menjadi representasi vektor menggunakan metode "CountVectorizer" dari pustaka scikit-learn (sklearn). Output Code tersebut sebagai berikut:

vectorized title
from sklearn.feature_extraction.text import CountVectorizer
matrix = CountVectorizer(max_features=5000)
X_test_tok = matrix.fit_transform(X_test).toarray()

Kode diatas bertujuan untuk mengonversi teks dari kolom ‘title’ (judul berita) dalam dataset X_test menjadi representasi vektor menggunakan metode "CountVectorizer" dari pustaka scikit-learn (sklearn).

Classify this text to the correct topic

import pandas as pd
import numpy as np

#for text pre-processing
import re, string
import nltk
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from nltk.stem import SnowballStemmer
from nltk.corpus import wordnet
from nltk.stem import WordNetLemmatizer
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
nltk.download('wordnet')

#for model-building
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report, f1_score, accuracy_score, confusion_matrix
from sklearn.metrics import roc_curve, auc, roc_auc_score

# bag of words
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction.text import CountVectorizer

#for word embedding
import gensim
from gensim.models import Word2Vec
# WORD-COUNT
data1['word_count'] = data1['title'].apply(lambda x: len(str(x).split()))
print(data1[data1['topic']=='finance']['word_count'].mean()) #Disaster tweets
print(data1[data1['topic']=='sport']['word_count'].mean()) #Non-Disaster tweets
print(data1[data1['topic']=='health']['word_count'].mean()) #Non-Disaster tweets

Kode tersebut merupakan implementasi dari fitur “word_count” (jumlah kata) dalam dataset data1 untuk topik-topik berita tertentu. Kode ini menggunakan operasi pada DataFrame dengan menggunakan pustaka pandas.

Mari kita jelaskan kode tersebut secara singkat:

  1. data1['word_count'] = data1['title'].apply(lambda x: len(str(x).split())): Baris ini menambahkan kolom baru 'word_count' ke dalam DataFrame data1. Kolom ini akan berisi jumlah kata dalam setiap judul berita (kolom 'title'). Fungsi apply() digunakan untuk menerapkan fungsi lambda yang menghitung jumlah kata dalam setiap judul berita.
  2. print(data1[data1['topic']=='finance']['word_count'].mean()): Baris ini mencetak rata-rata jumlah kata dalam judul berita dengan topik 'finance'. Pertama, data1[data1['topic']=='finance'] digunakan untuk memfilter baris-baris dalam DataFrame yang memiliki topik 'finance'. Kemudian, ['word_count'].mean() digunakan untuk menghitung rata-rata dari kolom 'word_count' dalam baris-baris yang dipilih, yaitu judul berita dengan topik 'finance'.
  3. print(data1[data1['topic']=='sport']['word_count'].mean()): Baris ini mencetak rata-rata jumlah kata dalam judul berita dengan topik 'sport'. Sama seperti sebelumnya, baris-baris dalam DataFrame yang memiliki topik 'sport' difilter, dan kemudian rata-rata dari kolom 'word_count' dalam baris-baris tersebut dihitung dan dicetak.
  4. print(data1[data1['topic']=='health']['word_count'].mean()): Baris ini mencetak rata-rata jumlah kata dalam judul berita dengan topik 'health'. Seperti sebelumnya, baris-baris dalam DataFrame yang memiliki topik 'health' difilter, dan kemudian rata-rata dari kolom 'word_count' dalam baris-baris tersebut dihitung dan dicetak.
# CHARACTER-COUNT
data1['char_count'] = data1['title'].apply(lambda x: len(str(x)))
print(data1[data1['topic']=="finance"]['char_count'].mean()) #Disaster tweets
print(data1[data1['topic']=='sport']['char_count'].mean()) #Non-Disaster tweets
print(data1[data1['topic']=='health']['char_count'].mean())

Kode tersebut merupakan implementasi fitur “char_count” (jumlah karakter) dalam dataset data1 untuk topik-topik berita tertentu. Seperti sebelumnya, kode ini menggunakan operasi pada DataFrame dengan menggunakan pustaka pandas.

Mari kita jelaskan kode tersebut secara singkat:

  1. data1['char_count'] = data1['title'].apply(lambda x: len(str(x))): Baris ini menambahkan kolom baru 'char_count' ke dalam DataFrame data1. Kolom ini akan berisi jumlah karakter dalam setiap judul berita (kolom 'title'). Fungsi apply() digunakan untuk menerapkan fungsi lambda yang menghitung jumlah karakter dalam setiap judul berita.
  2. print(data1[data1['topic']=="finance"]['char_count'].mean()): Baris ini mencetak rata-rata jumlah karakter dalam judul berita dengan topik 'finance'. Pertama, data1[data1['topic']=="finance"] digunakan untuk memfilter baris-baris dalam DataFrame yang memiliki topik 'finance'. Kemudian, ['char_count'].mean() digunakan untuk menghitung rata-rata dari kolom 'char_count' dalam baris-baris yang dipilih, yaitu judul berita dengan topik 'finance'.
  3. print(data1[data1['topic']=='sport']['char_count'].mean()): Baris ini mencetak rata-rata jumlah karakter dalam judul berita dengan topik 'sport'. Sama seperti sebelumnya, baris-baris dalam DataFrame yang memiliki topik 'sport' difilter, dan kemudian rata-rata dari kolom 'char_count' dalam baris-baris tersebut dihitung dan dicetak.
  4. print(data1[data1['topic']=='health']['char_count'].mean()): Baris ini mencetak rata-rata jumlah karakter dalam judul berita dengan topik 'health'. Seperti sebelumnya, baris-baris dalam DataFrame yang memiliki topik 'health' difilter, dan kemudian rata-rata dari kolom 'char_count' dalam baris-baris tersebut dihitung dan dicetak.

Dengan demikian, kode ini memungkinkan kita untuk melihat rata-rata jumlah karakter dalam judul berita untuk masing-masing topik ‘finance’, ‘sport’, dan ‘health’ dalam dataset data1. Hal ini dapat membantu kita untuk memahami panjang rata-rata judul berita dalam kategori topik tertentu.

import re
from nltk.corpus import stopwords
def stopword(string):
a= [i for i in string.split() if i not in stopwords.words('english')]
return ' '.join(a)

Kode di atas adalah sebuah fungsi Python yang berfungsi untuk menghapus stopword dari sebuah teks. Fungsi ini menggunakan pustaka re (regular expression) dan nltk (Natural Language Toolkit) yang sangat berguna dalam pemrosesan teks dan pengelolaan bahasa alami.

import nltk
nltk.download('stopwords')
nltk.download('omw-1.4')

Kode di atas adalah kode untuk mengunduh dataset “stopwords” dan kamus “WordNet” dari pustaka Natural Language Toolkit (nltk) di Python. Kode ini diperlukan untuk memastikan bahwa Anda memiliki akses ke data stopwords dalam bahasa Inggris dan kamus WordNet dalam bahasa lain (Open Multilingual WordNet).

#convert to lowercase, strip and remove punctuations
def preprocess(text):
text = text.lower()
text=text.strip()
text=re.compile('<.*?>').sub('', text)
text = re.compile('[%s]' % re.escape(string.punctuation)).sub(' ', text)
text = re.sub('\s+', ' ', text)
text = re.sub(r'\[[0-9]*\]',' ',text)
text=re.sub(r'[^\w\s]', '', str(text).lower().strip())
text = re.sub(r'\d',' ',text)
text = re.sub(r'\s+',' ',text)
return text


# STOPWORD REMOVAL
def stopword(string):
a= [i for i in string.split() if i not in stopwords.words('english')]
return ' '.join(a)
#LEMMATIZATION
# Initialize the lemmatizer
wl = WordNetLemmatizer()

# This is a helper function to map NTLK position tags
def get_wordnet_pos(tag):
if tag.startswith('J'):
return wordnet.ADJ
elif tag.startswith('V'):
return wordnet.VERB
elif tag.startswith('N'):
return wordnet.NOUN
elif tag.startswith('R'):
return wordnet.ADV
else:
return wordnet.NOUN
# Tokenize the sentence
def lemmatizer(string):
word_pos_tags = nltk.pos_tag(word_tokenize(string)) # Get position tags
a=[wl.lemmatize(tag[0], get_wordnet_pos(tag[1])) for idx, tag in enumerate(word_pos_tags)] # Map the position tag and lemmatize the word/token
return " ".join(a)

Kode di atas mengandung beberapa fungsi untuk melakukan pra-pemrosesan teks, termasuk konversi ke huruf kecil, penghapusan spasi tambahan, penghapusan tanda baca, penghilangan stopwords, dan lemmatisasi. Kode tersebut menggunakan beberapa pustaka dari Natural Language Toolkit (nltk) dan pustaka reguler (re) dalam Python.

Berikut adalah penjelasan singkat untuk setiap fungsi:

  1. preprocess(text): Fungsi ini digunakan untuk pra-pemrosesan teks. Langkah-langkah yang dilakukan meliputi:
  • Mengubah teks menjadi huruf kecil menggunakan lower().
  • Menghapus spasi tambahan di awal atau akhir teks menggunakan strip().
  • Menghapus tag HTML menggunakan re.compile('<.*?>').sub('', text).
  • Menghapus tanda baca menggunakan re.compile('[%s]' % re.escape(string.punctuation)).sub(' ', text).
  • Menggantikan beberapa spasi yang berurutan dengan satu spasi menggunakan re.sub('\s+', ' ', text).
  • Menghapus angka menggunakan re.sub(r'\d',' ',text).
  • Menggantikan beberapa spasi yang berurutan dengan satu spasi menggunakan re.sub(r'\s+',' ',text).
  • Mengembalikan teks yang telah diproses.
  1. stopword(string): Fungsi ini digunakan untuk menghapus stopwords dari teks. Stopwords adalah kata-kata umum yang sering muncul dalam teks dan biasanya dianggap tidak memiliki makna signifikan dalam analisis teks. Fungsi ini menggunakan list comprehension untuk menghilangkan stopwords dari teks.
  2. get_wordnet_pos(tag): Fungsi ini digunakan untuk menghubungkan posisi tag NTLK dengan posisi tag WordNet yang digunakan dalam proses lemmatisasi.
  3. lemmatizer(string): Fungsi ini digunakan untuk melakukan lemmatisasi pada teks. Lemmatisasi adalah proses mengubah kata ke bentuk dasarnya (lemma) dengan mempertimbangkan konteks dan kelas kata. Fungsi ini menggunakan pos tag dari setiap kata untuk menemukan lemma kata tersebut menggunakan WordNetLemmatizer dari pustaka nltk.

Dengan kombinasi fungsi-fungsi tersebut, kita dapat melakukan pra-pemrosesan teks, penghilangan stopwords, dan lemmatisasi pada teks yang diberikan.

def finalpreprocess(string):
return lemmatizer(stopword(preprocess(string)))
data1['clean_text'] = data1['title'].apply(lambda x: finalpreprocess(x))
data1.head()

Fungsi finalpreprocess(string) digunakan untuk menerapkan proses pra-pemrosesan teks yang lebih lengkap, termasuk penghilangan stopwords, lemmatisasi, dan pembersihan teks. Fungsi ini menggabungkan tiga fungsi sebelumnya: preprocess, stopword, dan lemmatizer.

tfidf_vectorizer = TfidfVectorizer(use_idf=True)
X_train_vectors_tfidf = tfidf_vectorizer.fit_transform(X_train)
X_test_vectors_tfidf = tfidf_vectorizer.transform(X_test)

Kode tersebut adalah implementasi dari ekstraksi fitur TfidfVectorizer pada data teks. Pustaka yang digunakan adalah TfidfVectorizer dari pustaka scikit-learn (sklearn) yang populer untuk melakukan ekstraksi fitur pada teks.

#FITTING THE CLASSIFICATION MODEL using Naive Bayes(tf-idf)
nb_tfidf = MultinomialNB()
nb_tfidf.fit(X_train_vectors_tfidf, y_train)
#Predict y value for test dataset
y_predict = nb_tfidf.predict(X_test_vectors_tfidf)
y_prob = nb_tfidf.predict_proba(X_test_vectors_tfidf)[:,1]
print(classification_report(y_test,y_predict))
print('Confusion Matrix:',confusion_matrix(y_test, y_predict))

Kode di atas adalah implementasi dari pemodelan klasifikasi menggunakan metode Naive Bayes dengan fitur ekstraksi TF-IDF.

Berikut adalah penjelasan singkat untuk setiap baris kode:

  1. nb_tfidf = MultinomialNB(): Baris ini membuat objek model klasifikasi Multinomial Naive Bayes. Ini adalah algoritma yang umum digunakan untuk klasifikasi teks dan cocok untuk data dengan fitur diskrit, seperti representasi TF-IDF yang dihasilkan.
  2. nb_tfidf.fit(X_train_vectors_tfidf, y_train): Baris ini melatih model Naive Bayes menggunakan data latih yang telah diubah menjadi representasi vektor menggunakan TF-IDF. Fungsi fit() digunakan untuk melatih model berdasarkan data latih dan labelnya.
  3. y_predict = nb_tfidf.predict(X_test_vectors_tfidf): Baris ini digunakan untuk memprediksi nilai target (y) pada data uji dengan menggunakan model Naive Bayes yang sudah dilatih. Hasil prediksi disimpan dalam variabel y_predict.
  4. y_prob = nb_tfidf.predict_proba(X_test_vectors_tfidf)[:,1]: Baris ini digunakan untuk menghitung probabilitas prediksi pada data uji. predict_proba() memberikan probabilitas untuk masing-masing kelas, dan [:,1] mengambil probabilitas untuk kelas positif (biasanya kelas 1) karena kita tertarik pada probabilitas prediksi untuk kelas positif.
  5. print(classification_report(y_test, y_predict)): Baris ini mencetak laporan klasifikasi yang berisi berbagai metrik evaluasi, seperti presisi, recall, F1-score, dan akurasi, berdasarkan hasil prediksi dan label data uji.
  6. print('Confusion Matrix:', confusion_matrix(y_test, y_predict)): Baris ini mencetak matriks kebingungan (confusion matrix) yang menunjukkan seberapa baik model Naive Bayes melakukan prediksi dengan membandingkan nilai sebenarnya dan nilai prediksi pada data uji.

Dengan menggunakan kode di atas, Anda telah melatih model klasifikasi Naive Bayes dengan fitur ekstraksi TF-IDF dan mengevaluasi kinerjanya menggunakan laporan klasifikasi dan matriks kebingungan. Ini membantu Anda dalam memahami seberapa baik model Anda dapat melakukan prediksi pada data uji dan mengevaluasi kinerjanya pada tugas klasifikasi yang spesifik.

col = pd.Series(["Hari ini kita bareng-bareng mau memulai gerakan Ekspor UMKM Shopee serentak 10 kota, dengan memberikan pelatihan ekspor bagi 1.000 UMKM secara berbarengan di 10 kota di mana kampus kita berada"])
fr = {"all_cols":col}
df = pd.DataFrame(fr)
df['all_cols'] = df['all_cols'].str.lower()
df_list = df.values.tolist()
df

Kode di atas adalah untuk membuat dan memanipulasi DataFrame pada pustaka pandas di Python.

Mari kita jelaskan setiap baris kode:

  1. col = pd.Series([...]): Baris ini membuat sebuah Series pandas yang berisi teks berita. Series ini kemudian akan digunakan untuk membuat DataFrame.
  2. fr = {"all_cols":col}: Baris ini membuat kamus (dictionary) dengan satu kunci yaitu "all_cols" dan nilai berupa Series col. Kamus ini akan digunakan untuk membuat DataFrame dengan satu kolom bernama "all_cols".
  3. df = pd.DataFrame(fr): Baris ini menggunakan kamus fr untuk membuat DataFrame df. DataFrame ini memiliki satu kolom bernama "all_cols" dan berisi teks berita yang ada dalam Series col.
  4. df['all_cols'] = df['all_cols'].str.lower(): Baris ini mengubah teks pada kolom "all_cols" menjadi huruf kecil (lowercase) menggunakan fungsi str.lower(). Ini akan membantu dalam konsistensi teks sehingga kata-kata dengan huruf besar atau kecil dianggap sama.
  5. df_list = df.values.tolist(): Baris ini mengubah DataFrame df menjadi daftar (list) dengan menggunakan fungsi values.tolist(). Hasilnya akan menjadi daftar berisi satu elemen yang berisi teks berita yang sudah diubah menjadi huruf kecil.

Jadi, pada akhirnya, df_list akan berisi daftar berisi satu teks berita yang telah diubah menjadi huruf kecil, dan teks ini dapat digunakan untuk analisis teks atau pemrosesan selanjutnya dalam bentuk daftar.

df['clean_text'] = df['all_cols'].apply(lambda x: finalpreprocess(x)) #preprocess the data
X_test=df['clean_text']

Pada kode di atas, DataFrame df diperbarui dengan menambahkan kolom baru 'clean_text', yang berisi teks berita yang sudah melalui proses pra-pemrosesan menggunakan fungsi finalpreprocess.

Berikut adalah penjelasan singkat untuk setiap baris kode:

  1. df['clean_text'] = df['all_cols'].apply(lambda x: finalpreprocess(x)): Baris ini menggunakan fungsi apply() untuk menerapkan fungsi finalpreprocess pada setiap elemen dalam kolom 'all_cols'. Fungsi finalpreprocess akan melakukan pra-pemrosesan teks yang lebih lengkap, termasuk penghilangan stopwords, lemmatisasi, dan pembersihan teks. Hasil dari pra-pemrosesan ini akan disimpan dalam kolom baru 'clean_text'.
  2. X_test=df['clean_text']: Baris ini mengambil kolom 'clean_text' dari DataFrame df dan menyimpannya dalam variabel X_test. Hasilnya akan berupa Series pandas yang berisi teks berita yang sudah melalui proses pra-pemrosesan.
X_vector=tfidf_vectorizer.transform(X_test)

#gunakan model terbaik untuk memprediksi nilai 'target' untuk kumpulan data baru
y_predict = nb_tfidf.predict(X_vector)
y_prob = nb_tfidf.predict_proba(X_vector)[:,1]
df['predict_prob']= y_prob
df['target']= y_predict
final=df[['clean_text','target']].reset_index(drop=True)
print(final)

Pada kode di atas, Kita menggunakan model klasifikasi Naive Bayes dengan fitur ekstraksi TF-IDF untuk melakukan prediksi pada kumpulan data baru yang disimpan dalam DataFrame df.

Berikut adalah penjelasan singkat untuk setiap baris kode:

  1. X_vector = tfidf_vectorizer.transform(X_test): Baris ini menggunakan objek tfidf_vectorizer yang sudah di-fit pada data latih untuk melakukan transformasi pada data uji X_test. Transformasi ini akan mengubah teks berita pada X_test menjadi representasi vektor dengan metode TF-IDF, sehingga menghasilkan X_vector yang merupakan matriks representasi vektor untuk data uji.
  2. y_predict = nb_tfidf.predict(X_vector): Baris ini menggunakan model Naive Bayes (nb_tfidf) yang sudah dilatih pada data latih untuk melakukan prediksi pada data uji X_vector. Hasil prediksi disimpan dalam variabel y_predict.
  3. y_prob = nb_tfidf.predict_proba(X_vector)[:,1]: Baris ini menghitung probabilitas prediksi pada data uji X_vector. Fungsi predict_proba() memberikan probabilitas untuk masing-masing kelas, dan [:,1] mengambil probabilitas untuk kelas positif (biasanya kelas 1) karena kita tertarik pada probabilitas prediksi untuk kelas positif.
  4. df['predict_prob'] = y_prob: Baris ini menambahkan kolom baru 'predict_prob' pada DataFrame df yang berisi probabilitas prediksi untuk kelas positif dari setiap teks berita.
  5. df['target'] = y_predict: Baris ini menambahkan kolom baru 'target' pada DataFrame df yang berisi hasil prediksi kelas (0 atau 1) untuk setiap teks berita.
  6. final = df[['clean_text','target']].reset_index(drop=True): Baris ini membuat DataFrame baru final yang hanya berisi kolom 'clean_text' (teks berita yang sudah diproses pra-pemrosesan) dan 'target' (hasil prediksi kelas) dari DataFrame df. Fungsi reset_index(drop=True) digunakan untuk mengatur ulang indeks DataFrame sehingga indeks akan dimulai dari 0.
  7. print(final): Baris ini mencetak DataFrame final, yang berisi teks berita dan hasil prediksi kelasnya. DataFrame ini berfungsi sebagai output akhir dari prediksi kelas pada kumpulan data baru.

Jadi, final adalah DataFrame yang berisi teks berita yang sudah diproses pra-pemrosesan dan hasil prediksi kelas dari model klasifikasi Naive Bayes dengan fitur ekstraksi TF-IDF. Dari sini kita ka dapat mengetahui teks yang kita inputkan masuk kedalam berita finance, health atau sport. Output dari code diatas sebagai berikut:

Output deteksi teks

Itu saja untuk code hari ini. Semoga bermanfaat yaa.

Jangan lupa mampir di linkedin ku yaa:
https://www.linkedin.com/in/setyawananggi26/

--

--

Anggi Setyawan Riyadi

Data enthusiast Anggi Setyawan: Unveiling insights, sharing tips, and exploring the world of data together! | https://anggise2023.github.io/ 🚀 #DataExploration