在日常生活中,经常需要处理大量的文本信息,例如电子邮件、社交媒体评论等。大多数电子邮件服务提供商都具备自动将垃圾邮件与其他邮件分开的功能,这是自然语言处理(NLP)中一个常见的问题——文本分类。文本数据是无结构的,从中提取信息可能既困难又耗时。但是,随着机器学习和自然语言处理技术的发展,对文本数据进行分类变得越来越简单。本文将深入探讨文本分类,并创建一个模型来将评论分类为有毒和无毒。
在机器学习中,分类指的是将数据项识别为一个或多个预定义类别的问题。数据点可以是各种格式,包括文本、数值、音频或图像。文本分类是分类问题的一个特例,其中文本用作输入数据点,目标是将文本分类为一个或多个预定义类别。根据包含的类别数量,每个监督分类方法可以进一步分为三类:二元分类、多类分类和多标签分类。二元分类用于类别数量为两个时,多类分类用于类别超过两个时,而多标签分类则用于文档可能与一个或多个标签或类别相关联的情况。
以电子邮件垃圾邮件识别器为例,有两个类别:垃圾邮件和非垃圾邮件。每封电子邮件都会经过预处理,并通过分类器,将电子邮件归类为垃圾邮件和非垃圾邮件。文本分类的应用包括内容组织、搜索引擎、推荐系统等。假新闻分类是文本分类的另一个例子。在客户支持中,有时品牌需要回应以推文或电子邮件形式收到的消息。客户可能会提出投诉或购买产品的意愿。因此,识别这些消息的意图是必要的。对电子商务网站上的评论进行情感分析,以了解客户对产品的看法。
在社交媒体上,人们可以自由表达自己的观点。如今有许多在线论坛,用户积极参与并发表评论。然而,偶尔如果有人使用侮辱性语言,过滤这些评论就变得至关重要。为了解决这个问题,将开发一个模型来确定评论是否具有毒性。将使用包含大量被人工评估者标记为有毒的维基百科评论的数据集。这个数据集中有六种类型的毒性:有毒、严重有毒、淫秽、威胁、侮辱和身份仇恨。一条评论可能属于多个类别。因此,它成为一个多标签分类问题。
import pandas as pd
import numpy as np
from nltk.corpus import stopwords
import re
import string
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report, roc_auc_score, confusion_matrix
from nltk.stem import WordNetLemmatizer, PorterStemmer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import MultinomialNB, GaussianNB
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use('ggplot')
plt.rcParams['figure.figsize'] = (15, 10)
加载数据集:
df = pd.read_csv("train.csv")
可以使用以下代码找到数据集中每个类别的评论数量:
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
df = pd.read_csv('train.csv')
cols_target = ['toxic','severe_toxic','obscene','threat','insult','identity_hate']
x= df[cols_target].sum().index
y = df[cols_target].sum()
sns.barplot(x,y)
plt.show()
数据清洗:
def clean_text(text):
text = text.lower()
# ...(省略部分代码以节省空间)...
return text
df["text"] = df['comment_text'].apply(lambda text: clean_text(text))
可以比较清洗后的文本和原始评论:
df[['comment_text','clean_text']].head(2)
训练测试集分割:
cols_target = ['toxic','severe_toxic','obscene','threat','insult','identity_hate']
X_train, X_test, y_train, y_test = train_test_split(df['text'], df[cols_target], test_size= 0.3)
向量化文本:
vect = TfidfVectorizer(
strip_accents='unicode',
analyzer='word',
token_pattern=r'w{1,}',
ngram_range=(1, 3),
stop_words='english',
sublinear_tf=True)
X_train = vect.fit_transform(X_train)
X_test = vect.transform(X_test)
model = OneVsRestClassifier(MultinomialNB())
model.fit(X_train,y_train)
y_pred = model.predict(X_test)
# ...(省略部分代码以节省空间)...
# ...(省略部分代码以节省空间)...