python实现中文文本分类(三)贝叶斯分类器

中文文本分类的步骤:
1.预处理:去除文本的噪声信息,例如HTML标签、文本格式转换、检测句子边界等。
2.中文分词:使用中文分词器为文本分词,并去除停用词。
3.构建词向量空间:统计文本词频,生成文本的词向量空间。
4.权重策略——TF-IDF方法:使用TF-IDF发现特征词,并抽取为反映文档主题的特征。
5.分类器:使用算法训练分类器。
6.评价分类结果:分类器的测试结果分析。

本文选择朴素贝叶斯算法进行文本分类,测试集随机抽取自文档集合,每个分类取10个文档,过滤掉1kb以下的文档。

先建立测试集的向量空间模型。

1.构建测试集的Bunch对象

# 1.构建测试集的Bunch对象
wordbag_path = "./data/test_word_bag/test_set.dat"  # 分词语料Bunch对象持久化文件路径
seg_path = "./data/jieba/"  # 分词后分类语料库路径
catelist = os.listdir(seg_path)
bunch = Bunch(target_name=[], label=[], filenames=[], contents=[])
bunch.target_name.extend(catelist)  # 将类别信息保存到Bunch对象中
for dir in catelist:
   count = 0
   class_path = seg_path + dir + "/"
   file_list = os.listdir(class_path)
   for file_path in file_list:
       count += 1
       fullname = class_path + file_path
       bunch.label.append(dir)  # 保存当前文件的分类标签
       bunch.filenames.append(fullname)  # 保存当前文件的文件路径
       bunch.contents.append(readfile(fullname).strip())  # 保存文件词向量
       if count >= 10:
           break
# Bunch对象持久化
# 将数据以对象的形式保存,python提供了pickle模块支持对象的读写
file_obj = open(wordbag_path, 'wb')
pickle.dump(bunch, file_obj)
file_obj.close()
print("构建文本对象结束")

2.构建测试集的词袋

# 读取停用词表
stopword_path = "./data/hlt_stop_words.txt"
stpwrdlst = readfile(stopword_path).splitlines()
# 导入分词后的词向量Bunch对象
path = "./data/test_word_bag/test_set.dat"
bunch = readbunchobj(path)
# 构建测试集TF-IDF向量空间
testspace = Bunch(target_name=bunch.target_name, label=bunch.label, filenames=bunch.filenames, tdm=[],
                  vocabulary={})
# 导入训练集的词袋,将测试集产生的词向量映射到训练集词袋的词典中,生成向量空间模型。
trainbunch = readbunchobj("./data/train_word_bag/tfidfspace.dat")
# 使用TfidfVectorizer初始化向量空间模型
vectorize = TfidfVectorizer(stop_words=stpwrdlst, sublinear_tf=True, max_df=0.5, vocabulary=trainbunch.vocabulary)
transformer = TfidfTransformer()
testspace.tdm = vectorize.fit_transform(bunch.contents)
testspace.vocabulary = vectorize.vocabulary_
# 创建词袋的持久化
space_path = "./data/test_word_bag/testspace.dat"
writebunchobj(space_path, testspace)

3.执行贝叶斯算法进行测试文本分类

from sklearn.naive_bayes import MultinomialNB
# 导入训练集向量空间
trainpath = './data/train_word_bag/tfidfspace.dat'
train_set = readbunchobj(trainpath)
# 导入测试集向量空间
testpath = './data/test_word_bag/testspace.dat'
test_set = readbunchobj(testpath)
# 应用朴素贝叶斯算法
# alpha越小,迭代次数越多,精度越高
clf = MultinomialNB(alpha=0.001).fit(train_set.tdm, train_set.label)
# 预测分类结果
predicted = clf.predict(test_set.tdm)
total = len(predicted)
rate = 0
for flabel, file_name, expect_cate in zip(test_set.label, test_set.filenames, predicted):
    if flabel != expect_cate:
        rate += 1
        print(file_name, "实际类别:", flabel, "-->预测类别:", expect_cate)
print("error rate:", float(rate) * 100 / float(total), "%")

