自然语言处理:朴素贝叶斯

介绍

大家好,博主又来和大家分享自然语言处理领域的知识了。按照博主的分享规划,本次分享的核心主题本应是自然语言处理中的文本分类。然而,在对分享内容进行细致梳理时,我察觉到其中包含几个至关重要的知识点,即朴素贝叶斯逻辑斯谛回归

这两个知识点在自然语言处理的知识体系中占据着关键地位,它们不仅是理解众多文本处理算法的基础,还在实际应用中发挥着不可或缺的作用。

因此,博主经过审慎思考,决定将朴素贝叶斯逻辑斯谛回归这两个知识点单独提取出来,进行专门的讲解。这样做旨在为大家构建一个更为清晰、系统的知识框架,使大家能够深入理解这些基础知识点的原理、应用场景及优势。好了,我们直接进入正题。

朴素贝叶斯

自然语言处理(NLP)领域,文本分类情感分析等任务至关重要,而朴素贝叶斯算法作为一种经典的机器学习方法,在这些任务中占据着重要地位。它基于贝叶斯定理和特征条件独立假设,具有原理简单、计算效率高的特点,能快速处理大规模文本数据。

基础概念

贝叶斯定理

贝叶斯定理是概率论中的一个重要定理,它描述了在已知一些条件下,某事件发生的概率。其公式为:

P(A|B)=\frac{P(B|A)P(A)}{P(B)}

其中,P(A|B)表示在事件B发生的条件下,事件A发生的概率;P(B|A)是在事件A发生的条件下,事件B发生的概率;P(A)P(B)分别是事件A和事件B发生的先验概率。

在自然语言处理中,我们可以把A看作是文本的类别(如体育、娱乐等),B看作是文本中的词汇或特征,通过贝叶斯定理来计算文本属于某个类别的概率。

朴素贝叶斯定理

朴素贝叶斯定理是基于贝叶斯定理和特征条件独立假设的分类方法,常用于文本分类、垃圾邮件过滤等自然语言处理任务。在文本分类场景下,假设文本有$n$个特征$x_1,x_2,\cdots,x_n$,类别有$C_1,C_2,\cdots,C_k$。根据贝叶斯定理,文本属于类别$C_i$概率为:

$P(C_i|x_1,x_2,\cdots,x_n)=\frac{P(x_1,x_2,\cdots,x_n|C_i)P(C_i)}{P(x_1,x_2,\cdots,x_n)}$

引入特征条件独立假设,即假设在给定类别$C_i$情况下,各个特征$x_j$相互独立,那么$P(x_1,x_2,\cdots,x_n|C_i)=P(x_1|C_i)P(x_2|C_i)\cdots P(x_n|C_i)$。因为$P(x_1,x_2,\cdots,x_n)$对于所有类别都是相同的,在比较不同类别概率大小时可以忽略。

所以朴素贝叶斯分类器的决策规则为:

$P(C_i|x_1,x_2,\cdots,x_n)\propto P(x_1|C_i)P(x_2|C_i)\cdots P(x_n|C_i)P(C_i)$

选择使$P(x_1|C_i)P(x_2|C_i)\cdots P(x_n|C_i)P(C_i)$最大的类别$C_i$作为文本的预测类别。

特征条件独立假设

朴素贝叶斯算法中的特征条件独立假设是其核心假设,对算法的简单性和有效性起到关键作用。

定义阐述

特征条件独立假设是指在朴素贝叶斯模型中,假定给定样本所属类别时,样本的各个特征之间相互独立。

用数学语言表达,假设样本有$n$个特征$X_1,X_2,\cdots,X_n$,类别为$C$,那么特征条件独立假设意味着$P(X_1,X_2,\cdots,X_n|C)=P(X_1|C)P(X_2|C)\cdots P(X_n|C)$。即对于某个类别$C$,特征$X_i$的出现概率不依赖于其他特征$X_j(j\neq i)$的出现情况 。

算法作用

这一假设极大地简化了计算过程。在计算样本属于某个类别的概率时,根据贝叶斯定理$P(C|X_1,X_2,\cdots,X_n)=\frac{P(X_1,X_2,\cdots,X_n|C)P(C)}{P(X_1,X_2,\cdots,X_n)}$,若没有特征条件独立假设,计算$P(X_1,X_2,\cdots,X_n|C)$时,需要考虑所有特征之间的联合概率分布,这在实际应用中非常复杂。而有了该假设,$P(X_1,X_2,\cdots,X_n|C)$可以转化为多个简单概率$P(X_i|C)$的乘积,使计算量大幅减少,提高了算法的效率。

举例说明

