1. 文本分类介绍
文本分类是自然语言处理中的一个重要任务,其目的是将一段文本分为某一个或者多个预定义类别之中。文本分类在信息检索、垃圾邮件过滤、情感分析等领域都有着广泛的应用。在本文中,我们将针对python文本分类做一些介绍。
2. 数据集概述
2.1 数据集来源
本文将使用的数据集是IMDb数据集,该数据集包含50000条影评数据,其中25000条为训练数据,25000条为测试数据。
2.2 数据集格式
IMDb数据集中每条数据包含一段文本和相应的情感标签,其中情感标签又分为positive和negative两类。
pos/cv000_29590.txt
Positive
pos/cv001_18431.txt
Positive
pos/cv002_15918.txt
Positive
...
neg/cv000_29416.txt
Negative
neg/cv001_19502.txt
Negative
neg/cv002_17424.txt
Negative
...
3. 环境搭建
在进行文本分类前,我们需要先搭建Python开发环境。这里我们推荐使用anaconda作为python开发环境,因为它支持不同操作系统,包含丰富的数据科学工具和库。
首先需要安装anaconda,可以到官网下载。安装完毕后,打开Anaconda Prompt输入以下命令来安装所需的库:
conda install keras tensorflow scikit-learn matplotlib jupyter
4. 数据预处理
4.1 数据集读取
我们可以用Python中的pandas库读取数据集:
import pandas as pd
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
4.2 自然语言处理
自然语言处理(NLP)是一门研究计算机与人类语言之间的交互的学科。 在对文本实施自然语言处理之前,我们需要对文本进行一些必要的处理,包括标记化、停用词去除、词干提取等。
4.2.1 标记化
将句子分为一个个独立的词语,这个过程叫做标记化(Tokenization)。我们可以使用NLTK库中的tokenize模块来对文本进行标记化。
import nltk
# 下载停用词和词干提取器
nltk.download('stopwords')
nltk.download('wordnet')
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer
# wordnetlemmatizer需要建立词性映射进行lemmatization
lemma = WordNetLemmatizer()
word2pos = {
'J': wordnet.ADJ,
'V': wordnet.VERB,
'N': wordnet.NOUN,
'R': wordnet.ADV
}
def text_preprocessing(text_df):
# 将文本转为小写
text_df['text'] = text_df['text'].apply(lambda x: x.lower())
# 将文本分解为独立词语
text_df['text'] = text_df['text'].apply(nltk.word_tokenize)
# 去除停用词和非字母的字符
stop_words = set(stopwords.words('english'))
non_alpha = re.compile('[^a-zA-Z]')
text_df['text'] = text_df['text'].apply(lambda x: [lemma.lemmatize(word, word2pos.get(tag[0], wordnet.NOUN)) for word, tag in nltk.pos_tag([word for word in x if word not in stop_words and not non_alpha.search(word)])])
return text_df
train = text_preprocessing(train)
test = text_preprocessing(test)
4.2.2 停用词去除
停用词是指在文本中出现频率很高,但对我们的文本分类决策没有帮助的一些词语,我们可以使用NLTK库中自带的停用词表进行去除。
stop_words = set(stopwords.words('english'))
text_without_stop_words = [word for word in text if word not in stop_words]
4.2.3 词干提取
词干提取是指将词语还原为其基础形式,例如把running、ran、runned都还原为run。可以使用nltk库中的WordNetLemmatizer实现词干提取。
from nltk.stem import WordNetLemmatizer
from nltk.corpus import wordnet
lemma = WordNetLemmatizer()
def lemmatization(text):
# 建立词性映射
word2pos = {
'J': wordnet.ADJ,
'V': wordnet.VERB,
'N': wordnet.NOUN,
'R': wordnet.ADV
}
# 词干提取
text = [lemma.lemmatize(word, word2pos.get(tag[0], wordnet.NOUN)) for word, tag in nltk.pos_tag(text)]
return text
5. 特征提取
特征提取(或者叫向量化)是将文本转化为数值型向量的过程,这是进行文本分类的必要步骤。在本文中,我们介绍两种特征提取方法:Word2vec和TF-IDF。
5.1 Word2vec
Word2vec是一种词向量的表示方法,它通过构建“上下文-词”二元组建立词语与向量之间的联系。Word2vec产生的词向量能够很好地表达单词之间的语义关系,例如国王-女王、男-女等。我们可以使用gensim库训练Word2vec。
from gensim.models import Word2Vec
# 定义Word2vec模型
model = Word2Vec(sentences=train['text'],
size=100,
window=5,
min_count=1,
workers=4)
# 获得样本数据中所有词向量的平均值
def get_vectors(words, model, num_features):
feature_vec = np.zeros((num_features,), dtype="float32")
n_words = 0
for word in words:
if word in model:
n_words += 1
feature_vec = np.add(feature_vec, model[word])
if (n_words > 0):
feature_vec = np.divide(feature_vec, n_words)
return feature_vec
train['text_vectors'] = train['text'].apply(lambda x: get_vectors(x, model, 100))
test['text_vectors'] = test['text'].apply(lambda x: get_vectors(x, model, 100))
5.2 TF-IDF
TF-IDF是一种衡量词语对于文本的重要性的算法,它通过计算词语在文本中的出现频率和在整个文本集中的出现频率来计算一个词语的权重值。scikit-learn库提供了TF-IDF算法的实现。
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(stop_words='english')
train_vectors = tfidf.fit_transform(train['text'])
test_vectors = tfidf.transform(test['text'])
6. 模型训练和评估
在文本分类中,我们可以使用各种各样的机器学习算法进行分类,例如逻辑回归、支持向量机(SVM)、朴素贝叶斯等。在本文中,我们将使用朴素贝叶斯算法进行分类。scikit-learn库提供了种类丰富的机器学习算法的实现,可以使用方便的API进行训练和评估。
6.1 朴素贝叶斯模型
朴素贝叶斯方法是一种基于贝叶斯定理与特征条件独立假设的分类方法,它在文本分类等领域拥有广泛的应用。
from sklearn.naive_bayes import MultinomialNB
nb = MultinomialNB()
nb.fit(train_vectors, train['label'])
train_pred = nb.predict(train_vectors)
test_pred = nb.predict(test_vectors)
6.2 模型评估
可以使用多种指标来评估分类器的性能,例如准确率、精确率、召回率等。下面是本文中使用的评价指标。
6.2.1 准确率
准确率是指预测正确的样本数占样本总数的比例。
from sklearn.metrics import accuracy_score
train_acc = accuracy_score(train['label'], train_pred)
test_acc = accuracy_score(test['label'], test_pred)
6.2.2 精确率和召回率
精确率是指真正例占所有预测为正例的样本的比例,召回率是指真正例占所有真实为正例的样本的比例。
from sklearn.metrics import precision_recall_fscore_support
train_p, train_r, _, _ = precision_recall_fscore_support(train['label'], train_pred, average='binary')
test_p, test_r, _, _ = precision_recall_fscore_support(test['label'], test_pred, average='binary')
7. 结论
在本文中,我们介绍了文本分类的定义、环境配置、数据预处理、特征提取、模型训练和评估等主要步骤。我们使用IMDb数据集进行朴素贝叶斯模型的训练和评估,取得了较高的分类准确率、精确率和召回率。以上相关代码可以在此GitHub仓库中找到。