【NLP实战系列】朴素贝叶斯文本分类实战

实战是学习一门技术最好的方式,也是深入了解一门技术唯一的方式。因此,NLP专栏计划推出一个实战专栏,让有兴趣的同学在看文章之余也可以自己动手试一试。

本篇介绍自然语言处理中一种比较简单,但是有效的文本分类手段:朴素贝叶斯模型。

作者&编辑 | 小Dream哥

1 朴素贝叶斯介绍

贝叶斯决策论是在统计概率框架下进行分类决策的基本方法。对于分类任务来说,在所有相关概率都已知的情况下,贝叶斯决策论考虑如何基于这些概率和误判损失来预测分类。

朴素贝叶斯模型在训练过程,利用数据集D,计算P(c),P(x_i|c)。在预测时,输入样本,利用贝叶斯公式,计算n个类别的概率,最后输出概率最大的那个类别,作为预测的类别。

朴素贝叶斯模型分类的理论相关知识,在文章【NLP】经典分类模型朴素贝叶斯解读中有详细的介绍,感兴趣或者不清楚的朋友可以出门左转,再看一下。

假如我们有语料集D,文本可分为(c_1,c_2,...,c_n)个类别,我们根据语料集D,计算每个类别出现的概率P(c_i),以及当文本类别为c_i时,词x_i出现的概率P(x_i|c_i)。这样一个由m个词构成的文本(x_1,x_2,...,x_m)就可以根据上述公式预测出文本是各个类别的概率。

2 NLTK

Natural Language Toolkit,NLTK是一个开源的项目,包含:Python模块,数据集和教程,用于NLP的研究和开发,是一个不错的python工具包。此次我们介绍用NLTK里的NaiveBayesClassifier模块,来进行文本分类。

3 数据集准备

因为是文本分类任务,所以数据集是按类别分好的一系列文本,如下图所示:

这里因为只是展示,数据集比较简单,只有3个类别。在一个类别内,每条数据之间用分号隔开。

4 数据读取

数据读取的代码如下所示:

#1 进行数据读取

def read_data(filename):
    data = []
    with open(filename, encoding='utf-8') as f:
        for line in f:
            (label, sentences) = line.split('\t')
            sentence_list = sentences.split(';')
            data.extend([(sentence,label) for sentence in sentence_list if sentence])
# 最后返回的是一个列表,结构如下[('我要打车','get_a_taxi'),('明天天气怎么样','get_weather')。。。]
    return data

数据读取过程的任务很简单,就是从语料文件中将语料读到内存中,组织成一个列表,列表中每一项组成为(data,label),如('明天天气怎么样','get_weather')。

5 特征选择及训练数据集构建

利用分词后的词性作为训练数据特征。最后喂给模型的数据是一个类似这样的列表

[({“t”:“明天”,“n”:“天气”,“r”:“怎么样” }, 'get_weather') ,... ]

#2.1 停用词处理
def delte_stop_word(sentence):
    for word in stop_word:
        if word in sentence:
            sentence.replace(word, '')
    return sentence

#2 进行特征选择,这里利用分词后的词性作为特征
def get_word_features(sentence):
    data = {}
    sentence = delte_stop_word(sentence)
    seg_list = pesg.cut(sentence)
    for word, tag in seg_list:
        data[tag] = word
    return data
#3 构建训练数据集
def get_features_sets(datafile):
    feature_sets = []
    for sentence, label in read_data(datafile):
        feature = get_word_features(sentence)
        feature_sets.append((feature, label))
    return feature_sets  

6 训练及预测

训练及预测的过程很简单,就是调用NLTK的NaiveBayesClassifier模块,代码如下:

#训练模型

classifier = nltk.NaiveBayesClassifier.train(

get_features_sets('data.txt') )

#预测某一个文本的类别 predict_label = classifier.classify(get_word_features('请问明天的天气怎么样?') )

print(predict_label) ## get_weather

#预测某一个文本为某一个类别的概率print(classifier.prob_classify(get_word_features('请问明天的天气怎么样?')).prob(predict_label)) # 0.995154

我们展示一下预测的结果:

至此,介绍了如何利用NLTK的NaiveBayesClassifier模块进行文本分类,代码在我们有三AI的github可以下载:

https://github.com/longpeng2008/yousan.ai/tree/master/natural_language_processing

找到intention文件夹,执行python3 intent_recognition.py就可以运行了。

总结

文本分类常常用于情感分析、意图识别等NLP相关的任务中,是一个非常常见的任务,朴素贝叶斯本质上统计语料中对应类别中相关词出现的频率,并依此来预测测试文本。总的来说,它是一种非常便捷,效果可以接受的方法。

本文分享自微信公众号 - 有三AI(yanyousan_ai)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-20

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

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习技术分享

XLNet预训练模型,看这篇就够了!(代码实现)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

10610
来自专栏小小挖掘机

从word2vec到bert:NLP预训练模型发展史

原文链接:https://zhuanlan.zhihu.com/p/49271699

18410
来自专栏机器学习技术分享

BERT预训练模型的演进过程!(附代码)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

12120
来自专栏AINLP

【Github】nlp-roadmap:自然语言处理路相关路线图(思维导图)和关键词(知识点)

看到Reddit和Github上一个有意思的项目:graykode/nlp-roadmap

21430
来自专栏Datawhale专栏

NLP技术路线详解:这是从数学到算法的艺术

自然语言处理很多时候都是一门综合性的学问,它远远不止机器学习算法。相比图像或语音,文本的变化更加复杂,例如从预处理来看,NLP 就要求我们根据对数据的理解定制一...

9310
来自专栏深度学习自然语言处理

【收藏】NLP技术学习路线图,值得收藏,附下载

本路线图适合对自然语言处理领域的学生使用,其中收集了从基本数据到最优模型的相关资料,可以作为同学们初期学习的路线参考。

16340
来自专栏量子位

GitHub万星NLP资源大升级:实现Pytorch和TF深度互操作,集成32个最新预训练模型

刚刚, 抱抱脸(Hugging Face)团队,放出了transformers 2.0版本。

7630
来自专栏vivo互联网技术

如何编写高质量的 JS 函数(3) --函数式编程[理论篇]

《如何编写高质量的 JS 函数(1) -- 敲山震虎篇》介绍了函数的执行机制,此篇将会从函数的命名、注释和鲁棒性方面,阐述如何通过 JavaScript 编写高...

11400
来自专栏相约机器人

GitHub万星NLP资源大升级:实现Pytorch和TF深度互操作,集成32个最新预训练模型

刚刚, 抱抱脸(Hugging Face)团队,放出了transformers 2.0版本。

14340
来自专栏NLPIR

文本分析能够完善企业知识管理模式

知识经济的来临,知识管理在社会经济中的重要性也随之增加。文本分析的知识管理应用不仅包括企业单位,还包括一些科研管理部门,教育机构。企业在进行知识管理方面时,侧重...

9420

扫码关注云+社区

领取腾讯云代金券

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