朴素贝叶斯做文本分类

In [1]:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

加载查看数据

In [2]:

df = pd.read_csv('/Users/spark/Downloads/Restaurant_Reviews.tsv',sep='\t')

In [3]:

df.head()

Out[3]:

.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }

Review

Liked

0

Wow... Loved this place.

1

1

Crust is not good.

0

2

Not tasty and the texture was just nasty.

0

3

Stopped by during the late May bank holiday of...

1

4

The selection on the menu was great and so wer...

1

In [4]:

df.describe()

Out[4]:

.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }

Liked

count

1000.00000

mean

0.50000

std

0.50025

min

0.00000

25%

0.00000

50%

0.50000

75%

1.00000

max

1.00000

In [5]:

df.dtypes

Out[5]:

Review    object
Liked      int64
dtype: object

初步统计分析

In [6]:

# df['text_length'] = df.Review.map(len)
df['word_length'] = df.Review.map(lambda x:len(x.split(' ')))

In [7]:

df.corr()

Out[7]:

.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }

Liked

word_length

Liked

1.000000

-0.096573

word_length

-0.096573

1.000000

In [8]:

g = sns.FacetGrid(data=df, col='Liked')
g.map(plt.hist, 'word_length', bins=50)

Out[8]:

<seaborn.axisgrid.FacetGrid at 0x10e6e0d30>

In [9]:

sns.boxplot(x='Liked', y='word_length', data=df)

Out[9]:

<matplotlib.axes._subplots.AxesSubplot at 0x1108c8278>

可以看出,是否喜欢和文字长度没有相关性

机器学习处理

编码处理

In [10]:

import nltk
from nltk.corpus import stopwords
nltk.download('stopwords')
from sklearn.feature_extraction.text import CountVectorizer 
[nltk_data] Downloading package stopwords to /Users/spark/nltk_data...
[nltk_data]   Package stopwords is already up-to-date!

In [11]:

import string
def text_process(text):
    '''
    按照下面方式处理字符串
    1. 去除标点符号
    2. 去掉无用词
    3. 返回剩下的词的list
    '''
    nopunc = [char for char in text if char not in string.punctuation]
    nopunc = ''.join(nopunc)
    
    return [word for word in nopunc.split() if word.lower() not in stopwords.words('english')]

In [12]:

X = df.Review
y = df.Liked
bow_transformer = CountVectorizer(analyzer=text_process).fit(X)
X = bow_transformer.transform(X)

训练

In [13]:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=101)
  • naive_bayes:朴素贝叶斯
  • MultinomialNB:假设特征的先验概率为多项式分布

In [14]:

from sklearn.naive_bayes import MultinomialNB
nb = MultinomialNB()
nb.fit(X_train, y_train)

Out[14]:

MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)

In [15]:

preds = nb.predict(X_test)

预测

In [16]:

my_test_review = 'room is  bad'
my_test_review_transformed = bow_transformer.transform([my_test_review])
nb.predict(my_test_review_transformed)[0]

Out[16]:

0

In [17]:

my_test_review = 'room is expensive'
my_test_review_transformed = bow_transformer.transform([my_test_review])
nb.predict(my_test_review_transformed)[0]

Out[17]:

0

In [18]:

my_test_review = 'suprise me'
my_test_review_transformed = bow_transformer.transform([my_test_review])
nb.predict(my_test_review_transformed)[0]

Out[18]:

0

In [19]:

my_test_review = 'amazing'
my_test_review_transformed = bow_transformer.transform([my_test_review])
nb.predict(my_test_review_transformed)[0]

Out[19]:

1

模型评估

准确率在74%

In [20]:

from sklearn.metrics import confusion_matrix, classification_report
print(confusion_matrix(y_test, preds))
print('\n')
print(classification_report(y_test, preds))
[[ 96  54]
 [ 27 123]]


              precision    recall  f1-score   support

           0       0.78      0.64      0.70       150
           1       0.69      0.82      0.75       150

   micro avg       0.73      0.73      0.73       300
   macro avg       0.74      0.73      0.73       300
weighted avg       0.74      0.73      0.73       300

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我是攻城师

理解BitMap算法的原理

位图:一种常用的数据结构,代表了有限域中的稠集(dense set),每一个元素至少出现一次,没有其他的数据和元素相关联。在索引,数据压缩,海量数据处理等方面有...

25430
来自专栏GreenLeaves

TFS2018环境搭建一硬件要求

TFS可以安装在Windows Server和Windows PC操作系统中,但是TFS2018和2018只支持64位操作系统中,早期的版本没有操作系统的位数限...

41130
来自专栏编程坑太多

『高级篇』docker之Mesos集群架构图(23)

12140
来自专栏Python专栏

200行代码,一行行教你自制微信机器人

1) 用一个windows客户端工具运营公众号,真的很局限。虽然工具的功能很强大,能自动添加好友,自动拉好友入群,关键字回复等等,但是有一个绕不开的点,它是一款...

62520
来自专栏大数据文摘

迷人又诡异的辛普森悖论:同一个数据集是如何证明两个完全相反的观点的?

在辛普森悖论中,餐馆可以同时比竞争对手更好或更差,锻炼可以降低和增加疾病的风险,同样的数据集能够用于证明两个完全相反的论点。

15930
来自专栏苦逼的码农

一些常用的算法技巧总结

数组的下标是一个隐含的很有用的数组,特别是在统计一些数字,或者判断一些整型数是否出现过的时候。例如,给你一串字母,让你判断这些字母出现的次数时,我们就可以把这些...

22030
来自专栏smy

一张图解释负载均衡

首先当大量用户访问时候,先请求到nignx服务器,因为nignx对于高并发支持较好,所以由nignx服务器将访问需求分配给不同的apache服务器,apache...

21330
来自专栏数据结构笔记

python基础类型(一):字符串和列表

注意到最后三个的单双引号是嵌套使用的,但是最后一个的使用方法是错误的,因为当我们混合使用两种引号时必须有一种用来划分字符串的边界,即在两边的引号不能出现在字符串...

14020
来自专栏chenssy

多线程:为什么在while循环中加入System.out.println,线程可以停止

这个我们都知道,由于 stopReqested 的更新值在主内存中,而线程栈中的值不是最新的,所以会一直循环,线程并不能停止。加上 Volatile 关键字后,...

21540
来自专栏机器之心

Diss所有深度生成模型,DeepMind说它们真的不知道到底不知道什么

深度学习在应用层面获得了巨大成功,这些实际应用一般都希望利用判别模型构建条件分布 p(y|x),其中 y 是标签、x 是特征。但这些判别模型无法处理从其他分布中...

11710

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励