常用评估指标:
召回率R:检索出的相关文档数和文档库中所有的相关文档数的比率,衡量的是检索系统的查全率。
准确率P:系统检索到的相关文件/系统所有检索到的文件总数。
F-score: F β = ( β 2 + 1 ) P R β 2 P + R F_{\beta } =\frac{\left ( \beta ^{2} +1 \right )PR }{\beta ^{2}P+R } Fβ=β2P+R(β2+1)PR
β = 1 \beta=1 β=1时,就是F1-score。
average参数定义了该指标的计算方法,二分类时average参数默认是binary;多分类时,可选参数有micro、macro、weighted和samples。

from sklearn import metrics
def metrics_result(actual, predict):
    print("精度:{0:.3f}".format(metrics.precision_score(actual, predict,average='micro')))
    print("召回:{0:.3f}".format(metrics.recall_score(actual, predict,average='micro')))
    print("f1-score:{0:.3f}".format(metrics.f1_score(actual, predict,average='micro')))

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
本套大数据热门技术Spark+机学习+贝叶斯算法系列课程,历经5年沉淀,调研企业上百家,通过上万学员汇总,保留较为完整的知识体系的同时,让每个模块看起来小而精,碎而不散。在本课程中基于大量案例实战,深度剖析和讲解Spark2.4原理和新特性,且会包含完全从企业真实业务需求中抽取出的案例实战。内容涵盖Spark核心编程、Spark SQL和Spark Streaming、Spark内核以及源码剖析、推荐系统、Kafka消费机制、Spark机学习、朴素贝叶斯算法、企业级实战案例等。通过理论和实际的紧密结合,可以使学员对大数据Spark技术栈有充分的认识和理解,在项目实战中对Spark和流式处理应用的场景、以及大数据开发有更深刻的认识;并且通过对流处理原理的学习和与批处理架构的对比,可以对大数据处理架构有更全面的了解,为日后成长为架构师打下基础。本套教程可以让学员熟练掌握Spark技术栈,提升自己的职场竞争力,实现更好的升职或者跳槽,或者从J2EE等传统软件开发工程师转型为Spark大数据开发工程师,或是对于正在从事Hadoop大数据开发的朋友可以拓宽自己的技术能力栈,提升自己的价值。Spark应用场景Yahoo将Spark用在Audience Expansion中的应用,进行点击预测和即席查询等。淘宝技术团队使用了Spark来解决多次迭代的机学习算法、高计算复杂度的算法等。应用于内容推荐、社区发现等。腾讯大数据精准推荐借助Spark快速迭代的优势,实现了在“数据实时采集、算法实时训练、系统实时预测”的全流程实时并行高维算法,最终成功应用于广点通pCTR投放系统上。优酷土豆将Spark应用于视频推荐(图计算)、广告业务,主要实现学习、图计算等迭代计算。本套大数据热门技术Spark+机学习+贝叶斯算法共计13季,本套为第11季。
可以使用`sklearn`中的`CountVectorizer`和`MultinomialNB`来实现中文文本分类。 首先,需要将文本数据转换成向量形式,可以使用`CountVectorizer`来实现。`CountVectorizer`会统计每个词在所有文本中出现的频率,并将其转换成一个向量。具体代码如下: ```python from sklearn.feature_extraction.text import CountVectorizer # 读取文本数据 with open('data.txt', 'r', encoding='utf-8') as f: data = f.readlines() # 创建CountVectorizer对象,用于转换文本数据 vectorizer = CountVectorizer() # 将文本数据转换成向量形式 X = vectorizer.fit_transform(data) ``` 接着,使用`MultinomialNB`来训练分类模型。`MultinomialNB`是朴素贝叶斯分类的一种,适用于离散型特征的分类问题。具体代码如下: ```python from sklearn.naive_bayes import MultinomialNB # 读取标签数据 with open('labels.txt', 'r', encoding='utf-8') as f: labels = f.readlines() # 创建MultinomialNB对象,用于训练分类模型 clf = MultinomialNB() # 训练分类模型 clf.fit(X, labels) ``` 最后,使用训练好的模型对新的文本进行分类。具体代码如下: ```python # 读取测试数据 with open('test.txt', 'r', encoding='utf-8') as f: test_data = f.readlines() # 将测试数据转换成向量形式 X_test = vectorizer.transform(test_data) # 对测试数据进行分类 y_pred = clf.predict(X_test) ``` 其中,`test.txt`是新的待分类文本数据,`y_pred`为预测结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值