NLP贝叶斯分类器实例详解

67 篇文章 11 订阅
28 篇文章 13 订阅

数据来源为爬虫抓取的天涯论坛数据,使用的分类器为伯努利贝叶斯分类器。(一下代码都复制到一个py文件修改路径后可直接运行)

数据为旅游和宾馆两个文件夹,每个文件夹里包含一百个左右的数据文件,文件格式为txt

首先引入相关的包

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.naive_bayes import BernoulliNB
import jieba
import os

首先对文件进行处理(本过程略,本次用的数据其实已经符合要求了,如果大家进行处理的数据有问题,可以预处理下)

针对训练数据的格式,我们首先要读取文件并进行分词操作

本次训练数据已经说了是文件夹形式的,每个文件夹内含100个左右的txt文件,所有我们要批量处理

逻辑为:遍历文件夹内所有文件-》遍历过程读取每个txt文件并进行分词处理

(若自己训练的数据是一个文件,并且标签都已经按个规律给好了,那就直接更舒服了)

读取文件夹+赋classtag+合并为一个字符串:

#读取所有文件内容
#因为一个文件夹的标签是一样的,所有把标签当成一个参数,对该文件夹下的所有txt文件都赋该classtag
def load_alltxt(path, classtag):
    allfiles = os.listdir(path)
    allclasstags = []
    processed_textset = []

    for thisfile in allfiles:
        path_name = path + "/" + thisfile
        processed_textset.append(load_txt(path_name))
        allclasstags.append(classtag)
    return processed_textset, allclasstags

读取每个txt:

#读取文件的内容并进行分词
def load_txt(path):
    #= ""是为了确定数据类型
    text = ""
    textfile = open(path, "r", encoding="utf8").read()
    #运用jieba分词进行切割
    textcut = jieba.cut(textfile)
    for word in textcut:
        text += word + " "
    return text

将两个文件夹内容合并:

textdata1, class1 = load_alltxt("/Users/ren/PycharmProjects/人工智能/NLP1/datas/hotel", "hotel")
textdata2, class2 = load_alltxt("/Users/ren/PycharmProjects/人工智能/NLP1/datas/travel", "travel")
train_data = textdata1 + textdata2
classtags_list = class1 + class2

使用贝叶斯分类器进行训练

#CountVectorizer是属于常见的特征数值计算类,是一个文本特征提取方法。对于每一个训练文本,它只考虑每种词汇在该训练文本中出现的频率。
#CountVectorizer会将文本中的词语转换为词频矩阵,它通过fit_transform函数计算各个词语出现的次数。
count_vector = CountVectorizer()
#CountVectorizer是通过fit_transform函数将文本中的词语转换为词频矩阵
vector_matrix = count_vector.fit_transform(train_data)
#TfidfTransformer用于统计vectorizer中每个词语的TF-IDF值。
train_tfidf = TfidfTransformer(use_idf=True).fit_transform(vector_matrix)
#分类器朴素贝叶斯,除了MultinomialNB之外,还有GaussianNB就是先验为高斯分布的朴素贝叶斯,BernoulliNB就是先验为伯努利分布的朴素贝叶斯。
#clf =MultinomialNB().fit(train_tfidf, classtags_list)
#伯努利贝叶斯分类器
clf = BernoulliNB().fit(train_tfidf, classtags_list)

读取预测文件夹(内含四个txt文件)并进行预测,这个地方一直报错,一直显示读取问题,最后发生是.DS_Store的问题,这个是macOS系统的问题,写个判断给避过去就好了。

print(allfiles)
for thisfile in allfiles:
    #一直报错,输出后发现['2-travel.txt', '.DS_Store', '3-hotel.txt', '4-travel.txt', '1-travel.txt']
    #.DS_Store为Mac系统的一个文件,自动生成的,很烦人,所有加了个判断,如果文件名不含txt就跳过
    if 'txt' not in thisfile:
        continue
    path_name = path + "/" + thisfile
    #将预测文件变成词频矩阵
    new_count_vector = count_vector.transform([load_txt(path_name)])
    # 将词频矩阵变成TF-IDF值
    new_tfidf = TfidfTransformer(use_idf=True).fit_transform(new_count_vector)

    predict_result = clf.predict(new_tfidf)
    print("文件名字:",thisfile,"预测tag:",predict_result)
    print("-------------------")

结果图:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值