教你如何从0-1使用机器学习利器Sklearn实现文本分类企业级案例

1,322 阅读3分钟

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第4篇文章,点击查看活动详情

前言

想象一下,您可以了解互联网上人们的心情。也许你对它的全部不感兴趣,但前提是人们今天在你最喜欢的社交媒体平台上感到高兴。在本教程之后,您将具备执行此操作的能力。在此过程中,您将了解(深度)神经网络的当前进展以及如何将它们应用于文本。

用机器学习从文本中读取情绪被称为情感分析,它是文本分类中的突出用例之一。这属于自然语言处理(NLP)这个非常活跃的研究领域。文本分类的其他常见用例包括垃圾邮件检测客户查询的自动标记以及将文本分类为已定义的主题。那么你怎么能做到这一点呢?这里我们会讲到使用词袋模型去实现,那什么叫做词袋模型呢,如下图所示:

cidai.jpeg

正文

选择数据集

在开始之前,我们先来看看我们有哪些数据。继续从 UCI 机器学习存储库的Sentiment Labeled Sentences 数据集中下载数据集。

顺便说一句,当您想尝试一些算法时,这个存储库是机器学习数据集的绝佳来源。该数据集包括来自 IMDb、Amazon 和 Yelp 的标签评论。每条评论都标记为 0 分表示负面情绪或 1 分表示正面情绪。

加载数据集

这里我们使用pandas工具去读取数据,然后对数据进行一次合并操作,pd.concat(df_list),注意这个是列式合并,即数据行增加。

import pandas as pd

filepath_dict = {'yelp':   'data/sentiment_analysis/yelp_labelled.txt',
                 'amazon': 'data/sentiment_analysis/amazon_cells_labelled.txt',
                 'imdb':   'data/sentiment_analysis/imdb_labelled.txt'}

df_list = []
for source, filepath in filepath_dict.items():
    df = pd.read_csv(filepath, names=['sentence', 'label'], sep='t')
    df['source'] = source  # Add another column filled with the source name
    df_list.append(df)

df = pd.concat(df_list)
print(df.iloc[0])
文本转特征数据 CountVectorizer

特征提取,这里使用的是词向量转换,sklearn是带有这个方法,因此使用起来也十分方便。

sentences = ['John likes ice cream', 'John hates chocolate.']
from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer(min_df=0, lowercase=False)
vectorizer.fit(sentences)
print(vectorizer.vocabulary_)
print(vectorizer.transform(sentences).toarray())
数据集切分 train_test_split

数据集切分这里和其他的数据集切分一样,直接使用train_test_split api即可,这里不再赘述。

from sklearn.model_selection import train_test_split

df_yelp = df[df['source'] == 'yelp']

sentences = df_yelp['sentence'].values
y = df_yelp['label'].values

sentences_train, sentences_test, y_train, y_test = train_test_split(sentences, y, test_size=0.25, random_state=1000)
基于词袋模型分类

分类使用的方法是逻辑回归算法,逻辑回归是一个分类任务,也是一个十分经典的算法,因此是十分合适的。

from sklearn.linear_model import LogisticRegression

classifier = LogisticRegression()
classifier.fit(X_train, y_train)
score = classifier.score(X_test, y_test)

print("Accuracy:", score)


for source in df['source'].unique():
    df_source = df[df['source'] == source]
    sentences = df_source['sentence'].values
    y = df_source['label'].values

    sentences_train, sentences_test, y_train, y_test = train_test_split(
        sentences, y, test_size=0.25, random_state=1000)

    vectorizer = CountVectorizer()
    vectorizer.fit(sentences_train)
    X_train = vectorizer.transform(sentences_train)
    X_test = vectorizer.transform(sentences_test)

    classifier = LogisticRegression()
    classifier.fit(X_train, y_train)
    score = classifier.score(X_test, y_test)
    print('Accuracy for {} data: {:.4f}'.format(source, score))

好啦,这样就可以了。赶紧试试吧!

总结

词袋模型是比较经典的一个机器学习模型,之所以叫做词袋,是因为它只在乎词是否出现过,不关心这些词在文章中的顺序和结构,因此它在对具有相似内容的判别具有很强的判别性,另外,逻辑回归也是一个相当成熟和优秀的分类算法,因此使用它做分类任务在企业中也很适用。