Gambar oleh Editor
Dengan meningkatnya minat dalam pemrosesan bahasa alami, semakin banyak praktisi yang membentur tembok bukan karena mereka tidak dapat membangun atau menyempurnakan LLM, tetapi karena data mereka berantakan!
Kami akan menunjukkan prosedur pengkodean yang sederhana namun sangat efektif untuk memperbaiki label berisik dalam data teks. Kami akan menangani 2 skenario umum dalam data teks dunia nyata:
- Memiliki kategori yang berisi contoh campuran dari beberapa kategori lainnya. Saya suka menyebut kategori semacam ini sebagai kategori meta.
- Memiliki 2 atau lebih kategori yang harus digabungkan menjadi 1 kategori karena teks yang termasuk dalam kategori tersebut mengacu pada topik yang sama.
Kami akan menggunakan dataset ITSM (IT Service Management) yang dibuat untuk tutorial ini (lisensi CCO). Ini tersedia di Kaggle dari tautan di bawah ini:
https://www.kaggle.com/datasets/nikolagreb/small-itsm-dataset
Saatnya memulai dengan impor semua perpustakaan yang dibutuhkan dan pemeriksaan data dasar. Bersiaplah, kode akan datang!
import pandas as pd
import numpy as np
import string from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import ComplementNB
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import train_test_split
from sklearn import metrics df = pd.read_excel("ITSM_data.xlsx")
df.info()
RangeIndex: 118 entries, 0 to 117
Data columns (total 7 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID_request 118 non-null int64 1 Text 117 non-null object 2 Category 115 non-null object 3 Solution 115 non-null object 4 Date_request_recieved 118 non-null datetime64[ns] 5 Date_request_solved 118 non-null datetime64[ns] 6 ID_agent 118 non-null int64 dtypes: datetime64[ns](2), int64(2), object(3)
memory usage: 6.6+ KB
Setiap baris mewakili satu entri dalam database ITSM. Kami akan mencoba memprediksi kategori tiket berdasarkan teks tiket yang ditulis oleh pengguna. Mari kita periksa lebih dalam bidang yang paling penting untuk kasus penggunaan bisnis yang dijelaskan.
for text, category in zip(df.Text.sample(3, random_state=2), df.Category.sample(3, random_state=2)): print("TEXT:") print(text) print("CATEGORY:") print(category) print("-"*100)
TEXT:
I just want to talk to an agent, there are too many problems on my pc to be explained in one ticket. Please call me when you see this, whoever you are. (talk to agent)
CATEGORY:
Asana
----------------------------------------------------------------------------------------------------
TEXT:
Asana funktionierte nicht mehr, nachdem ich meinen Laptop neu gestartet hatte. Bitte helfen Sie.
CATEGORY:
Help Needed
----------------------------------------------------------------------------------------------------
TEXT:
My mail stopped to work after I updated Windows.
CATEGORY:
Outlook
----------------------------------------------------------------------------------------------------
Jika kita melihat dua tiket pertama, meskipun satu tiket dalam bahasa Jerman, kita dapat melihat bahwa masalah yang dijelaskan mengacu pada perangkat lunak yang sama?—?Asana, tetapi mereka memiliki label yang berbeda. Ini adalah distribusi awal kategori kami:
df.Category.value_counts(normalize=True, dropna=False).mul(100).round(1).astype(str) + "%"
Outlook 19.1%
Discord 13.9%
CRM 12.2%
Internet Browser 10.4%
Mail 9.6%
Keyboard 9.6%
Asana 8.7%
Mouse 8.7%
Help Needed 7.8%
Name: Category, dtype: object
Bantuan yang dibutuhkan terlihat mencurigakan, seperti kategori yang dapat berisi tiket dari berbagai kategori lainnya. Juga, kategori Outlook dan Mail terdengar serupa, mungkin keduanya harus digabungkan menjadi satu kategori. Sebelum masuk lebih dalam ke kategori yang disebutkan, kami akan menyingkirkan nilai yang hilang di kolom yang kami minati.
important_columns = ["Text", "Category"]
for cat in important_columns: df.drop(df[df[cat].isna()].index, inplace=True)
df.reset_index(inplace=True, drop=True)
Tidak ada pengganti yang valid untuk pemeriksaan data dengan mata telanjang. Fungsi mewah untuk melakukannya di panda adalah .sample(), jadi kami akan melakukannya sekali lagi, sekarang untuk kategori yang mencurigakan:
meta = df[df.Category == "Help Needed"] for text in meta.Text.sample(5, random_state=2): print(text) print("-"*100)
Discord emojis aren't available to me, I would like to have this option enabled like other team members have.
---------------------------------------------------------------------------
Bitte reparieren Sie mein Hubspot CRM. Seit gestern funktioniert es nicht mehr
---------------------------------------------------------------------------
My headphones aren't working. I would like to order new.
---------------------------------------------------------------------------
Bundled problems with Office since restart:
Messages not sent
Outlook does not connect, mails do not arrive
Error 0x8004deb0 appears when Connection attempt, see attachment
The company account is affected: AB123
Access via Office.com seems to be possible.
---------------------------------------------------------------------------
Asana funktionierte nicht mehr, nachdem ich meinen Laptop neu gestartet hatte. Bitte helfen Sie.
---------------------------------------------------------------------------
Jelas, kami memiliki tiket yang membicarakan Perselisihan, Asana, dan CRM. Jadi nama kategori harus diubah dari “Diperlukan Bantuan” menjadi kategori yang lebih spesifik dan sudah ada. Untuk langkah pertama proses penugasan ulang, kami akan membuat kolom baru "Kata Kunci" yang memberikan informasi jika tiket memiliki kata dari daftar kategori di kolom "Teks".
words_categories = np.unique([word.strip().lower() for word in df.Category]) # list of categories def keywords(row): list_w = [] for word in row.translate(str.maketrans("", "", string.punctuation)).lower().split(): if word in words_categories: list_w.append(word) return list_w df["Keywords"] = df.Text.apply(keywords) # since our output is in the list, this function will give us better looking final output. def clean_row(row): row = str(row) row = row.replace("[", "") row = row.replace("]", "") row = row.replace("'", "") row = string.capwords(row) return row df["Keywords"] = df.Keywords.apply(clean_row)
Juga, perhatikan bahwa menggunakan "if word in str(words_categories)" alih-alih "if word in words_categories" akan menangkap kata-kata dari kategori dengan lebih dari 1 kata (Browser Internet dalam kasus kami), tetapi juga memerlukan lebih banyak pemrosesan data. Untuk menjaga hal-hal sederhana dan langsung ke intinya, kita akan menggunakan kode untuk kategori yang dibuat hanya dari satu kata. Beginilah tampilan dataset kami sekarang:
df.head(2)
keluaran sebagai gambar:
Setelah mengekstraksi kolom kata kunci, kami akan mengasumsikan kualitas tiketnya. Hipotesis kami:
- Tiket dengan hanya 1 kata kunci di bidang Teks yang sama dengan kategori yang dimiliki tiket akan mudah untuk diklasifikasikan.
- Tiket dengan beberapa kata kunci di bidang Teks, di mana setidaknya salah satu kata kuncinya sama dengan kategori yang dimiliki tiket tersebut akan mudah untuk diklasifikasikan di sebagian besar kasus.
- Tiket yang memiliki kata kunci, tetapi tidak ada yang sama dengan nama kategori yang dimiliki tiket tersebut mungkin adalah kasus label yang berisik.
- Tiket lainnya netral berdasarkan kata kunci.
cl_list = [] for category, keywords in zip(df.Category, df.Keywords): if category.lower() == keywords.lower() and keywords != "": cl_list.append("easy_classification") elif category.lower() in keywords.lower(): # to deal with multiple keywords in the ticket cl_list.append("probably_easy_classification") elif category.lower() != keywords.lower() and keywords != "": cl_list.append("potential_problem") else: cl_list.append("neutral") df["Ease_classification"] = cl_list
df.Ease_classification.value_counts(normalize=True, dropna=False).mul(100).round(1).astype(str) + "%"
neutral 45.6%
easy_classification 37.7%
potential_problem 9.6%
probably_easy_classification 7.0%
Name: Ease_classification, dtype: object
Kami membuat distribusi baru kami dan sekarang saatnya untuk memeriksa tiket yang diklasifikasikan sebagai masalah potensial. Dalam praktiknya, langkah berikut akan membutuhkan lebih banyak pengambilan sampel dan melihat potongan data yang lebih besar dengan mata telanjang, tetapi alasannya akan sama. Anda seharusnya menemukan tiket bermasalah dan memutuskan apakah Anda dapat meningkatkan kualitasnya atau apakah Anda harus menghapusnya dari kumpulan data. Saat Anda menghadapi kumpulan data yang besar, tetap tenang, dan jangan lupa bahwa pemeriksaan dan persiapan data biasanya memakan waktu lebih lama daripada membuat algoritme ML!
pp = df[df.Ease_classification == "potential_problem"] for text, category in zip(pp.Text.sample(5, random_state=2), pp.Category.sample(3, random_state=2)): print("TEXT:") print(text) print("CATEGORY:") print(category) print("-"*100)
TEXT:
outlook issue , I did an update Windows and I have no more outlook on my notebook ? Please help !
Outlook
CATEGORY:
Mail
-------------------------------------------------------------------- TEXT:
Please relase blocked attachements from the mail I got from name.surname@company.com. These are data needed for social media marketing campaing.
CATEGORY:
Outlook
--------------------------------------------------------------------
TEXT:
Asana funktionierte nicht mehr, nachdem ich meinen Laptop neu gestartet hatte. Bitte helfen Sie.
CATEGORY:
Help Needed
--------------------------------------------------------------------
Kami memahami bahwa tiket dari kategori Outlook dan Mail terkait dengan masalah yang sama, jadi kami akan menggabungkan 2 kategori ini dan menyempurnakan hasil algoritme klasifikasi ML kami di masa mendatang.
mail_categories_to_merge = ["Outlook", "Mail"] sum_mail_cluster = 0
for x in mail_categories_to_merge: sum_mail_cluster += len(df[df["Category"] == x]) print("Number of categories to be merged into new cluster: ", len(mail_categories_to_merge))
print("Expected number of tickets in the new cluster: ", sum_mail_cluster) def rename_to_mail_cluster(category): if category in mail_categories_to_merge: category = "Mail_CLUSTER" else: category = category return category df["Category"] = df["Category"].apply(rename_to_mail_cluster) df.Category.value_counts()
Number of categories to be merged into new cluster: 2
Expected number of tickets in the new cluster: 33
Mail_CLUSTER 33
Discord 15
CRM 14
Internet Browser 12
Keyboard 11
Asana 10
Mouse 10
Help Needed 9
Name: Category, dtype: int64
Terakhir, namun tidak kalah pentingnya, kami ingin memberi label ulang beberapa tiket dari kategori meta "Dibutuhkan Bantuan" ke kategori yang tepat.
df.loc[(df["Category"] == "Help Needed") & ([set(x).intersection(words_categories) for x in df["Text"].str.lower().str.replace("[^ws]", "", regex=True).str.split()]), "Category"] = "Change" def cat_name_change(cat, keywords): if cat == "Change": cat = keywords else: cat = cat return cat df["Category"] = df.apply(lambda x: cat_name_change(x.Category, x.Keywords), axis=1)
df["Category"] = df["Category"].replace({"Crm":"CRM"}) df.Category.value_counts(dropna=False)
Mail_CLUSTER 33
Discord 16
CRM 15
Internet Browser 12
Asana 11
Keyboard 11
Mouse 10
Help Needed 6
Name: Category, dtype: int64
Kami melakukan pelabelan ulang dan pembersihan data, tetapi kami tidak boleh menyebut diri kami ilmuwan data jika kami tidak melakukan setidaknya satu eksperimen ilmiah dan menguji dampak pekerjaan kami pada klasifikasi akhir. Kami akan melakukannya dengan menerapkan pengklasifikasi The Complement Naive Bayes di sklearn. Jangan ragu untuk mencoba algoritma lain yang lebih kompleks. Perlu diketahui juga bahwa pembersihan data lebih lanjut dapat dilakukan – misalnya, kami juga dapat membatalkan semua tiket yang tersisa di kategori “Diperlukan Bantuan”.
model = make_pipeline(TfidfVectorizer(), ComplementNB()) # old df
df_o = pd.read_excel("ITSM_data.xlsx") important_categories = ["Text", "Category"]
for cat in important_categories: df_o.drop(df_o[df_o[cat].isna()].index, inplace=True) df_o.name = "dataset just without missing"
df.name = "dataset after deeper cleaning" for dataframe in [df_o, df]: # Split dataset into training set and test set X_train, X_test, y_train, y_test = train_test_split(dataframe.Text, dataframe.Category, test_size=0.2, random_state=1) # Training the model with train data model.fit(X_train, y_train) # Predict the response for test dataset y_pred = model.predict(X_test) print(f"Accuracy of Complement Naive Bayes classifier model on {dataframe.name} is: {round(metrics.accuracy_score(y_test, y_pred),2)}")
Accuracy of Complement Naive Bayes classifier model on dataset just without missing is: 0.48
Accuracy of Complement Naive Bayes classifier model on dataset after deeper cleaning is: 0.65
Cukup mengesankan, bukan? Dataset yang kami gunakan berukuran kecil (sengaja, sehingga Anda dapat dengan mudah melihat apa yang terjadi di setiap langkah) sehingga benih acak yang berbeda dapat menghasilkan hasil yang berbeda, tetapi dalam sebagian besar kasus, model akan bekerja jauh lebih baik pada dataset setelah dibersihkan dibandingkan ke kumpulan data asli. Kami melakukan pekerjaan dengan baik!
Nikola Greb telah membuat kode selama lebih dari empat tahun, dan selama dua tahun terakhir dia berspesialisasi dalam NLP. Sebelum beralih ke ilmu data, dia sukses dalam penjualan, SDM, menulis, dan catur.
- Konten Bertenaga SEO & Distribusi PR. Dapatkan Amplifikasi Hari Ini.
- Platoblockchain. Intelijen Metaverse Web3. Pengetahuan Diperkuat. Akses Di Sini.
- Mencetak Masa Depan bersama Adryenn Ashley. Akses Di Sini.
- Sumber: https://www.kdnuggets.com/2023/04/dealing-noisy-labels-text-data.html?utm_source=rss&utm_medium=rss&utm_campaign=dealing-with-noisy-labels-in-text-data
- :memiliki
- :adalah
- :bukan
- :Di mana
- 1
- 10
- 100
- 11
- 2%
- 7
- 8
- 9
- a
- Tentang Kami
- Akun
- ketepatan
- Setelah
- Agen
- algoritma
- algoritma
- Semua
- juga
- Meskipun
- an
- dan
- ADALAH
- AS
- At
- tersedia
- berdasarkan
- dasar
- BE
- karena
- menjadi
- sebelum
- di bawah
- Lebih baik
- diblokir
- Browser
- membangun
- Bangunan
- bisnis
- tapi
- by
- panggilan
- CAN
- membawa
- kasus
- kasus
- KUCING
- gulat
- kategori
- Kategori
- perubahan
- Catur
- klasifikasi
- tergolong
- Klasifikasi
- Pembersihan
- Kelompok
- kode
- Pengkodean
- Kolom
- Kolom
- COM
- Umum
- perusahaan
- dibandingkan
- Melengkapi
- kompleks
- Terhubung
- koneksi
- mengandung
- bisa
- membuat
- dibuat
- CRM
- data
- Persiapan data
- ilmu data
- Basis Data
- transaksi
- berurusan
- memutuskan
- lebih dalam
- dijelaskan
- MELAKUKAN
- berbeda
- perselisihan
- distribusi
- do
- don
- Menjatuhkan
- setiap
- mudah
- Efektif
- diaktifkan
- masuk
- Eter (ETH)
- persis
- contoh
- contoh
- ada
- diharapkan
- eksperimen
- menjelaskan
- mata
- menghadapi
- beberapa
- bidang
- Fields
- terakhir
- Menemukan
- Pertama
- berikut
- Untuk
- empat
- Gratis
- dari
- fungsi
- lebih lanjut
- masa depan
- Jerman
- mendapatkan
- Memberikan
- memberikan
- Go
- baik
- Terjadi
- Memiliki
- he
- headphone
- membantu
- memukul
- Seterpercayaapakah Olymp Trade? Kesimpulan
- hr
- HTTPS
- Hubspot
- i
- gambar
- Dampak
- mengimplementasikan
- mengimpor
- penting
- impresif
- memperbaiki
- in
- indeks
- informasi
- sebagai gantinya
- bunga
- Internet
- ke
- isu
- IT
- Layanan IT
- hanya
- hanya satu
- KDnugget
- Menjaga
- Jenis
- label
- Label
- bahasa
- laptop
- besar
- lebih besar
- perpustakaan
- Lisensi
- 'like'
- LINK
- Daftar
- melihat
- mencari
- TERLIHAT
- cinta
- terbuat
- Mayoritas
- pengelolaan
- banyak
- Marketing
- Media
- Anggota
- Memori
- tersebut
- Bergabung
- meta
- Metrik
- mungkin
- hilang
- campur aduk
- ML
- model
- lebih
- paling
- beberapa
- nama
- Alam
- Bahasa Alami
- Pengolahan Bahasa alami
- dibutuhkan
- Netral
- New
- nLP
- buku catatan
- sekarang
- jumlah
- mati rasa
- obyek
- of
- Office
- Tua
- on
- ONE
- pilihan
- or
- urutan
- asli
- Lainnya
- kami
- Outlook
- keluaran
- panda
- lalu
- PC
- melakukan
- pipa saluran
- plato
- Kecerdasan Data Plato
- Data Plato
- silahkan
- Titik
- mungkin
- potensi
- praktek
- meramalkan
- mungkin
- Masalah
- masalah
- Prosedur
- proses
- pengolahan
- menghasilkan
- tepat
- tujuan
- kualitas
- acak
- dunia nyata
- terkait
- merupakan
- membutuhkan
- tanggapan
- Hasil
- kembali
- Membersihkan
- kenaikan
- BARIS
- penjualan
- sama
- skenario
- Ilmu
- ilmuwan
- melihat
- biji
- tampaknya
- layanan
- set
- harus
- Menunjukkan
- signifikan
- mirip
- Sederhana
- sejak
- kecil
- So
- Sosial
- media sosial
- Perangkat lunak
- larutan
- beberapa
- Suara
- khusus
- tertentu
- membagi
- awal
- Mulai
- tinggal
- Langkah
- terhenti
- lurus
- Tali
- sukses
- Seharusnya
- mencurigakan
- Mengambil
- Berbicara
- pembicaraan
- tim
- Anggota tim
- uji
- dari
- bahwa
- Grafik
- informasi
- mereka
- Mereka
- Sana.
- Ini
- mereka
- hal
- ini
- tiket
- tiket
- waktu
- untuk
- terlalu
- tema
- Total
- Pelatihan VE
- Pelatihan
- Putar
- tutorial
- memahami
- Memperbarui
- diperbarui
- us
- penggunaan
- menggunakan
- bekas
- Pengguna
- menggunakan
- biasanya
- Nilai - Nilai
- Luas
- sangat
- melalui
- Dinding
- adalah
- we
- Apa
- ketika
- yang
- siapapun
- akan
- Windows
- dengan
- tanpa
- Word
- kata
- Kerja
- kerja
- akan
- penulisan
- tertulis
- X
- tahun
- kamu
- diri
- zephyrnet.dll