利用Python进行文本分类:基于朴素贝叶斯的中文评价分类

在当今信息爆炸的时代,文本数据的处理和分析变得尤为重要。特别是在商业领域,通过分析用户评价来获取产品或服务的反馈信息,对于改进和优化具有重要意义。本文将介绍如何使用Python进行文本分类,特别是基于朴素贝叶斯算法的中文评价分类。

1. 数据读取与处理

首先,我们需要读取包含用户评价的文本文件。这里我们有两个文件:一个是差评文件,另一个是优质评价文件。

import pandas as pd

cp_content = pd.read_table(r"D:\Users\妄生\PycharmProjects\机器学习pythonProject\差评.txt",encoding='gbk')
yzpj_content = pd.read_table(r"D:\Users\妄生\PycharmProjects\机器学习pythonProject\优质评价.txt",encoding='gbk')

2. 使用jieba进行中文分词

中文文本处理的第一步是分词。我们使用jieba库进行分词,它支持三种分词模式:精确模式、全模式和搜索引擎模式。对于本项目,我们使用精确模式。

#A:对差评分词
import jieba
cp_segments = []
contents = cp_content.content.values.tolist() #将content列数据取出并转化为ist格式;目的是分别 jieba.lcut分词
for content in contents:
    results = jieba.lcut(content)
    if len(results) > 1 : #当分词之后,这条评论如果只有1个内容,
        cp_segments.append(results) #将分词后的内容添加到列表segments中

cp_fc_results=pd.DataFrame({'content':cp_segments})
cp_fc_results.to_excel('cp_fc_results.xlsx', index=False)


# B:对优质评价分词
yzpj_segments = []
contents = yzpj_content.content.values.tolist() #将content列数据取出并转化为ist格式。目的是分别 jieba.lcut分词
for content in contents:
    results = jieba.lcut(content)
    if len(results) > 1 :
        yzpj_segments.append(results) #将分词后的内容添加到列表segments中

# #分词结果储存在新的数据框中
yzpj_fc_results=pd.DataFrame({'content':yzpj_segments})
yzpj_fc_results.to_excel('yzpj_fc_results.xlsx',index=False)

3. 移除停用词

为了提高文本分析的质量,我们需要移除停用词。停用词是指在文本中频繁出现但对文本内容没有实质意义的词。

"""把所有的内容都进行jieba ,分词中有一些内容,是无意义。
# 3.移除停用词
# segments_clean:每一篇文章的分词结果#all_words:所有文章总的分词结果
"""
#导入停用词库
stopwords = pd.read_csv(r"D:\Users\妄生\PycharmProjects\机器学习pythonProject\.idea\红楼梦\StopwordsCN.txt",encoding='utf8', engine='python',index_col=False)
#定义去除停用词函数
def drop_stopwords(contents, stopwords):
    segments_clean=[]
    for content in contents:
        line_clean =[]
        for word in content:
            if word in stopwords:
                continue
            line_clean.append(word)
        segments_clean.append(line_clean)
    return segments_clean

# 调用去除停用词函数
contents = cp_fc_results.content.values.tolist() # DataFrame格式转为list格式
stopwords = stopwords.stopword.values.tolist() #停用词转为list格式
cp_fc_contents_clean_s = drop_stopwords(contents, stopwords)

contents = yzpj_fc_results.content.values.tolist() # DataFrame格式转为list格式
yzpj_fc_contents_clean_s = drop_stopwords(contents, stopwords)

4. 朴素贝叶斯分类

4.1 给每个数据添加数字标签

我们将差评标记为1,优质评价标记为0。

'''4.1 给每个数据添加数字标签'''
cp_train=pd.DataFrame({'segments_clean':cp_fc_contents_clean_s,'label':1})
yzpj_train=pd.DataFrame({'segments_clean':yzpj_fc_contents_clean_s,  'label':0})
pj_train = pd.concat([cp_train,yzpj_train])
pj_train.to_excel('pj train.xlsx',index=False)
#数据分析,经常和excel,pandas, sql,中石化,04 excel,openpyxl办公自动化 审计,审计财务,全部excel,

4.2 数据切分

我们将数据集分为训练集和测试集。

'''4.2 数据切分 :训练集特征、测试集特征、训练集标签、测试集标签'''
from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test, = \
                train_test_split(pj_train['segments_clean'].values,
                          pj_train['label'].values, random_state=0)

4.3 将所有的词转换为词向量

使用CountVectorizer将文本数据转换为词向量。

words = []   #转换为词向量CountVectorizer所能识别的列表类型
for line_index in range(len(x_train)):
    words.append(' '.join(x_train[line_index]))
print(words)

#、是入词向量转化库
from sklearn.feature_extraction.text import CountVectorizer

vec = CountVectorizer(max_features=4000,lowercase = False, ngram_range=(1,3))
#lowercase参数的功能:把所有的词是是否需要转换为小写。False。
#max_features:表示只提取前4000个词作为词库。
vec.fit(words)#传入训练集的所有文字,根据文字构建模型,要将训练集 的所有单词作为词库,一会还有测试集的文本,

4.4 导入朴素贝叶斯分类器

使用MultinomialNB进行分类。

from sklearn.naive_bayes import MultinomialNB,ComplementNB
classifier =  MultinomialNB(alpha = 0.1)
classifier.fit(vec.transform(words),y_train)

train_pr = classifier.predict(vec.transform(words))

4.5 训练集和测试集数据预测

