1. 前言
现在的时代,大数据已经成为世界发展的主流和方向。而如何将海量数据变成有利的信息,便成为了各大企业所追求的目标。而文本分类技术是其中的重要一环。在Python中,也有着强大的文本分类库——Scikit-Learn,它可以快速、高效地实现文本分类任务,让我们能够更好地处理文本数据。
2. 文本分类介绍
文本分类是指根据文本的内容将其划分到不同的预定义类别中去,是一种典型的监督学习任务。它通常包括以下过程:
2.1 数据预处理
数据预处理是指将原始文本数据转换为机器可以处理的数字数据的过程。
在这个阶段,我们通常需要对文本进行分词、去除停用词、转化为向量等处理。
# 下载nltk中英文停用词和punkt分词器
import nltk
nltk.download('stopwords')
nltk.download('punkt')
# 导入需要的库
import string
import re
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
# 加载数据
def read_data(filename):
with open(filename, 'r', encoding='utf-8') as f:
data = f.read()
return data
# 进行数据清洗
def data_clean(data):
data = re.sub(r'\d+', '', data) # 去除数字
data = data.translate(str.maketrans('', '', string.punctuation)) # 去除标点符号
data = data.strip() # 去除空格、制表符、换行符
return data
# 分词
def tokenize(data):
tokens = word_tokenize(data)
return tokens
# 去除停用词
def remove_stopwords(tokens):
stop_words = set(stopwords.words('english')) # 加载英文停用词
words = [w for w in tokens if not w in stop_words]
return words
# 转化为向量
def get_feature(words):
features = {}
for w in words:
features[w] = features.get(w, 0) + 1
return features
# 完整数据清洗过程
def data_process(filename):
data = read_data(filename)
data = data_clean(data)
tokens = tokenize(data)
words = remove_stopwords(tokens)
features = get_feature(words)
return features
filename = 'data.txt'
data_process(filename)
2.2 特征提取
特征提取是将预处理后的文本转化为一个向量的过程,是文本分类中非常重要的一个步骤。
在特征提取中,我们通常需要选择TF-IDF、Word2Vec等特征提取方法。
from sklearn.feature_extraction.text import TfidfVectorizer
def tf_idf(features):
vectorizer = TfidfVectorizer(max_df=0.8, max_features=2000) # 只考虑最大频率的单词,只允许一半的单词出现
vectors = vectorizer.fit_transform(features)
return vectors.toarray(), vectorizer.get_feature_names()
# 完整特征提取过程
def feature_extraction():
features = []
labels = []
# 加载训练数据
for line in open('train.data', 'r', encoding='utf-8'):
label, data = line.strip().split('\t')
features.append(data)
labels.append(label)
# 将特征转化为向量
vectors, feature_names = tf_idf(features)
return vectors, feature_names, labels
feature_extraction()
2.3 建模与训练
在得到特征向量后,我们就可以使用机器学习算法来建模和训练了。
在文本分类中,常用的机器学习算法有:朴素贝叶斯、支持向量机、逻辑回归等。
from sklearn.naive_bayes import MultinomialNB
def train_model(vectors, labels):
model = MultinomialNB(alpha=0.1) # alpha为平滑参数
model.fit(vectors, labels)
return model
# 完整训练过程
def train():
vectors, feature_names, labels = feature_extraction()
model = train_model(vectors, labels)
return model
train()
2.4 模型评估
为了判断模型好坏,我们需要从准确率、召回率、F1值等多个角度进行评估。
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
def evaluate(val_data, model):
val_labels = []
val_features = []
for line in val_data:
label, feature = line.strip().split('\t')
val_labels.append(label)
val_features.append(feature)
# 转化为向量
vectors = vectorizer.transform(val_features)
# 预测结果
pred_labels = model.predict(vectors)
# 输出评估结果
accuracy = accuracy_score(val_labels, pred_labels)
confusion = confusion_matrix(val_labels, pred_labels)
report = classification_report(val_labels, pred_labels)
return accuracy, confusion, report
# 完整评估过程
def evaluate(model):
val_data = open('test.data', 'r', encoding='utf-8')
accuracy, confusion, report = evaluate(val_data, model)
return accuracy, confusion, report
model = train()
evaluate(model)
3. 实例:使用Scikit-Learn进行文本分类
现在我们可以用Python中的Scikit-Learn库来实现一个简单的中英文文本分类实例。
3.1 加载数据
我们先从文件中读取原始数据,并将其划分为训练集和测试集。
import os
import random
def load_data(dir_path):
data = []
for label in os.listdir(dir_path):
sub_dir = os.path.join(dir_path, label)
if os.path.isdir(sub_dir):
files = os.listdir(sub_dir)
for file in files:
path = os.path.join(sub_dir, file)
if not os.path.isdir(path):
with open (path, 'r', encoding='utf-8') as f:
content = f.read()
data.append((label, content))
random.shuffle(data)
return data
# 将数据划分为训练集和测试集
def split_data(dataset, ratio):
train_size = int(len(dataset) * ratio)
train_data = dataset[:train_size]
test_data = dataset[train_size:]
return train_data, test_data
dir_path = 'data'
dataset = load_data(dir_path)
train_data, test_data = split_data(dataset, 0.8)
3.2 数据预处理与特征提取
在数据预处理中,我们将使用中英文停用词去除、分词等方法;在特征提取中,我们将使用TF-IDF对训练集和测试集中的文本进行特征提取。
# 加载中英文停用词
stopwords_path = 'stopwords'
stopwords = []
for filename in os.listdir(stopwords_path):
stopwords_file = os.path.join(stopwords_path, filename)
with open(stopwords_file, 'r', encoding='utf-8') as f:
words = f.read().strip().split('\n')
stopwords += words
# 分词并去除停用词
def preprocess(text, stopwords):
text = text.lower() # 转为小写格式
words = re.findall(r'\w+', text) # 找到单词
words = [w for w in words if not w in stopwords] # 去除停用词
return words
# 将数据处理为model.fit需要的格式
def build_corpus(data, stopwords):
corpus = []
labels = []
for label, content in data:
words = preprocess(content, stopwords)
if words:
corpus.append(' '.join(words))
labels.append(label)
return corpus, labels
train_corpus, train_labels = build_corpus(train_data, stopwords)
test_corpus, test_labels = build_corpus(test_data, stopwords)
# TF-IDF向量化
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(max_features=5000)
train_vectors = vectorizer.fit_transform(train_corpus).toarray()
test_vectors = vectorizer.transform(test_corpus).toarray()
3.3 建模与训练
在得到训练集和测试集的特征向量后,我们可以选择支持向量机、随机森林、朴素贝叶斯等算法进行分类。
# 朴素贝叶斯分类
from sklearn.naive_bayes import MultinomialNB
model = MultinomialNB()
model.fit(train_vectors, train_labels)
3.4 模型评估
我们对训练后的模型进行评估,并查看模型在测试集上的表现。
# 模型评估
from sklearn.metrics import accuracy_score
train_pred = model.predict(train_vectors)
test_pred = model.predict(test_vectors)
train_acc = accuracy_score(train_labels, train_pred)
test_acc = accuracy_score(test_labels, test_pred)
print("训练集准确率: {:.2f}%".format(train_acc * 100))
print("测试集准确率: {:.2f}%".format(test_acc * 100))
4. 结论
在本文中,我们介绍了文本分类的基本概念,讨论了文本分类中常用的数据预处理、特征提取、建模、训练和评估等过程,并使用Scikit-Learn对中英文文本进行了分类实例。
文本分类在信息检索、情感分析、垃圾邮件过滤等领域都有着广泛的应用,相信读者通过本文,已经能够对文本分类的实现方法有一个清晰的认识了。接下来,读者可以自行实现更加复杂的文本分类任务,将其应用于更多的领域。