在文本分类场景中,假设用朴素贝叶斯算法判断一篇文档是体育类还是娱乐类。若以单词作为特征,特征条件独立假设就认为在已知文档类别的情况下,单词“篮球”“明星”在文档中出现的概率是相互独立的。即使一篇体育类文档中“篮球”出现的频率较高,但它不会影响“明星”出现的概率。

局限性

在现实世界中,特征之间往往存在一定的相关性,该假设并不完全符合实际情况。例如,“篮球”“运动员”在体育类文档中通常会同时出现,它们之间并非完全独立。这就导致朴素贝叶斯算法在处理特征相关性较强的数据时,分类效果可能会受到影响。

但在很多情况下,即使特征条件独立假设不完全成立,朴素贝叶斯算法仍能取得不错的效果,在文本分类、垃圾邮件过滤等领域应用广泛。

文本分类中的应用

在文本分类任务中,朴素贝叶斯算法通过计算文本属于各个类别的概率,选择概率最大的类别作为文本的分类结果。假设文本有n个特征x_1,x_2,\cdots,x_n,类别有C_1,C_2,\cdots,C_k,根据贝叶斯定理和特征条件独立假设,文本属于类别C_i的概率为:

P(C_i|x_1,x_2,\cdots,x_n)=\frac{P(x_1|C_i)P(x_2|C_i)\cdots P(x_n|C_i)P(C_i)}{P(x_1,x_2,\cdots,x_n)}

由于分母P(x_1,x_2,\cdots,x_n)对于所有类别都是相同的,在比较不同类别概率大小时可以忽略,所以实际计算时只需要比较分子的大小,即:

P(C_i|x_1,x_2,\cdots,x_n)\propto P(x_1|C_i)P(x_2|C_i)\cdots P(x_n|C_i)P(C_i)

代码实现

数据预处理

在使用朴素贝叶斯进行文本分类前,需要对数据进行预处理,包括文本清洗(去除标点符号、停用词等)、分词以及将文本转化为特征向量。以下是一个简单的数据预处理示例:

完整代码
# 导入正则表达式模块,用于处理文本中的特定模式
import re
# 导入自然语言处理工具包nltk
import nltk
# 从nltk的分词模块导入单词分词函数
from nltk.tokenize import word_tokenize
# 从nltk的语料库模块导入停用词
from nltk.corpus import stopwords


# 定义一个用于自然语言处理文本分类的类
class NLPTextClassification:
    # 类的初始化方法,目前为空
    def __init__(self):
        pass

    # 定义文本分类预处理的方法,接收输入文本作为参数
    def text_classification(self, input_text):
        # 下载punkt_tab语料库,quiet=True表示静默下载,不显示详细信息
        nltk.download('punkt_tab', quiet=True)
        # 下载英文停用词语料库,quiet=True表示静默下载,不显示详细信息
        nltk.download('stopwords', quiet=True)
        # 使用正则表达式去除输入文本中的标点符号
        text_without_punctuation = re.sub(r'[^\w\s]', '', input_text)
        # 对去除标点后的文本进行分词,并将所有单词转换为小写
        lowercased_word_tokens = word_tokenize(text_without_punctuation.lower())
        # 获取英文停用词集合
        english_stop_words = set(stopwords.words('english'))
        # 过滤掉分词结果中的停用词,得到过滤后的单词列表
        filtered_word_list = [word for word in lowercased_word_tokens if word not in english_stop_words]
        # 返回过滤后的单词列表
        return filtered_word_list


# 程序的入口点
if __name__ == "__main__":
    # 创建NLPTextClassification类的实例
    nlp_text_classification = NLPTextClassification()
    # 定义一个示例文本
    sample_text = "This is a sample text! It contains some stopwords and punctuation."
    # 调用实例的text_classification方法对示例文本进行预处理
    processed_text = nlp_text_classification.text_classification(sample_text)
    # 打印预处理后的文本
    print(processed_text)
运行结果
['sample', 'text', 'contains', 'stopwords', 'punctuation']

进程已结束,退出代码为 0

在这段代码中,首先使用正则表达式re.sub去除文本中的标点符号,然后将文本转换为小写并使用word_tokenize进行分词。接着,从nltk.corpus中获取英文停用词集合,去除分词结果中的停用词。最后返回预处理后的单词列表。

这段代码的目的是将原始文本转化为适合朴素贝叶斯模型处理的形式,去除无关信息,提取关键特征。

训练朴素贝叶斯模型

在自然语言处理的文本分类任务中,朴素贝叶斯算法凭借其简单高效的特性,成为了经典且常用的方法之一。它基于贝叶斯定理和特征条件独立假设,通过计算文本属于不同类别的概率来实现分类。

