在当今信息爆炸的时代,文本数据的处理和分析变得尤为重要。特别是在商业领域,通过分析用户评价来获取产品或服务的反馈信息,对于改进和优化具有重要意义。本文将介绍如何使用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))#分类结果。