我是@老K玩代码,专注分享实战项目和最新行业资讯,已累计分享超1000实战项目!
所有的人工智能学习者,都是从一个个简易的分类器开始的实践之路,自然语言处理领域也不例外。虽然有着包括:分词、词性标注、关键词提取、新闻摘要、机器翻译等各种各样的实际应用,但文本分类还是AI自然语言处理的基础。
那么,我们应该如何构建起一个建议的文本分类器呢?老K就带大家来实践一下。
首先,你需要有一个已经标记好分类的文本文件,当然也可以用老K准备的源数据,可以根据文末的方法获取。
然后,开始安装必要的第三方库:pandas、sklearn
pip install pandas
pandas是最常用的数据处理的工具库
pip install -U scikit-learn
sklearn是机器学习的一个常用库
首先,我们把数据通过pandas导入到程序中来,然后对数据进行基础的清洗
import pandas as pd
data = pd.read_csv('data.csv')
data = data.dropna(subset=['fearures'])
data = data[['features', 'targets']]
然后将数据转为array格式,把特征和标签分别提取出来
dataset = data.as_matrix()
features = dataset[:, 0]
targets = dataset[:, 1]
由于不论特征还是标签,都是以文本形式表现的,所以我们首先需要把这些文本转化为计算机能够理解的形式,也就是把文本数字化。
对于特征部分,我们用sklearn自带的词向量化器模型转化一下即可:
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer()
X = tfidf.fit_transform(features)
通过上述代码,就能一步实现文本的分词和向量化;
然后我们对标签部分,用encoder器进行数值化预处理:
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
Y = encoder.fit_transform(targets)
说明一下: 模型中的fit_transform()方法相当于fit()后立刻进行transform(),是后两者的合并,主要起到简化代码的效果。
sklearn有自带的选择器,可以按照设定的参数随机生成训练集和测试集
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.5)
通过上述代码,就可以将特征和标签,按照50%测试集的比例,拆分为训练集和测试集
接下来我们只需要选择一个合适的模型,进行训练就可以了。
这里我们选择的是随机森林模型,参数是默认的。大家也可以根据自己的任务本身,选择各自认为合适的模型。
from sklearn.ensemble import RandomForestClassifier
cls = RandomForestClassifier()
cls.fit(X_train, Y_train)
训练完成后,可以用score()查看模型的准确率,然后进一步调整模型
print(cls.score(X_test, Y_test))
在训练好合适的模型后,我们就可以用这个模型进行预测了。
我们把用来预测的特征文本输入作为sents输入模型。
sents = ["用于预测的语句"]
sents = tfidf.transform(sents)
labers = cls.predict(sents)
值得注意的是,此处输入的sents需要是list格式的数据,而非str。
以上就是实现一个简易的文本分类器的步骤详解,实际的分类器应用,写法也与之大致相同。
由于选择的是默认的模型,所以准确率并不能保证,需要不断改进模型选择和模型参数,才能提高模型的准确率,达到商业应用的水准。
以下是完整代码:
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
# 数据清洗 ====
data = pd.read_csv('data.csv')
data = data.dropna(subset=['context'])
data = data[['features', 'targets']]
dataset = data.as_matrix()
features = dataset[:, 0]
targets = dataset[:, 1]
# 预处理 ====
tfidf = TfidfVectorizer()
X = tfidf.fit_transform(features)
encoder = LabelEncoder()
Y = encoder.fit_transform(targets)
# 抽取训练集 ====
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.5)
# 训练模型 ====
cls = RandomForestClassifier()
cls.fit(X_train, Y_train)
print(cls.score(X_test, Y_test))