下面的代码展示了实现训练朴素贝叶斯模型并计算先验概率和似然概率的过程。在代码中,我们将利用defaultdict来方便地统计数据,同时通过合理的循环和计算逻辑,准确地得出这些关键概率值,为后续的文本分类任务奠定基础。

完整代码
# 导入数学模块,用于对数计算
import math
# 从collections模块导入defaultdict,用于创建默认值的字典
from collections import defaultdict
# 从nltk的语料库模块导入停用词
from nltk.corpus import stopwords
# 从nltk的分词模块导入单词分词函数
from nltk.tokenize import word_tokenize
# 导入自然语言处理工具包nltk
import nltk

# 下载punkt_tab语料库,quiet=True表示静默下载,不显示详细信息
nltk.download('punkt_tab', quiet=True)
# 下载英文停用词语料库,quiet=True表示静默下载,不显示详细信息
nltk.download('stopwords', quiet=True)


# 定义一个用于自然语言处理文本分类的类
class NLPTextClassification:
    # 类的初始化方法,初始化停用词集合
    def __init__(self):
        # 获取英文停用词集合
        self.stop_words = set(stopwords.words('english'))

    # 对输入文本进行预处理的方法
    def preprocess_text(self, text):
        # 将文本转换为小写并进行分词
        tokens = word_tokenize(text.lower())
        # 过滤掉非字母字符和停用词,返回处理后的单词列表
        return [word for word in tokens if word.isalpha() and word not in self.stop_words]

    # 训练朴素贝叶斯分类器的方法,接收文本语料库和类别标签作为参数
    def train_naive_bayes(self, text_corpus, category_labels):
        # 初始化一个defaultdict,用于统计每个类别的文档数量
        category_document_count = defaultdict(int)
        # 初始化一个嵌套的defaultdict,用于统计每个类别下每个单词的出现频率
        category_word_frequency = defaultdict(lambda: defaultdict(int))
        # 计算文本语料库中文档的总数
        total_document_count = len(text_corpus)
        # 初始化一个集合,用于存储语料库中出现的所有单词
        all_words = set()

        # 遍历文本语料库中的每个文档
        for i in range(total_document_count):
            # 对当前文档进行预处理
            current_document = self.preprocess_text(text_corpus[i])
            # 获取当前文档对应的类别标签
            current_category = category_labels[i]
            # 对应类别的文档数量加1
            category_document_count[current_category] += 1
            # 遍历当前文档中的每个单词
            for word in current_document:
                # 对应类别下该单词的出现频率加1
                category_word_frequency[current_category][word] += 1
                # 将该单词添加到所有单词的集合中
                all_words.add(word)

        # 计算每个类别的先验概率,通过该类别文档数量除以文档总数得到
        prior_probabilities = {category: count / total_document_count for category, count in
                               category_document_count.items()}
        # 初始化一个字典,用于存储每个类别下每个单词的似然概率
        likelihood_probabilities = {}
        # 遍历每个类别及其对应的单词频率字典
        for category, word_frequency_dict in category_word_frequency.items():
            # 为当前类别初始化一个空字典,用于存储该类别下单词的似然概率
            likelihood_probabilities[category] = {}
            # 计算该类别下的总单词数
            total_word_count_in_category = sum(word_frequency_dict.values())
            # 遍历所有出现过的单词
            for word in all_words:
                # 获取该单词在当前类别下的出现频率,若未出现则为0
                frequency = word_frequency_dict.get(word, 0)
                # 计算该类别下该单词的似然概率,使用拉普拉斯平滑处理
                likelihood_probabilities[category][word] = (frequency + 1) / (
                        total_word_count_in_category + len(all_words))

        # 返回计算得到的先验概率和似然概率
        return prior_probabilities, likelihood_probabilities


# 程序的入口点
if __name__ == "__main__":
    # 定义一个文档语料库,包含多个文档,每个文档是一个字符串
    document_corpus = [
        "This is a sports article about football and basketball.",
        "The latest entertainment news features movie stars and music events.",
        "A thrilling football match ended with a great goal.",
        "The new movie release is getting a lot of buzz in the entertainment world.",
        "Basketball players are training hard for the upcoming season."
    ]
    # 定义文档语料库中每个文档对应的类别标签
    document_labels = ['sports', 'entertainment', 'sports', 'entertainment', 'sports']

    # 创建NLPTextClassification类的实例
    nlp_text_classification = NLPTextClassification()

    # 调用实例的train_naive_bayes方法,计算先验概率和似然概率
    prior_probs, likelihood_probs = nlp_text_classification.train_naive_bayes(document_corpus, document_labels)
    # 打印计算得到的先验概率
    print("先验概率:", prior_probs)
    # 打印计算得到的似然概率,只展示概率大于0.01的部分
    print("似然概率:(部分展示)", {category: {k: v for k, v in prob_dict.items() if v > 0.01} for category, prob_dict in
                                  likelihood_probs.items()})
