在信息技术公司担任技术支持专员,每天需要处理数百个支持票。每个票的第一项任务是将其归类到已经开发的类别之一,例如“凭证过期”、“操作系统故障”、“硬件故障”等。如果手动对每个支持票进行分类,将需要大量的时间和精力。得益于文本分类算法和机器学习,可以自动化此任务并节省许多人力小时。
文本分类是一种机器学习算法,它为输入文本分配类别。这些类别是预定义的并且可定制的;例如,在上述例子中,“操作系统故障”、“硬件故障”和“凭证过期”都是希望现有和新的输入数据被归类到的预定义类别。
文本分类有多种应用。其中一些包括:IT公司使用的支持票分类、基于类型的电影或电视节目分类、基于研究领域的期刊论文分类等。
目前有多种机器学习模型用于文本分类问题,例如:支持向量机、朴素贝叶斯算法、逻辑回归。但主要看到这些模型在数值分类上的实现。对于文本分类,首先需要将文本数据转换为数值数据,这就是向量化的用武之地。在进一步讨论之前,让简要了解这些模型。
支持向量机(SVM)是一种出色的回归和分类算法,有助于最大化模型的准确性并避免过拟合。当数据集规模较大时,SVM效果最佳。常见的SVM应用包括图像识别、客户关系管理(CRM)工具、文本分类、提取等。
朴素贝叶斯算法(NB)基于贝叶斯定理,工作在条件概率原则上,进而测量一个事件发生后另一个事件发生的概率。
逻辑回归是一种监督学习算法,有助于预测事件或结果的概率。常见的逻辑回归问题包括输入数据的二元分类,例如电子邮件是否为垃圾邮件,或者一个人是否喜欢汉堡。
文本向量化是将文本数据转换为数值数据的过程。有多种工具可以帮助向量化,例如:词袋模型、二元词频、词频(L1归一化)、TF-IDF(L2归一化)、Word2Vec。Word2Vec是一种通过神经网络构建词嵌入的算法。
在本文中,将重点关注使用TF-IDF向量化和逻辑回归的文本分类。让首先简要介绍TF-IDF向量化器和逻辑回归器。
使用TF-IDF模型,可以定义每个输入词的重要性,这取决于它在文本中的频率。它基于代表词力的复合分数。这个复合分数是通过将词频(TF)因子与逆文档频率(IDF)因子相乘来计算的。
词频(TF):这个因子显示了文档中总词数中一个词的出现次数,计算公式为:TF = 文档中词的计数 / 文档中总词数。逆文档频率(IDF):这个因子取总文档数与包含特定词的文档总数的比值的对数。计算公式为:IDF = log(总文档数/包含给定词的文档数)。TF-IDF值越高,词越独特且出现频率低。因子值越低,词越常见。例如,像“和”、“这”、“是”这样的常见词,它们的TF-IDF值几乎为零。
步骤1:使用TF-IDF向量化器进行向量化。让以实际的文本数据为例,使用TF-IDF向量化器进行向量化。将在Jupyter Notebook和Python中进行此示例。因此,让首先在Jupyter中初始化必要的库。
import pandas as pd
import warnings
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction import _stop_words
TfidfVectorizer是从sklearn.feature_extraction需要导入的库。_stop_words用于列出一种语言中的常用词。
在这个示例中,将使用公开可用的互联网电影数据库(IMDB)电影标题和类型数据集,可以从这里下载。已经下载了名为title.basics.tsv.gz的文件。这是一个大约150MB的大文件,包含数百万行。为了简单起见,只取了数据集的前1000+条目,并将数据集分成两个文件,前1028行为训练数据集(只是一个随机数字,没有逻辑),称为imdb_train.csv,剩下的18条目作为imdb_test.csv。首先将在训练数据集上训练,然后在未见过的测试数据集上测试模型,并让模型对18部电影进行分类。最后,将通过比较任何随机电影的预测类型与实际类型来评估模型。
步骤2:加载和可视化数据集。让按如下方式加载和显示训练数据集:
import pandas as pd
train_data = pd.read_csv('imdb_train.csv')
print(train_data.shape)
print(train_data.head())
print(train_data['genres'].unique())
有1058部电影标题及其类型。有17种不同的类型,1058部电影被分类。
步骤3:向量化。首先创建一个电影标题的语料库矩阵。
corpus = train_data['primaryTitle'].values
corpus
然后,将语料库向量化。
vectorizer = TfidfVectorizer(stop_words='english')
X = vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names())
首先,使用vectorizer = TfidfVectorizer(stop_words='english')命令生成向量器对象。在下一步中,使用X = vectorizer.fit_transform(corpus)命令将输入文本转换为TF-IDF矩阵,并在最后一步打印出TF-IDF矩阵中选定的词。
Vector_Text = pd.DataFrame(X.toarray(), columns=vectorizer.get_feature_names())
Vector_Text['originalText'] = pd.Series(corpus)
Vector_Text
在之前的步骤中,使用TF-IDF可视化了文档-词矩阵。现在让将类型列重新添加到向量化表中。
ML_Data = pd.DataFrame(X.toarray(), columns=vectorizer.get_feature_names())
ML_Data['genres'] = train_data['genres']
ML_Data.head()
步骤4:数据格式化。现在让进行一些数据格式化和调整。
Target = ML_Data.columns[-1]
Predictors = ML_Data.columns[:-1]
X = ML_Data[Predictors].values
y = ML_Data[Target].values
步骤5:逻辑回归分类。逻辑回归模型有助于根据独立变量数据集估计事件的概率。可以尝试其他分类模型,如朴素贝叶斯、决策树等,但为了简单起见,在这里使用逻辑回归。鼓励读者尝试其他模型并在评论中分享结果。
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
clf = LogisticRegression(C=5, solver='newton-cg', penalty='l2')
LOG = clf.fit(X, y)
pred = LOG.predict(X)
Test_Data = pd.DataFrame(data=X, columns=Predictors)
Test_Data['TargetVariable'] = y
Test_Data['Prediction'] = pred
print(Test_Data.head())
print(metrics.classification_report(y, pred))
print(metrics.confusion_matrix(pred, y))
F1_Score = metrics.f1_score(y, pred, average='weighted')
print('Accuracy of the model on Testing Sample Data:', round(F1_Score, 2))
步骤6:新电影标签的预测。在这一步中,将加载测试数据集,看看模型如何预测电影的类型。将定义一个函数,将单词转换为数值向量。
def genres_test(inpText):
X = vectorizer.transform(input_text)
Prediction = FinalModel.predict(X)
Result = pd.DataFrame(data=input_text, columns=['title'])
Result['Prediction'] = Prediction
return(Result)
现在,让调用该函数。
movie_name = ["Flores y perlas"]
predicted_genre = genres_test(input_text=movie_name)
predicted_genre
test_data = pd.read_csv('imdb_test.csv')
test_data