Hình ảnh của Editor
Với sự quan tâm ngày càng tăng đối với việc xử lý ngôn ngữ tự nhiên, ngày càng có nhiều học viên gặp khó khăn không phải vì họ không thể xây dựng hoặc tinh chỉnh LLM mà vì dữ liệu của họ lộn xộn!
Chúng tôi sẽ trình bày các quy trình mã hóa đơn giản nhưng rất hiệu quả để sửa các nhãn nhiễu trong dữ liệu văn bản. Chúng tôi sẽ giải quyết 2 tình huống phổ biến trong dữ liệu văn bản trong thế giới thực:
- Có một danh mục chứa các ví dụ hỗn hợp từ một số danh mục khác. Tôi thích gọi loại thể loại này là một thể loại meta.
- Có từ 2 danh mục trở lên nên gộp lại thành 1 danh mục vì các văn bản thuộc chúng đều đề cập đến cùng một chủ đề.
Chúng tôi sẽ sử dụng tập dữ liệu ITSM (Quản lý dịch vụ CNTT) được tạo cho hướng dẫn này (giấy phép CCO). Nó có sẵn trên Kaggle từ liên kết bên dưới:
https://www.kaggle.com/datasets/nikolagreb/small-itsm-dataset
Đã đến lúc bắt đầu nhập tất cả các thư viện cần thiết và kiểm tra dữ liệu cơ bản. Hãy chuẩn bị tinh thần, mã đang đến!
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
Mỗi hàng đại diện cho một mục trong cơ sở dữ liệu ITSM. Chúng tôi sẽ cố gắng dự đoán loại vé dựa trên nội dung của vé do người dùng viết. Hãy xem xét sâu hơn các lĩnh vực quan trọng nhất đối với các trường hợp sử dụng kinh doanh được mô tả.
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
----------------------------------------------------------------------------------------------------
Nếu chúng ta nhìn vào hai vé đầu tiên, mặc dù một vé bằng tiếng Đức, chúng ta có thể thấy rằng các vấn đề được mô tả đề cập đến cùng một phần mềm?—?Asana, nhưng chúng mang các nhãn khác nhau. Điều này đang bắt đầu phân phối các danh mục của chúng tôi:
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
Sự trợ giúp cần thiết có vẻ đáng ngờ, chẳng hạn như danh mục có thể chứa yêu cầu từ nhiều danh mục khác. Ngoài ra, các danh mục Outlook và Mail nghe có vẻ giống nhau, có lẽ chúng nên được hợp nhất thành một danh mục. Trước khi đi sâu hơn vào các danh mục được đề cập, chúng tôi sẽ loại bỏ các giá trị còn thiếu trong các cột mà chúng tôi quan tâm.
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)
Không có sự thay thế hợp lệ nào cho việc kiểm tra dữ liệu bằng mắt thường. Hàm ưa thích để làm như vậy trong gấu trúc là .sample(), vì vậy chúng ta sẽ thực hiện chính xác điều đó một lần nữa, bây giờ đối với danh mục đáng ngờ:
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.
---------------------------------------------------------------------------
Rõ ràng là chúng tôi có phiếu nói về Discord, Asana và CRM. Vì vậy, tên của danh mục nên được thay đổi từ “Cần trợ giúp” thành các danh mục hiện có, cụ thể hơn. Đối với bước đầu tiên của quy trình chỉ định lại, chúng tôi sẽ tạo cột mới “Từ khóa” cung cấp thông tin nếu vé có từ trong danh sách danh mục trong cột “Văn bản”.
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)
Ngoài ra, hãy lưu ý rằng việc sử dụng “if word in str(words_categories)” thay vì “if word in Words_categories” sẽ bắt được các từ trong danh mục có nhiều hơn 1 từ (trong trường hợp của chúng tôi là Trình duyệt Internet), nhưng cũng sẽ yêu cầu xử lý trước nhiều dữ liệu hơn. Để giữ mọi thứ đơn giản và đi thẳng vào vấn đề, chúng tôi sẽ sử dụng mã cho các danh mục chỉ gồm một từ. Đây là giao diện tập dữ liệu của chúng tôi bây giờ:
df.head(2)
đầu ra dưới dạng hình ảnh:
Sau khi trích xuất cột từ khóa chúng ta sẽ giả định được chất lượng của vé. Giả thuyết của chúng tôi:
- Vé chỉ có 1 từ khóa trong trường Văn bản giống với danh mục của vé đó sẽ dễ dàng phân loại.
- Vé có nhiều từ khóa trong trường Văn bản, trong đó ít nhất một trong các từ khóa giống với danh mục của vé đó sẽ dễ dàng phân loại trong phần lớn các trường hợp.
- Vé có từ khóa nhưng không có từ khóa nào trùng với tên danh mục của vé đó có lẽ là một trường hợp nhãn ồn ào.
- Các vé khác là trung lập dựa trên từ khóa.
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
Chúng tôi đã thực hiện phân phối mới và bây giờ là lúc kiểm tra các vé được phân loại là có vấn đề tiềm ẩn. Trong thực tế, bước tiếp theo sẽ yêu cầu lấy mẫu nhiều hơn và xem xét khối dữ liệu lớn hơn bằng mắt thường, nhưng lý do căn bản sẽ giống nhau. Bạn phải tìm những vé có vấn đề và quyết định xem bạn có thể cải thiện chất lượng của chúng hay không hoặc bạn nên loại chúng khỏi tập dữ liệu. Khi bạn phải đối mặt với một tập dữ liệu lớn, hãy bình tĩnh và đừng quên rằng việc kiểm tra dữ liệu và chuẩn bị dữ liệu thường mất nhiều thời gian hơn so với việc xây dựng thuật toán 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
--------------------------------------------------------------------
Chúng tôi hiểu rằng các yêu cầu từ danh mục Outlook và Mail có liên quan đến cùng một vấn đề, vì vậy chúng tôi sẽ hợp nhất 2 danh mục này và cải thiện kết quả của thuật toán phân loại ML trong tương lai của chúng tôi.
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
Cuối cùng nhưng không kém phần quan trọng, chúng tôi muốn gắn nhãn lại một số vé từ danh mục meta “Cần trợ giúp” sang danh mục thích hợp.
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
Chúng tôi đã dán nhãn lại và làm sạch dữ liệu của mình nhưng chúng tôi không nên tự gọi mình là nhà khoa học dữ liệu nếu chúng tôi không thực hiện ít nhất một thí nghiệm khoa học và kiểm tra tác động của công việc của chúng tôi đối với phân loại cuối cùng. Chúng tôi sẽ làm như vậy bằng cách triển khai trình phân loại The Complement Naive Bayes trong sklearn. Hãy thử các thuật toán khác phức tạp hơn. Ngoài ra, hãy lưu ý rằng có thể thực hiện thêm việc làm sạch dữ liệu - ví dụ: chúng tôi cũng có thể bỏ tất cả các yêu cầu còn lại vào danh mục “Cần trợ giúp”.
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
Khá ấn tượng phải không? Tập dữ liệu chúng tôi sử dụng có kích thước nhỏ (có mục đích, vì vậy bạn có thể dễ dàng xem điều gì xảy ra trong mỗi bước) nên các hạt giống ngẫu nhiên khác nhau có thể tạo ra các kết quả khác nhau, nhưng trong phần lớn các trường hợp, mô hình sẽ hoạt động tốt hơn đáng kể trên tập dữ liệu sau khi làm sạch so sánh vào tập dữ liệu gốc. Chúng tôi đã làm rất tốt!
Nikola Greb đã viết mã được hơn bốn năm và trong hai năm qua, anh ấy chuyên về NLP. Trước khi chuyển sang khoa học dữ liệu, anh đã thành công trong lĩnh vực bán hàng, nhân sự, viết lách và chơi cờ vua.
- Phân phối nội dung và PR được hỗ trợ bởi SEO. Được khuếch đại ngay hôm nay.
- Platoblockchain. Web3 Metaverse Intelligence. Khuếch đại kiến thức. Truy cập Tại đây.
- Đúc kết tương lai với Adryenn Ashley. Truy cập Tại đây.
- nguồn: 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
- : có
- :là
- :không phải
- :Ở đâu
- 1
- 10
- 100
- 11
- 2%
- 7
- 8
- 9
- a
- Giới thiệu
- Tài khoản
- chính xác
- Sau
- Đại lý
- thuật toán
- thuật toán
- Tất cả
- Ngoài ra
- Mặc dù
- an
- và
- LÀ
- AS
- At
- có sẵn
- dựa
- cơ bản
- BE
- bởi vì
- được
- trước
- phía dưới
- Hơn
- bị chặn
- trình duyệt
- xây dựng
- Xây dựng
- kinh doanh
- nhưng
- by
- cuộc gọi
- CAN
- mang
- trường hợp
- trường hợp
- CON MÈO
- Catch
- đố
- Phân loại
- thay đổi
- Tướng
- phân loại
- phân loại
- Phân loại
- Làm sạch
- cụm
- mã
- Lập trình
- Cột
- Cột
- COM
- Chung
- công ty
- so
- Bổ sung
- phức tạp
- Kết nối
- liên quan
- chứa
- có thể
- tạo
- tạo ra
- CRM
- dữ liệu
- Chuẩn bị dữ liệu
- khoa học dữ liệu
- Cơ sở dữ liệu
- nhiều
- xử lý
- quyết định
- sâu sắc hơn
- mô tả
- ĐÃ LÀM
- khác nhau
- bất hòa
- phân phối
- do
- don
- Rơi
- mỗi
- dễ dàng
- Hiệu quả
- kích hoạt
- nhập
- Ether (ETH)
- chính xác
- ví dụ
- ví dụ
- hiện tại
- dự kiến
- thử nghiệm
- Giải thích
- mắt
- phải đối mặt với
- vài
- lĩnh vực
- Lĩnh vực
- cuối cùng
- Tìm kiếm
- Tên
- tiếp theo
- Trong
- 4
- Miễn phí
- từ
- chức năng
- xa hơn
- tương lai
- Tiếng Đức
- được
- Cho
- cho
- Go
- tốt
- xảy ra
- Có
- he
- tai nghe
- giúp đỡ
- đánh
- Độ đáng tin của
- hr
- HTTPS
- HubSpot
- i
- hình ảnh
- Va chạm
- thực hiện
- nhập khẩu
- quan trọng
- ấn tượng
- nâng cao
- in
- chỉ số
- thông tin
- thay vì
- quan tâm
- Internet
- trong
- vấn đề
- IT
- Dịch vụ CNTT
- chỉ
- chỉ một
- Xe đẩy
- Giữ
- Loại
- nhãn
- Nhãn
- Ngôn ngữ
- máy tính xách tay
- lớn
- lớn hơn
- thư viện
- Giấy phép
- Lượt thích
- LINK
- Danh sách
- Xem
- tìm kiếm
- NHÌN
- yêu
- thực hiện
- Đa số
- quản lý
- nhiều
- Marketing
- Phương tiện truyền thông
- Các thành viên
- Bộ nhớ
- đề cập
- đi
- Siêu dữ liệu
- Metrics
- Might
- mất tích
- hỗn hợp
- ML
- kiểu mẫu
- chi tiết
- hầu hết
- nhiều
- tên
- Tự nhiên
- Ngôn ngữ tự nhiên
- Xử lý ngôn ngữ tự nhiên
- cần thiết
- Neutral
- Mới
- nlp
- máy tính xách tay
- tại
- con số
- cục mịch
- vật
- of
- Office
- Xưa
- on
- ONE
- Tùy chọn
- or
- gọi món
- nguyên
- Nền tảng khác
- vfoXNUMXfipXNUMXhfpiXNUMXufhpiXNUMXuf
- Outlook
- đầu ra
- gấu trúc
- qua
- PC
- thực hiện
- đường ống dẫn
- plato
- Thông tin dữ liệu Plato
- PlatoDữ liệu
- xin vui lòng
- Điểm
- có thể
- tiềm năng
- thực hành
- dự đoán
- có lẽ
- Vấn đề
- vấn đề
- thủ tục
- quá trình
- xử lý
- sản xuất
- đúng
- mục đích
- chất lượng
- ngẫu nhiên
- thế giới thực
- liên quan
- đại diện cho
- yêu cầu
- phản ứng
- Kết quả
- trở lại
- Thoát khỏi
- tăng
- HÀNG
- bán hàng
- tương tự
- kịch bản
- Khoa học
- các nhà khoa học
- xem
- hạt giống
- dường như
- dịch vụ
- định
- nên
- hiển thị
- đáng kể
- tương tự
- Đơn giản
- kể từ khi
- nhỏ
- So
- Mạng xã hội
- truyền thông xã hội
- Phần mềm
- giải pháp
- một số
- âm thanh
- chuyên nghành
- riêng
- chia
- Bắt đầu
- Bắt đầu
- ở lại
- Bước
- dừng lại
- ngay
- Chuỗi
- thành công
- phải
- đáng ngờ
- Hãy
- Thảo luận
- nói
- nhóm
- Thành viên của nhóm
- thử nghiệm
- hơn
- việc này
- Sản phẩm
- thông tin
- cung cấp their dịch
- Them
- Đó
- Kia là
- họ
- điều
- điều này
- vé
- vé
- thời gian
- đến
- quá
- chủ đề
- Tổng số:
- Train
- Hội thảo
- Quay
- hướng dẫn
- hiểu
- Cập nhật
- cập nhật
- us
- Sử dụng
- sử dụng
- đã sử dụng
- người sử dang
- sử dụng
- thường
- Các giá trị
- Lớn
- rất
- thông qua
- Tường
- là
- we
- Điều gì
- khi nào
- cái nào
- bất cứ ai
- sẽ
- cửa sổ
- với
- không có
- Từ
- từ
- Công việc
- đang làm việc
- sẽ
- viết
- viết
- X
- năm
- bạn
- mình
- zephyrnet