运行结果
先验概率: {'sports': 0.6, 'entertainment': 0.4}
似然概率:(部分展示) {'sports': {'match': 0.045454545454545456, 'article': 0.045454545454545456, 'stars': 0.022727272727272728, 'buzz': 0.022727272727272728, 'players': 0.045454545454545456, 'music': 0.022727272727272728, 'basketball': 0.06818181818181818, 'features': 0.022727272727272728, 'football': 0.06818181818181818, 'season': 0.045454545454545456, 'entertainment': 0.022727272727272728, 'hard': 0.045454545454545456, 'getting': 0.022727272727272728, 'training': 0.045454545454545456, 'news': 0.022727272727272728, 'thrilling': 0.045454545454545456, 'movie': 0.022727272727272728, 'new': 0.022727272727272728, 'latest': 0.022727272727272728, 'goal': 0.045454545454545456, 'upcoming': 0.045454545454545456, 'sports': 0.045454545454545456, 'world': 0.022727272727272728, 'release': 0.022727272727272728, 'ended': 0.045454545454545456, 'great': 0.045454545454545456, 'events': 0.022727272727272728, 'lot': 0.022727272727272728}, 'entertainment': {'match': 0.022727272727272728, 'article': 0.022727272727272728, 'stars': 0.045454545454545456, 'buzz': 0.045454545454545456, 'players': 0.022727272727272728, 'music': 0.045454545454545456, 'basketball': 0.022727272727272728, 'features': 0.045454545454545456, 'football': 0.022727272727272728, 'season': 0.022727272727272728, 'entertainment': 0.06818181818181818, 'hard': 0.022727272727272728, 'getting': 0.045454545454545456, 'training': 0.022727272727272728, 'news': 0.045454545454545456, 'thrilling': 0.022727272727272728, 'movie': 0.06818181818181818, 'new': 0.045454545454545456, 'latest': 0.045454545454545456, 'goal': 0.022727272727272728, 'upcoming': 0.022727272727272728, 'sports': 0.022727272727272728, 'world': 0.045454545454545456, 'release': 0.045454545454545456, 'ended': 0.022727272727272728, 'great': 0.022727272727272728, 'events': 0.045454545454545456, 'lot': 0.045454545454545456}}

进程已结束,退出代码为 0

这段代码的目的是通过对给定语料库的学习和处理,训练朴素贝叶斯模型,获取模型所需的先验概率和似然概率参数,为后续的文本分类任务做好准备。

注:

  • 先验概率(Prior Probability):贝叶斯统计学和概率理论中的一个重要概念,它反映了在获取新数据或证据之前,对某个事件发生可能性的初始估计。先验概率是指在没有任何额外信息(或证据)的情况下,根据以往的经验、知识或常识,对某个事件发生的可能性所做出的概率估计。它是一种主观的概率判断,不依赖于当前所研究的具体数据。
  • 似然概率(Likelihood Probability):通常称为似然,是在统计学和机器学习中,尤其是在贝叶斯理论和概率模型中非常重要的概念。似然是在给定模型参数的情况下,观测到某一数据样本的可能性。简单来说,它衡量的是在特定的参数设定下,产生当前所观测到的数据的概率大小。与概率描述随机事件发生的可能性不同,似然更侧重于描述数据与参数之间的关系,即已知数据,探讨什么样的参数值更有可能产生这些数据。

文本分类预测

文本分类预测,简单来说,就是根据文本的内容、主题、情感倾向等特征,将其自动划分到预先设定的不同类别中。

下面,我们将通过一段具体的Python代码,来深入了解如何运用朴素贝叶斯算法实现文本分类预测。这段代码涵盖了文本预处理、模型训练以及预测等关键步骤,能够帮助我们清晰地看到整个算法的运行过程和实现细节。

完整代码
# 导入数学模块,用于对数计算
import math
# 从collections模块导入defaultdict,用于创建默认值的字典
from collections import defaultdict
# 从nltk的语料库模块导入停用词
from nltk.corpus import stopwords
# 从nltk的分词模块导入单词分词函数
from nltk.tokenize import word_tokenize
# 导入自然语言处理工具包nltk
import nltk

# 下载punkt_tab语料库,quiet=True表示静默下载,不显示详细信息
nltk.download('punkt_tab', quiet=True)
# 下载英文停用词语料库,quiet=True表示静默下载,不显示详细信息
nltk.download('stopwords', quiet=True)


