Editöre göre resim
Doğal dil işlemeye olan ilginin artmasıyla birlikte, giderek daha fazla uygulayıcı, LLM'leri oluşturamadıkları veya ince ayar yapamadıkları için değil, verileri dağınık olduğu için duvara çarpıyor!
Metin verilerindeki gürültülü etiketleri düzeltmek için basit ama çok etkili kodlama prosedürlerini göstereceğiz. Gerçek dünyadaki metin verilerinde yaygın olarak kullanılan 2 senaryoyu ele alacağız:
- Diğer birkaç kategoriden karışık örnekler içeren bir kategoriye sahip olmak. Bu tür bir kategoriye meta kategori demeyi seviyorum.
- 2 kategoride birleştirilmesi gereken 1 veya daha fazla kategoriye sahip olmak, çünkü bunlara ait metinler aynı konuya atıfta bulunmaktadır.
Bu eğitim (CCO lisansı) için oluşturulan ITSM (IT Hizmet Yönetimi) veri setini kullanacağız. Aşağıdaki bağlantıdan Kaggle'da mevcuttur:
https://www.kaggle.com/datasets/nikolagreb/small-itsm-dataset
Gerekli tüm kitaplıkların içe aktarılması ve temel veri incelemesi ile başlama zamanı. Hazırlanın, kod geliyor!
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
Her satır, ITSM veritabanındaki bir girişi temsil eder. Bir kullanıcı tarafından yazılan biletin metnine göre biletin kategorisini tahmin etmeye çalışacağız. Açıklanan iş kullanım durumları için en önemli alanları daha derinlemesine inceleyelim.
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
----------------------------------------------------------------------------------------------------
İlk iki bilete bakacak olursak, bir bilet Almanca olmasına rağmen, açıklanan sorunların aynı yazılıma mı?—?Asana'ya atıfta bulunduğunu, ancak farklı etiketler taşıdığını görebiliriz. Bu, kategorilerimizin dağıtımına başlıyor:
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
Gereken yardım, birden fazla başka kategoriden bilet içerebilen kategori gibi şüpheli görünüyor. Ayrıca, Outlook ve Mail kategorileri kulağa benzer geliyor, belki de tek bir kategoride birleştirilmeleri gerekiyor. Bahsedilen kategorilere derinlemesine dalmadan önce, ilgilendiğimiz sütunlardaki eksik değerlerden kurtulacağız.
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)
Verilerin çıplak gözle incelenmesinin geçerli bir alternatifi yoktur. Pandalarda bunu yapmak için süslü işlev .sample()'dır, bu yüzden şimdi şüpheli kategori için tam olarak bunu bir kez daha yapacağız:
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.
---------------------------------------------------------------------------
Açıkçası, Discord, Asana ve CRM hakkında konuşan biletlerimiz var. Bu nedenle, kategorinin adı "Yardım Gerekli"den mevcut, daha spesifik kategorilere değiştirilmelidir. Yeniden atama işleminin ilk adımı için, biletin "Metin" sütunundaki kategori listesinden kelimeye sahip olup olmadığı bilgisini veren yeni "Anahtar Kelimeler" sütununu oluşturacağız.
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)
Ayrıca, "if word inwords_categories" yerine "if word in str(words_categories)" kullanmanın 1'den fazla kelime içeren kategorilerdeki kelimeleri yakalayacağını (bizim durumumuzda İnternet Tarayıcısı), ancak daha fazla veri ön işlemesi gerektireceğini unutmayın. İşleri basit ve doğrudan noktaya getirmek için, sadece bir kelimeden oluşan kategoriler kodunu kullanacağız. Veri kümemiz şimdi böyle görünüyor:
df.head(2)
görüntü olarak çıktı:
Anahtar kelimeler sütununu çıkardıktan sonra biletlerin kalitesini üstleneceğiz. Hipotezimiz:
- Text alanında biletin ait olduğu kategori ile aynı olan sadece 1 anahtar kelime ile biletin sınıflandırılması kolay olacaktır.
- Anahtar kelimelerden en az birinin biletin ait olduğu kategori ile aynı olduğu Metin alanında birden fazla anahtar kelime içeren biletin sınıflandırılması çoğu durumda kolay olacaktır.
- Anahtar kelimeleri olan ancak hiçbiri biletin ait olduğu kategorinin adına eşit olmayan bilet, muhtemelen gürültülü bir etiket durumudur.
- Diğer biletler, anahtar kelimelere göre tarafsızdır.
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
Yeni dağıtımımızı yaptık ve şimdi potansiyel sorun olarak sınıflandırılan biletleri inceleme zamanı. Uygulamada, sonraki adım çok daha fazla örnekleme gerektirecek ve daha büyük veri yığınlarına çıplak gözle bakacaktır, ancak mantık aynı olacaktır. Sorunlu biletleri bulmanız ve kalitelerini artırıp artıramayacağınıza veya onları veri kümesinden çıkarmanız gerekip gerekmediğine karar vermeniz gerekiyor. Büyük bir veri kümesiyle karşı karşıya kaldığınızda sakin olun ve veri incelemesinin ve veri hazırlığının genellikle ML algoritmaları oluşturmaktan çok daha fazla zaman aldığını unutmayın!
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
--------------------------------------------------------------------
Outlook ve Mail kategorilerindeki biletlerin aynı sorunla ilgili olduğunu anlıyoruz, bu nedenle bu 2 kategoriyi birleştireceğiz ve gelecekteki ML sınıflandırma algoritmamızın sonuçlarını iyileştireceğiz.
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
Son olarak, "Yardım Gerekli" meta kategorisindeki bazı biletleri uygun kategoriye yeniden etiketlemek istiyoruz.
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
Verilerimizi yeniden etiketleme ve temizleme işlemlerini yaptık ancak en az bir bilimsel deney yapıp çalışmamızın nihai sınıflandırma üzerindeki etkisini test etmezsek kendimize veri bilimcisi dememeliyiz. Bunu, sklearn'de The Complement Naive Bayes sınıflandırıcısını uygulayarak yapacağız. Diğer, daha karmaşık algoritmaları denemekten çekinmeyin. Ayrıca, daha fazla veri temizliği yapılabileceğini unutmayın - örneğin, "Yardım Gerekli" kategorisinde kalan tüm biletleri de bırakabiliriz.
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
Oldukça etkileyici, değil mi? Kullandığımız veri kümesi küçüktür (kasıtlı olarak, her adımda ne olduğunu kolayca görebilmeniz için) bu nedenle farklı rastgele tohumlar farklı sonuçlar verebilir, ancak çoğu durumda model, temizlemeden sonra veri kümesinde önemli ölçüde daha iyi performans gösterecektir. orijinal veri kümesine. İyi iş çıkardık!
Nikola Greb dört yıldan fazla bir süredir kodlama yapıyor ve son iki yıldır NLP konusunda uzmanlaştı. Veri bilimine dönmeden önce satış, İK, yazma ve satrançta başarılıydı.
- SEO Destekli İçerik ve Halkla İlişkiler Dağıtımı. Bugün Gücünüzü Artırın.
- Plato blok zinciri. Web3 Metaverse Zekası. Bilgi Güçlendirildi. Buradan Erişin.
- Adryenn Ashley ile Geleceği Basmak. Buradan Erişin.
- Kaynak: 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
- :vardır
- :dır-dir
- :olumsuzluk
- :Neresi
- 1
- 10
- 100
- 11
- 2%
- 7
- 8
- 9
- a
- Hakkımızda
- Hesap
- doğruluk
- Sonra
- Danışman
- algoritma
- algoritmalar
- Türkiye
- Ayrıca
- Rağmen
- an
- ve
- ARE
- AS
- At
- mevcut
- merkezli
- temel
- BE
- Çünkü
- olmuştur
- önce
- altında
- Daha iyi
- tıkalı
- tarayıcı
- inşa etmek
- bina
- iş
- fakat
- by
- çağrı
- CAN
- taşımak
- dava
- durumlarda
- KEDİ
- Yakalamak
- kategoriler
- Kategoriler
- değişiklik
- satranç
- sınıflandırma
- sınıflandırılmış
- sınıflandırmak
- Temizlik
- Küme
- kod
- kodlama
- Sütun
- Sütunlar
- COM
- ortak
- şirket
- karşılaştırıldığında
- Tamamlayıcı
- karmaşık
- Sosyal medya
- bağ
- içeren
- olabilir
- yaratmak
- çevrimiçi kurslar düzenliyorlar.
- CRM
- veri
- Veri Hazırlama
- veri bilimi
- veritabanı
- anlaşma
- ilgili
- karar vermek
- derin
- tarif edilen
- DID
- farklı
- anlaşmazlık
- dağıtım
- do
- don
- Damla
- her
- kolayca
- Etkili
- etkin
- giriş
- Eter (ETH)
- kesinlikle
- örnek
- örnekler
- mevcut
- beklenen
- deneme
- açıkladı
- göz
- karşı
- az
- alan
- Alanlar
- son
- bulmak
- Ad
- takip etme
- İçin
- dört
- Ücretsiz
- itibaren
- işlev
- daha fazla
- gelecek
- Almanca
- almak
- Vermek
- verir
- Go
- Tercih Etmenizin
- olur
- Var
- he
- kulaklık
- yardım et
- isabet
- Ne kadar
- hr
- HTTPS
- HubSpot
- i
- görüntü
- darbe
- uygulanması
- ithalat
- önemli
- etkileyici
- iyileştirmek
- in
- indeks
- bilgi
- yerine
- faiz
- Internet
- içine
- konu
- IT
- BT hizmeti
- sadece
- sadece bir
- KDNuggets
- tutmak
- Nezaket.
- etiket
- Etiketler
- dil
- dizüstü bilgisayar
- büyük
- büyük
- kütüphaneler
- Lisans
- sevmek
- LINK
- Liste
- Bakın
- bakıyor
- GÖRÜNÜYOR
- Aşk
- yapılmış
- çoğunluk
- yönetim
- çok
- Pazarlama
- medya
- Üyeler
- Bellek
- adı geçen
- gitmek
- Meta
- Metrikleri
- olabilir
- eksik
- karışık
- ML
- model
- Daha
- çoğu
- çoklu
- isim
- Doğal (Madenden)
- Doğal lisan
- Doğal Dil İşleme
- gerekli
- Nötr
- yeni
- nlp
- defter
- şimdi
- numara
- dizi
- nesne
- of
- Office
- Eski
- on
- ONE
- seçenek
- or
- sipariş
- orijinal
- Diğer
- bizim
- Görünüm
- çıktı
- pandalar
- geçmiş
- PC
- yapmak
- boru hattı
- Platon
- Plato Veri Zekası
- PlatoVeri
- Lütfen
- Nokta
- mümkün
- potansiyel
- uygulama
- tahmin
- muhtemelen
- Sorun
- sorunlar
- prosedürler
- süreç
- işleme
- üretmek
- uygun
- amaç
- kalite
- rasgele
- Gerçek dünya
- ilgili
- temsil
- gerektirir
- yanıt
- Sonuçlar
- dönüş
- Kurtulmak
- yükselen
- SIRA
- satış
- aynı
- senaryolar
- Bilim
- bilim adamları
- görmek
- tohumları
- görünüyor
- hizmet
- set
- meli
- şov
- önemli ölçüde
- benzer
- Basit
- beri
- küçük
- So
- Sosyal Medya
- sosyal medya
- Yazılım
- çözüm
- biraz
- Ses
- özel
- özel
- bölmek
- başlama
- XNUMX dakika içinde!
- kalmak
- adım
- durdu
- düz
- dizi
- başarılı
- sözde
- şüpheli
- Bizi daha iyi tanımak için
- Konuşmak
- konuşma
- takım
- Takım üyeleri
- test
- göre
- o
- The
- Bilgi
- ve bazı Asya
- Onları
- Orada.
- Bunlar
- onlar
- işler
- Re-Tweet
- bilet
- bilet
- zaman
- için
- çok
- konu
- Toplam
- Tren
- Eğitim
- Dönüş
- öğretici
- anlamak
- Güncelleme
- güncellenmiş
- us
- kullanım
- kullanım
- Kullanılmış
- kullanıcı
- kullanma
- genellikle
- Değerler
- Geniş
- çok
- üzerinden
- Duvar
- oldu
- we
- Ne
- ne zaman
- hangi
- her kim
- irade
- pencereler
- ile
- olmadan
- Word
- sözler
- İş
- çalışma
- olur
- yazı yazıyor
- yazılı
- X
- yıl
- sen
- kendiniz
- zefirnet