#训练集数据预测得分
from sklearn import metrics

print(metrics.classification_report(y_train, train_pr))
#测试集数据进行分析
test_words = []
for line_index in range(len(x_test)):
    test_words.append(' '.join(x_test[line_index]))

test_pr = classifier.predict(vec.transform(test_words))
#测试集数据预测得分
print(metrics.classification_report(y_test,test_pr))#分类结果。

5.运行结果

6.结论

通过上述步骤,我们成功地使用Python进行了中文评价的分类。这种方法不仅可以应用于用户评价的分析,还可以扩展到其他文本分类任务中。朴素贝叶斯分类器因其简单和高效,在许多实际应用中表现出色。

完整代码

'''
1.数据读取与处理
'''
import pandas as pd

cp_content = pd.read_table(r"D:\Users\妄生\PycharmProjects\机器学习pythonProject\差评.txt",encoding='gbk')
yzpj_content = pd.read_table(r"D:\Users\妄生\PycharmProjects\机器学习pythonProject\优质评价.txt",encoding='gbk')


"""
2.使用jieba分词jieba.lcut() 和jieba.cut()
"""
#A:对差评分词
import jieba
cp_segments = []
contents = cp_content.content.values.tolist() #将content列数据取出并转化为ist格式;目的是分别 jieba.lcut分词
for content in contents:
    results = jieba.lcut(content)
    if len(results) > 1 : #当分词之后,这条评论如果只有1个内容,
        cp_segments.append(results) #将分词后的内容添加到列表segments中

cp_fc_results=pd.DataFrame({'content':cp_segments})
cp_fc_results.to_excel('cp_fc_results.xlsx', index=False)


# B:对优质评价分词
yzpj_segments = []
contents = yzpj_content.content.values.tolist() #将content列数据取出并转化为ist格式。目的是分别 jieba.lcut分词
for content in contents:
    results = jieba.lcut(content)
    if len(results) > 1 :
        yzpj_segments.append(results) #将分词后的内容添加到列表segments中

# #分词结果储存在新的数据框中
yzpj_fc_results=pd.DataFrame({'content':yzpj_segments})
yzpj_fc_results.to_excel('yzpj_fc_results.xlsx',index=False)



"""把所有的内容都进行jieba ,分词中有一些内容,是无意义。
# 3.移除停用词
# segments_clean:每一篇文章的分词结果#all_words:所有文章总的分词结果
"""
#导入停用词库
stopwords = pd.read_csv(r"D:\Users\妄生\PycharmProjects\机器学习pythonProject\.idea\红楼梦\StopwordsCN.txt",encoding='utf8', engine='python',index_col=False)
#定义去除停用词函数
def drop_stopwords(contents, stopwords):
    segments_clean=[]
    for content in contents:
        line_clean =[]
        for word in content:
            if word in stopwords:
                continue
            line_clean.append(word)
        segments_clean.append(line_clean)
    return segments_clean

# 调用去除停用词函数
contents = cp_fc_results.content.values.tolist() # DataFrame格式转为list格式
stopwords = stopwords.stopword.values.tolist() #停用词转为list格式
cp_fc_contents_clean_s = drop_stopwords(contents, stopwords)

contents = yzpj_fc_results.content.values.tolist()
yzpj_fc_contents_clean_s = drop_stopwords(contents, stopwords)


"""
4.朴素贝叶斯分类
"""

'''4.1 给每个数据添加数字标签'''
cp_train=pd.DataFrame({'segments_clean':cp_fc_contents_clean_s,'label':1})
yzpj_train=pd.DataFrame({'segments_clean':yzpj_fc_contents_clean_s,  'label':0})
pj_train = pd.concat([cp_train,yzpj_train])
pj_train.to_excel('pj train.xlsx',index=False)
#数据分析,经常和excel,pandas, sql,中石化,04 excel,openpyxl办公自动化 审计,审计财务,全部excel,

'''4.2 数据切分 :训练集特征、测试集特征、训练集标签、测试集标签'''
from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test, = \
                train_test_split(pj_train['segments_clean'].values,
                          pj_train['label'].values, random_state=0)

#"""4.2 将所有的词转换为词向量"""
words = []   #转换为词向量CountVectorizer所能识别的列表类型
for line_index in range(len(x_train)):
    words.append(' '.join(x_train[line_index]))
print(words)

#、是入词向量转化库
from sklearn.feature_extraction.text import CountVectorizer

vec = CountVectorizer(max_features=4000,lowercase = False, ngram_range=(1,3))
#lowercase参数的功能:把所有的词是是否需要转换为小写。False。
#max_features:表示只提取前4000个词作为词库。
vec.fit(words)#传入训练集的所有文字,根据文字构建模型,要将训练集 的所有单词作为词库,一会还有测试集的文本,

#'''4.3 导入朴素贝叶斯分类器'''
from sklearn.naive_bayes import MultinomialNB,ComplementNB
classifier =  MultinomialNB(alpha = 0.1)
classifier.fit(vec.transform(words),y_train)

train_pr = classifier.predict(vec.transform(words))

#训练集数据预测得分
from sklearn import metrics

print(metrics.classification_report(y_train, train_pr))
#测试集数据进行分析
test_words = []
for line_index in range(len(x_test)):
    test_words.append(' '.join(x_test[line_index]))

test_pr = classifier.predict(vec.transform(test_words))
#测试集数据预测得分
print(metrics.classification_report(y_test,test_pr))#分类结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值