# 定义一个用于自然语言处理文本分类的类
class NLPTextClassification:
    # 类的初始化方法,初始化停用词集合
    def __init__(self):
        # 获取英文停用词集合
        self.stop_words = set(stopwords.words('english'))

    # 对输入文本进行预处理的方法
    def preprocess_text(self, text):
        # 将文本转换为小写并进行分词
        tokens = word_tokenize(text.lower())
        # 过滤掉非字母字符和停用词,返回处理后的单词列表
        return [word for word in tokens if word.isalpha() and word not in self.stop_words]

    # 训练朴素贝叶斯分类器的方法,接收文本语料库和类别标签作为参数
    def train_naive_bayes(self, text_corpus, category_labels):
        # 初始化一个defaultdict,用于统计每个类别的文档数量
        category_document_count = defaultdict(int)
        # 初始化一个嵌套的defaultdict,用于统计每个类别下每个单词的出现频率
        category_word_frequency = defaultdict(lambda: defaultdict(int))
        # 计算文本语料库中文档的总数
        total_document_count = len(text_corpus)
        # 初始化一个集合,用于存储语料库中出现的所有单词
        all_words = set()

        # 遍历文本语料库中的每个文档
        for i in range(total_document_count):
            # 对当前文档进行预处理
            current_document = self.preprocess_text(text_corpus[i])
            # 获取当前文档对应的类别标签
            current_category = category_labels[i]
            # 对应类别的文档数量加1
            category_document_count[current_category] += 1
            # 遍历当前文档中的每个单词
            for word in current_document:
                # 对应类别下该单词的出现频率加1
                category_word_frequency[current_category][word] += 1
                # 将该单词添加到所有单词的集合中
                all_words.add(word)

        # 计算每个类别的先验概率,通过该类别文档数量除以文档总数得到
        prior_probabilities = {category: count / total_document_count for category, count in
                               category_document_count.items()}
        # 初始化一个字典,用于存储每个类别下每个单词的似然概率
        likelihood_probabilities = {}
        # 遍历每个类别及其对应的单词频率字典
        for category, word_frequency_dict in category_word_frequency.items():
            # 为当前类别初始化一个空字典,用于存储该类别下单词的似然概率
            likelihood_probabilities[category] = {}
            # 计算该类别下的总单词数
            total_word_count_in_category = sum(word_frequency_dict.values())
            # 遍历所有出现过的单词
            for word in all_words:
                # 获取该单词在当前类别下的出现频率,若未出现则为0
                frequency = word_frequency_dict.get(word, 0)
                # 计算该类别下该单词的似然概率,使用拉普拉斯平滑处理
                likelihood_probabilities[category][word] = (frequency + 1) / (
                        total_word_count_in_category + len(all_words))

        # 返回计算得到的先验概率和似然概率
        return prior_probabilities, likelihood_probabilities

    # 使用朴素贝叶斯算法对测试文本进行分类预测的方法
    def predict_naive_bayes(self, test_text, prior_probabilities, likelihood_probabilities):
        # 初始化最大概率为负无穷,用于后续比较并记录最大概率值
        maximum_probability = float('-inf')
        # 初始化预测的类别标签为None,用于存储最终预测的类别
        predicted_category_label = None
        # 对测试文本进行预处理
        test_document = self.preprocess_text(test_text)

        # 遍历每个类别及其对应的先验概率
        for category_label, category_prior_probability in prior_probabilities.items():
            # 先取先验概率的对数作为初始概率,使用对数可避免概率相乘导致的下溢问题
            current_probability = math.log(category_prior_probability)
            # 遍历测试文档中的每个单词
            for word in test_document:
                # 如果该单词在当前类别对应的似然概率字典中
                if word in likelihood_probabilities[category_label]:
                    # 将该单词在当前类别下的似然概率的对数累加到当前概率上
                    current_probability += math.log(likelihood_probabilities[category_label][word])
            # 如果当前计算得到的概率大于之前记录的最大概率
            if current_probability > maximum_probability:
                # 更新最大概率
                maximum_probability = current_probability
                # 更新预测的类别标签
                predicted_category_label = category_label
        # 返回预测的类别标签
        return predicted_category_label


