الصورة بواسطة المحرر
مع تزايد الاهتمام بمعالجة اللغة الطبيعية ، فإن المزيد والمزيد من الممارسين يضربون الجدار ليس لأنهم لا يستطيعون بناء أو ضبط LLM ، ولكن لأن بياناتهم فوضوية!
سوف نعرض إجراءات تشفير بسيطة وفعالة للغاية لإصلاح الملصقات المزعجة في البيانات النصية. سنتعامل مع سيناريوهين شائعين في بيانات نصية حقيقية:
- وجود فئة تحتوي على أمثلة مختلطة من فئات أخرى قليلة. أحب أن أسمي هذا النوع من الفئات فئة التعريف.
- وجود فئتين أو أكثر يجب دمجهما في فئة واحدة لأن النصوص التي تنتمي إليهما تشير إلى نفس الموضوع.
سنستخدم مجموعة بيانات ITSM (إدارة خدمات تكنولوجيا المعلومات) التي تم إنشاؤها لهذا البرنامج التعليمي (ترخيص CCO). إنه متاح على Kaggle من الرابط أدناه:
https://www.kaggle.com/datasets/nikolagreb/small-itsm-dataset
حان الوقت للبدء في استيراد جميع المكتبات المطلوبة وفحص البيانات الأساسية. استعد لنفسك ، الكود قادم!
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
يمثل كل صف إدخالًا واحدًا في قاعدة بيانات ITSM. سنحاول التنبؤ بفئة التذكرة بناءً على نص التذكرة الذي كتبه المستخدم. دعنا نفحص بشكل أعمق أهم الحقول لحالات استخدام الأعمال الموصوفة.
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
----------------------------------------------------------------------------------------------------
إذا ألقينا نظرة على أول تذكرتين ، على الرغم من وجود تذكرة واحدة باللغة الألمانية ، يمكننا أن نرى أن المشاكل الموصوفة تشير إلى نفس البرنامج؟ -؟ Asana ، لكنهما يحملان تسميات مختلفة. هذا هو بدء توزيع فئاتنا:
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
المساعدة المطلوبة تبدو مشبوهة ، مثل الفئة التي يمكن أن تحتوي على تذاكر من فئات أخرى متعددة. أيضًا ، تبدو فئات Outlook و Mail متشابهة ، ربما يجب دمجها في فئة واحدة. قبل التعمق في الفئات المذكورة ، سنتخلص من القيم المفقودة في الأعمدة التي تهمنا.
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)
لا يوجد بديل صالح لفحص البيانات بالعين المجردة. وظيفة fancy للقيام بذلك في الباندا هي .sample () ، لذلك سنفعل ذلك بالضبط مرة أخرى ، الآن للفئة المشبوهة:
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.
---------------------------------------------------------------------------
من الواضح أن لدينا تذاكر تتحدث عن Discord و Asana و CRM. لذلك يجب تغيير اسم الفئة من "مساعدة مطلوبة" إلى فئات أكثر تحديدًا موجودة. بالنسبة للخطوة الأولى في عملية إعادة التعيين ، سننشئ العمود الجديد "الكلمات الرئيسية" الذي يعطي المعلومات إذا كانت التذكرة تحتوي على الكلمة من قائمة الفئات في عمود "النص".
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)
لاحظ أيضًا أن استخدام "if word in str (words_categories)" بدلاً من "if word in words_categories" من شأنه أن يمسك الكلمات من الفئات التي تحتوي على أكثر من كلمة واحدة (متصفح الإنترنت في حالتنا) ، ولكنه سيتطلب أيضًا المزيد من المعالجة المسبقة للبيانات. لإبقاء الأمور بسيطة ومباشرة ، سنستخدم الكود الخاص بالفئات المكونة من كلمة واحدة فقط. هكذا تبدو مجموعة البيانات لدينا الآن:
df.head(2)
الإخراج كصورة:
بعد استخراج عمود الكلمات الرئيسية ، سنفترض جودة التذاكر. فرضيتنا:
- سيكون من السهل تصنيف التذكرة التي تحتوي على كلمة رئيسية واحدة فقط في حقل النص وهي نفس فئة التذكرة التي تنتمي إليها.
- تذكرة مع كلمات رئيسية متعددة في حقل النص ، حيث يكون من السهل تصنيف واحدة على الأقل من الكلمات الرئيسية مثل الفئة التي تنتمي إليها التذكرة في معظم الحالات.
- التذكرة التي تحتوي على كلمات رئيسية ، ولكن لا يوجد أي منها مساوٍ لاسم الفئة التي تنتمي إليها التذكرة ، ربما تكون حالة تسمية مزعجة.
- التذاكر الأخرى محايدة بناءً على الكلمات الرئيسية.
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
لقد قمنا بتوزيعنا الجديد والآن حان الوقت لفحص التذاكر المصنفة على أنها مشكلة محتملة. من الناحية العملية ، ستتطلب الخطوة التالية أخذ عينات أكثر بكثير وإلقاء نظرة على مجموعات البيانات الأكبر بالعين المجردة ، لكن الأساس المنطقي سيكون هو نفسه. من المفترض أن تجد تذاكر بها مشكلات وتقرر ما إذا كان بإمكانك تحسين جودتها أو ما إذا كان يجب عليك إسقاطها من مجموعة البيانات. عندما تواجه مجموعة بيانات كبيرة ، حافظ على هدوئك ، ولا تنس أن فحص البيانات وإعدادها يستغرق عادةً وقتًا أطول بكثير من بناء خوارزميات تعلم الآلة!
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 و Mail مرتبطة بنفس المشكلة ، لذلك سنقوم بدمج هاتين الفئتين وتحسين نتائج خوارزمية تصنيف ML في المستقبل.
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
أخيرًا وليس آخرًا ، نريد إعادة تسمية بعض التذاكر من الفئة الوصفية "مساعدة مطلوبة" إلى الفئة المناسبة.
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
لقد قمنا بإعادة تسمية بياناتنا وتنظيفها ولكن لا ينبغي أن نطلق على أنفسنا علماء البيانات إذا لم نقم بتجربة علمية واحدة على الأقل ونختبر تأثير عملنا على التصنيف النهائي. سنفعل ذلك من خلال تطبيق مصنف Complement Naive Bayes في sklearn. لا تتردد في تجربة خوارزميات أخرى أكثر تعقيدًا. كن على علم أيضًا أنه يمكن إجراء المزيد من تنظيف البيانات - على سبيل المثال ، يمكننا أيضًا إسقاط جميع التذاكر المتبقية في فئة "المساعدة المطلوبة".
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
مثير للإعجاب ، أليس كذلك؟ مجموعة البيانات التي استخدمناها صغيرة (عن قصد ، لذا يمكنك بسهولة رؤية ما يحدث في كل خطوة) لذلك قد تؤدي البذور العشوائية المختلفة إلى نتائج مختلفة ، ولكن في الغالبية العظمى من الحالات ، سيعمل النموذج بشكل أفضل على مجموعة البيانات بعد التنظيف مقارنة إلى مجموعة البيانات الأصلية. لقد قمنا بعمل جيد!
نيكولا جريب تم ترميزه لأكثر من أربع سنوات ، وعلى مدار العامين الماضيين تخصص في البرمجة اللغوية العصبية. قبل أن ينتقل إلى علم البيانات ، كان ناجحًا في المبيعات والموارد البشرية والكتابة والشطرنج.
- محتوى مدعوم من تحسين محركات البحث وتوزيع العلاقات العامة. تضخيم اليوم.
- بلاتوبلوكشين. Web3 Metaverse Intelligence. تضخيم المعرفة. الوصول هنا.
- سك المستقبل مع أدرين أشلي. الوصول هنا.
- المصدر 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
- :لديها
- :يكون
- :ليس
- :أين
- 1
- 10
- 100
- 11
- 2%
- 7
- 8
- 9
- a
- من نحن
- حسابي
- دقة
- بعد
- الوكيل
- خوارزمية
- خوارزميات
- الكل
- أيضا
- بالرغم ان
- an
- و
- هي
- AS
- At
- متاح
- على أساس
- الأساسية
- BE
- لان
- كان
- قبل
- أقل من
- أفضل
- سدت
- المتصفح
- نساعدك في بناء
- ابني
- الأعمال
- لكن
- by
- دعوة
- CAN
- حمل
- حقيبة
- الحالات
- قط
- يو كاتش
- الفئات
- الفئة
- تغيير
- شطرنج
- تصنيف
- مبوب
- صنف
- سوائل التنظيف
- كتلة
- الكود
- البرمجة
- عمود
- الأعمدة
- COM
- مشترك
- حول الشركة
- مقارنة
- تكملة
- مجمع
- التواصل
- صلة
- يحتوي
- استطاع
- خلق
- خلق
- CRM
- البيانات
- تحضير البيانات
- علم البيانات
- قاعدة البيانات
- صفقة
- تعامل
- تقرر
- أعمق
- وصف
- فعل
- مختلف
- خلاف
- توزيع
- do
- دون
- قطرة
- كل
- بسهولة
- الطُرق الفعّالة
- تمكين
- دخول
- الأثير (ETH)
- بالضبط
- مثال
- أمثلة
- القائمة
- متوقع
- تجربة
- شرح
- عين
- مواجهة
- قليل
- حقل
- مجال
- نهائي
- الاسم الأول
- متابعيك
- في حالة
- أربعة
- مجانًا
- تبدأ من
- وظيفة
- إضافي
- مستقبل
- الألمانيّة
- دولار فقط واحصل على خصم XNUMX% على جميع
- منح
- يعطي
- Go
- خير
- يحدث
- يملك
- he
- سماعات الرأس
- مساعدة
- ضرب
- كيفية
- hr
- HTTPS
- HubSpot
- i
- صورة
- التأثير
- تحقيق
- استيراد
- أهمية
- مثير للإعجاب
- تحسن
- in
- مؤشر
- معلومات
- بدلًا من ذلك
- مصلحة
- Internet
- إلى
- قضية
- IT
- خدمة تكنولوجيا المعلومات
- م
- واحد فقط
- KD nuggets
- احتفظ
- نوع
- تُشير
- ملصقات
- لغة
- كمبيوتر محمول
- كبير
- أكبر
- المكتبات
- حقوق الملكية الفكرية
- مثل
- LINK
- لينكدين:
- قائمة
- بحث
- أبحث
- تبدو
- حب
- صنع
- أغلبية
- إدارة
- كثير
- التسويق
- الوسائط
- الأعضاء
- مكبر الصوت : يدعم، مع دعم ميكروفون مدمج لمنع الضوضاء
- المذكورة
- دمج
- مييتااا
- المقاييس
- ربما
- مفقود
- مختلط
- ML
- نموذج
- الأكثر من ذلك
- أكثر
- متعدد
- الاسم
- طبيعي
- اللغة الطبيعية
- معالجة اللغات الطبيعية
- بحاجة
- متعدد
- جديد
- البرمجة اللغوية العصبية
- مفكرة
- الآن
- عدد
- نمباي
- موضوع
- of
- Office
- قديم
- on
- ONE
- خيار
- or
- طلب
- أصلي
- أخرى
- لنا
- بريد اوتلوك
- الناتج
- الباندا
- الماضي
- PC
- نفذ
- خط أنابيب
- أفلاطون
- الذكاء افلاطون البيانات
- أفلاطون داتا
- من فضلك
- البوينت
- ممكن
- محتمل
- ممارسة
- تنبأ
- المحتمل
- المشكلة
- مشاكل
- الإجراءات
- عملية المعالجة
- معالجة
- إنتاج
- لائق
- غرض
- جودة
- عشوائية
- العالم الحقيقي
- ذات صلة
- يمثل
- تطلب
- استجابة
- النتائج
- عائد أعلى
- تخلص من
- ارتفاع
- صف
- الأملاح
- نفسه
- سيناريوهات
- علوم
- العلماء
- انظر تعريف
- بذور
- يبدو
- الخدمة
- طقم
- ينبغي
- إظهار
- بشكل ملحوظ
- مماثل
- الاشارات
- منذ
- صغير
- So
- العدالة
- وسائل التواصل الاجتماعي
- تطبيقات الكمبيوتر
- حل
- بعض
- متخصص
- محدد
- انقسم
- بداية
- ابتداء
- إقامة
- خطوة
- توقف
- مستقيم
- خيط
- ناجح
- مفترض
- مشكوك فيه
- أخذ
- حديث
- الحديث
- فريق
- أعضاء الفريق
- تجربه بالعربي
- من
- أن
- •
- المعلومات
- من مشاركة
- منهم
- هناك.
- تشبه
- هم
- الأشياء
- تذكرة
- تذاكر
- الوقت
- إلى
- جدا
- موضوع
- الإجمالي
- قطار
- قادة الإيمان
- تحول
- البرنامج التعليمي
- فهم
- تحديث
- تحديث
- us
- الأستعمال
- تستخدم
- مستعمل
- مستخدم
- استخدام
- عادة
- القيم
- كبير
- جدا
- بواسطة
- جدار
- وكان
- we
- ابحث عن
- متى
- التي
- من
- سوف
- نوافذ
- مع
- بدون
- كلمة
- كلمات
- للعمل
- عامل
- سوف
- جاري الكتابة
- مكتوب
- X
- سنوات
- لصحتك!
- نفسك
- زفيرنت