# 程序的入口点
if __name__ == "__main__":
    # 定义一个文档语料库,包含多个文档,每个文档是一个字符串
    document_corpus = [
        "This is a sports article about football and basketball.",
        "The latest entertainment news features movie stars and music events.",
        "A thrilling football match ended with a great goal.",
        "The new movie release is getting a lot of buzz in the entertainment world.",
        "Basketball players are training hard for the upcoming season."
    ]
    # 定义文档语料库中每个文档对应的类别标签
    document_labels = ['sports', 'entertainment', 'sports', 'entertainment', 'sports']

    # 创建NLPTextClassification类的实例
    nlp_text_classification = NLPTextClassification()

    # 调用实例的train_naive_bayes方法,计算先验概率和似然概率
    prior_probs, likelihood_probs = nlp_text_classification.train_naive_bayes(document_corpus, document_labels)
    # 打印计算得到的先验概率
    print("先验概率:", prior_probs)
    # 打印计算得到的似然概率,只展示概率大于0.01的部分
    print("似然概率:(部分展示)", {category: {k: v for k, v in prob_dict.items() if v > 0.01} for category, prob_dict in
                                  likelihood_probs.items()})

    # 定义待预测的测试文本
    test_text = "The football team is preparing for the championship."
    # 调用实例的predict_naive_bayes方法,对测试文本进行分类预测
    predicted_category = nlp_text_classification.predict_naive_bayes(test_text, prior_probs, likelihood_probs)
    # 打印测试文本
    print("测试文本:", test_text)
    # 打印预测得到的文档类别
    print("预测的类别:", predicted_category)
运行结果
先验概率: {'sports': 0.6, 'entertainment': 0.4}
似然概率:(部分展示) {'sports': {'great': 0.045454545454545456, 'goal': 0.045454545454545456, 'latest': 0.022727272727272728, 'movie': 0.022727272727272728, 'season': 0.045454545454545456, 'getting': 0.022727272727272728, 'release': 0.022727272727272728, 'players': 0.045454545454545456, 'new': 0.022727272727272728, 'upcoming': 0.045454545454545456, 'lot': 0.022727272727272728, 'buzz': 0.022727272727272728, 'basketball': 0.06818181818181818, 'sports': 0.045454545454545456, 'features': 0.022727272727272728, 'match': 0.045454545454545456, 'stars': 0.022727272727272728, 'football': 0.06818181818181818, 'article': 0.045454545454545456, 'entertainment': 0.022727272727272728, 'ended': 0.045454545454545456, 'training': 0.045454545454545456, 'thrilling': 0.045454545454545456, 'events': 0.022727272727272728, 'hard': 0.045454545454545456, 'news': 0.022727272727272728, 'music': 0.022727272727272728, 'world': 0.022727272727272728}, 'entertainment': {'great': 0.022727272727272728, 'goal': 0.022727272727272728, 'latest': 0.045454545454545456, 'movie': 0.06818181818181818, 'season': 0.022727272727272728, 'getting': 0.045454545454545456, 'release': 0.045454545454545456, 'players': 0.022727272727272728, 'new': 0.045454545454545456, 'upcoming': 0.022727272727272728, 'lot': 0.045454545454545456, 'buzz': 0.045454545454545456, 'basketball': 0.022727272727272728, 'sports': 0.022727272727272728, 'features': 0.045454545454545456, 'match': 0.022727272727272728, 'stars': 0.045454545454545456, 'football': 0.022727272727272728, 'article': 0.022727272727272728, 'entertainment': 0.06818181818181818, 'ended': 0.022727272727272728, 'training': 0.022727272727272728, 'thrilling': 0.022727272727272728, 'events': 0.045454545454545456, 'hard': 0.022727272727272728, 'news': 0.045454545454545456, 'music': 0.045454545454545456, 'world': 0.045454545454545456}}
测试文本: The football team is preparing for the championship.
预测的类别: sports

进程已结束,退出代码为 0

这段代码的核心目的是实现一个基于朴素贝叶斯算法的英文文本分类系统。

  • preprocess_text方法将输入文本转换为小写、分词,并过滤非字母字符和停用词,提升文本数据质量。
  • train_naive_bayes方法是训练模型的关键,它通过统计每个类别的文档数量和每个类别下单词的出现频率,运用拉普拉斯平滑处理计算先验概率和似然概率,避免因单词未出现导致概率为 0 的问题。
  • predict_naive_bayes方法则利用训练得到的先验概率和似然概率,对测试文本进行分类预测,通过对数运算避免概率相乘的下溢问题。

整体而言,这段代码实现了从文本数据预处理、模型训练到分类预测的完整流程,为自然语言处理中的文本分类任务提供了一个基础且有效的解决方案。

应用优势

  • 简单高效:朴素贝叶斯算法的原理基于简单的概率理论和独立假设,计算过程相对简单,不需要复杂的迭代优化,训练和预测速度都比较快,能够快速处理大规模文本数据,在文本分类等任务中能取得较高的效率。
  • 所需数据量小:相比一些复杂的机器学习模型,朴素贝叶斯在训练时所需的样本数据量相对较少。它可以从有限的数据中学习到有效的分类模式,这在数据获取困难或数据量有限的情况下具有很大优势。
  • 可解释性强:朴素贝叶斯模型的决策过程清晰易懂。通过计算每个类别下的先验概率和似然概率,我们可以直观地理解模型是如何做出分类决策的,便于分析和解释分类结果。

应用劣势

  • 特征条件独立假设的局限性:在实际的自然语言文本中,单词之间往往存在语义关联,并不完全满足特征条件独立假设。例如,“苹果”“水果”这两个词在语义上密切相关,朴素贝叶斯算法可能会因为这个假设而忽略这种关系,从而影响分类的准确性。
  • 对数据稀疏性敏感:如果训练数据中某些特征很少出现,在计算似然概率时,这些特征的概率可能会非常小甚至为0。即使采用平滑技术,在数据稀疏的情况下,模型的性能仍然可能受到较大影响。
  • 无法处理复杂的分类边界:朴素贝叶斯算法假设每个类别对应的特征分布是简单的概率分布,这使得它在处理具有复杂分类边界的数据集时表现不佳。在实际应用中,文本数据的分类边界可能非常复杂,朴素贝叶斯难以准确地划分不同类别。

结论赋能

朴素贝叶斯算法作为自然语言处理中的经典方法,凭借其简单高效、可解释性强等优点,在文本分类、情感分析等多个领域有着广泛的应用。它为自然语言处理提供了一种快速且有效的解决方案,尤其适用于对效率要求较高、数据量有限的场景。

然而,其基于特征条件独立假设的局限性以及对数据稀疏性的敏感性等缺点也限制了它在一些复杂任务中的表现。在实际应用中,需要根据具体任务的需求和数据特点,合理选择是否使用朴素贝叶斯算法,并结合其他技术(如特征工程、集成学习等)来弥补其不足,以更好地实现自然语言处理的目标。

结束

好了,以上就是本次分享的全部内容了。希望这次关于朴素贝叶斯的讲解,能让大家对自然语言处理中的文本分类任务有更深入的理解。无论是对于初学者构建对机器学习算法应用的基础认知,还是对于有经验的开发者在实际项目中优化文本分类模型,都能有所裨益。

在实际的自然语言处理工作中,文本分类预测是一个不断迭代和优化的过程。从数据的收集与预处理,到模型的训练、评估与调优,每一个环节都需要我们精心对待。朴素贝叶斯算法虽然有其自身的局限性,但它的简洁高效使其在很多场景下依然是一个值得考虑的选择。

那么本次分享就到这里了。最后,博主还是那句话:请大家多去大胆的尝试和使用,成功总是在不断的失败中试验出来的,敢于尝试就已经成功了一半。如果大家对博主分享的内容感兴趣或有帮助,请点赞和关注。大家的点赞和关注是博主持续分享的动力🤭,博主也希望让更多的人学习到新的知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/980783.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【542. 01 矩阵 中等】

题目: 给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。 两个相邻元素间的距离为 1 。 示例 1: 输入:mat [[0,0,0],[0,1,0],[0,0,0]] 输出…

深入浅出:Spring AI 集成 DeepSeek 构建智能应用

Spring AI 作为 Java 生态中备受瞩目的 AI 应用开发框架,凭借其简洁的 API 设计和强大的功能,为开发者提供了构建智能应用的强大工具。与此同时,DeepSeek 作为领先的 AI 模型服务提供商,在自然语言处理、计算机视觉等领域展现了卓…

Vue 系列之:基础知识

什么是 MVVM MVVM(Model-View-ViewModel)一种软件设计模式,旨在将应用程序的数据模型(Model)与视图层(View)分离,并通过 ViewModel 来实现它们之间的通信。降低了代码的耦合度。 M…

辛格迪客户案例 | 鼎康生物电子合约系统(eSign)项目

01 案例企业 鼎康(武汉)生物医药有限公司于2013年06月19日成立 ,是一家总部位于湖北武汉的CDMO公司,坚持以客户为中心,以及时、经济和高质量为服务导向。鼎康生物拥有先进的150,000平方英尺的生产厂房,生产设施位于中国武汉的Bio…

QT-对象树

思维导图 写1个Widget窗口&#xff0c;窗口里面放1个按钮&#xff0c;按钮随便叫什么 创建2个Widget对象 Widget w1,w2 w1.show() w2不管 要求&#xff1a;点击 w1.btn ,w1隐藏&#xff0c;w2显示 点击 w2.btn ,w2隐藏&#xff0c;w1 显示 #include <QApplication> #inc…

【笔记】用大预言模型构建专家系统

最近闲庭漫步&#xff0c;赏一赏各个AI大语言模型芳容。也趁着时间&#xff0c;把倪海夏一家的天纪和人纪视频看完了&#xff0c;感谢倪先生和现在网络的知识分享&#xff0c;受益匪浅。但是发现看完&#xff0c;很多不错的知识都不能记录在脑子里&#xff0c;那用的时候岂不是…

0086.基于springboot+vue的企业OA管理系统+论文

一、系统说明 基于springbootvue的企业OA管理系统,系统功能齐全, 代码简洁易懂&#xff0c;适合小白学编程。 2600套项目源码&#xff0c;总有适合您的&#xff01; 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍…

数据集笔记:新加坡停车费

data.gov.sg 该数据集包含 新加坡各停车场的停车费&#xff0c;具体信息包括&#xff1a; 停车场名称&#xff08;Carpark&#xff09;&#xff1a;如 Toa Payoh Lorong 8、Ang Mo Kio Hub、Bras Basah Complex 等。停车区域类别&#xff08;Category&#xff09;&#xff1a…

初阶数据结构(C语言实现)——3顺序表和链表(2)

2.3 数组相关面试题 原地移除数组中所有的元素val&#xff0c;要求时间复杂度为O(N)&#xff0c;空间复杂度为O(1)。OJ链接 力扣OJ链接-移除元素删除排序数组中的重复项。力扣OJ链接-删除有序数组中的重复项合并两个有序数组。力扣OJ链接-合并两个有序数组 2.3.1 移除元素 1…

Java实现pdf文件压缩(aspose-pdf实现压缩、itextpdf去除aspose-pdf版权水印)

Java实现pdf文件压缩 时间换空间&#xff0c;实现pdf文件无损压缩。 1、依赖准备 市面上操作pdf文件的组件有spire.pdf.free、itextpdf、openpdf、pdfbox等&#xff0c;它们各有千秋。我们主要完成的场景为压缩&#xff0c;减少文件大小去优化存储、传输等。 在这里选取的组件…

基于Spring Boot的产业园区智慧公寓管理系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

7. 从网络获取数据

一、课程笔记 1.1 订阅网络状态变化 1.1.1 网络状态概述 1.1.2 获取网络信息 &#xff08;1&#xff09;创建网络对象 &#xff08;2&#xff09;createNetConnection接口的具体使用 &#xff08;3&#xff09;获取默认激活网络及其能力 1.1.3 订阅网络状态 在获取网络状态后…

多镜头视频生成、机器人抓取、扩散模型个性化 | Big Model weekly第58期

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 01 GLM-4-Voice: Towards Intelligent and Human-Like End-to-End Spoken Chatbot 本文介绍了一种名为GLM-4-Voice的智能且类人化的端到端语音聊天机器人。它支持中文和英文&#xff0c;能够进行实时语音对话&a…

git从零学起

从事了多年java开发&#xff0c;一直在用svn进行版本控制&#xff0c;如今更换了公司&#xff0c;使用的是git进行版本控制&#xff0c;所以打算记录一下git学习的点滴&#xff0c;和大家一起分享。 百度百科&#xff1a; Git&#xff08;读音为/gɪt/&#xff09;是一个开源…

计算机毕业设计SpringBoot+Vue.js实验室管理系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

计算机毕业设计SpringBoot+Vue.js体育馆使用预约平台(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Spring Boot集成Jetty、Tomcat或Undertow及支持HTTP/2协议

目录 一、常用Web服务器 1、Tomcat 2、Jetty 3、Undertow 二、什么是HTTP/2协议 1、定义 2、特性 3、优点 4、与HTTP/1.1的区别 三、集成Web服务器并开启HTTP/2协议 1、生成证书 2、新建springboot项目 3、集成Web服务器 3.1 集成Tomcat 3.2 集成Jetty 3.3 集成…

java后端开发day24--阶段项目(一)

&#xff08;以下内容全部来自上述课程&#xff09; GUI&#xff1a;Graphical User Interface 图形用户接口&#xff0c;采取图形化的方式显示操作界面 分为两套体系&#xff1a;AWT包&#xff08;有兼容问题&#xff09;和Swing包&#xff08;常用&#xff09; 拼图小游戏…

Spring Boot操作MaxComputer(保姆级教程)

目录 引言 一、引入依赖 二、配置文件 application.properties&#xff08;信息用自己的奥&#xff09; 三、实体类User.java 四、UserController 五、UserService 六、UserDao 七、UserDao.xml 八、postman 访问&#xff0c;成功查询数据 附件(修改和删除数据) 引言…

关于Postman自动获取token

在使用postman测试联调接口时&#xff0c;可能每个接口都需要使用此接口生成的令牌做Authorization的Bearer Token验证&#xff0c;最直接的办法可能会是一步一步的点击&#xff0c;如下图&#xff1a; 在Authorization中去选择Bearer Token&#xff0c;然后将获取到的token粘贴…