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

news2025/4/8 17:19:11

介绍

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

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

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

朴素贝叶斯

自然语言处理(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。即使采用平滑技术,在数据稀疏的情况下,模型的性能仍然可能受到较大影响。
  • 无法处理复杂的分类边界:朴素贝叶斯算法假设每个类别对应的特征分布是简单的概率分布,这使得它在处理具有复杂分类边界的数据集时表现不佳。在实际应用中,文本数据的分类边界可能非常复杂,朴素贝叶斯难以准确地划分不同类别。

结论赋能

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

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

结束

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UltraScale系列FPGA实现SDI转PCIE3.0采集卡,基于UltraScale GTH+XDMA架构,提供工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目本博已有的 SDI 编解码方案我已有的PCIE方案本博客方案的PCIE2.0版本本博客方案的RIFFA版本 3、详细设计方案设计原理框图SDI 输入设备LMH1219RTWR 均衡器UltraScale …

Linux系列:如何调试 malloc 的底层源码

一:背景 1. 讲故事 上一篇我们聊过 C# 调用 C 的 malloc 代码来演示heap的内存泄露问题,但要想深入研究得必须把 malloc 的实现库 libc.so 给调试起来,大家都知道在Linux 上 libc 和 Windows 的 Win32 API 是一个层级的,由于 Li…

深入 PipeWire

简介 随着它的成熟,PipeWire 项目正在慢慢地变得流行。它的文档依然相对稀少,但正在逐渐增长。然而,让项目外部的人尝试用他们自己的语言来理解和解释它总是一个好主意,重申想法,从他们自己的角度来看待它。 在之前的…

20250304笔记-阅读论文

文章目录 前言一、寻找论文1.1寻找有代码的论文方法一:浏览器扩展1.1.1使用流程 方法二:使用Papers with Code 1.2大量搜索代码 二、阅读论文所用软件 三、引用文献格式总结 前言 一、寻找论文 1.1寻找有代码的论文 方法一:浏览器扩展 浏览…

线程POSIX信号量/基于环形队列的⽣产消费模型

一,POSIX线程信号量 信号量的本质就是一个计数器,也是对资源的预定机制,POSIX信号量和SystemV信号量作⽤相同,都是⽤于同步操作,达到⽆冲突的访问共享资源⽬的。但 POSIX可以⽤于线程间同步。 1,初始化信…

C# 类库打包dll文件

目录 前言操作流程注意事项 前言 在C#中,有多种方式可以对代码进行加密,以保护源代码不被轻易查看或修改,这篇文章主要介绍将C# cs类文件加密为dll文件的方式进行保护。 操作流程 在 Visual Studio 中,选择“创建新项目”。 选…

DELL EMC Unity存储如何让控制器进入service mode和退出service mode

近期遇到好几个关于DELL EMC unity (VNXe)存储系统挂掉的案例,都是很后期才寻找支持到我们这里,然后再看问题,已经变得很复杂,几乎都是从一个相对简单的问题搞成了一锅粥甚至最后丢数据的情况。 为此&…

【微知】如何通过mlxlink查看Mellanox网卡和光模块相关的信息?( mlxlink -d 01:00.0 -m)

背景 通过mlxlink可以查看Mellanox网卡的一些链路信息和硬件信息,也可以查看所插入的光模块的一些信息。 兄弟篇通过ethtool查看的方法:如何查看Mellanox网卡上的光模块的信息? 命令 mlxlink -d 01:00.0 -mman手册介绍: 如果…

Linux系列:如何用 C#调用 C方法造成内存泄露

一个简单的非托管内存泄露 1. 构建 so 文件 在 Windows 平台上我们会通过 MSVC 编译器将 C代码编译出一个成品 .dll,在 Linux 上通常会借助 gcc 将 c 编译成 .so 文件,这个.so 全称 Shared Object,为了方便讲解,先上一段简单的代码…

C# 数据类型相关

分类 按照数据复杂程度 按照数据存储 类型转换 隐式转换 隐式转换无法完成由精度高的数据类型向精度低的数据类型转换 显式转换 又称为强制类型转换,显示转换不一定总是成功,且转换过程中可能出现数据丢失 int num 666;float result (float)num; …

使用Word时无法粘贴,弹出错误提示:运行时错误‘53‘:文件未找到:MathPage.WLL

报错说明 使用Word时无法粘贴,粘贴时弹出提示如下: 一般出现这种情况时,我想你是刚装完MathType不久,博主装的是MathType7版本,出现了这个问题。 出现这个问题的原因是"mathpage.wll"这个文件在Office的插…

玩转python: 深度解析Python高阶函数及推导式

1 高阶函数:工程化编程的基石 1.1 高阶函数基础概念 高阶函数(Higher-Order Function)是函数式编程范式的核心要素,指能够接受函数作为参数或返回函数作为结果的函数。在Python中,这类函数构成了数据处理的基础架构&…

Linux第五讲----gcc与g++,makefile/make

1.代码编译 1.1预处理 我们通过vim编辑完文件之后,想看一下运行结果这时我们便可以试用gcc编译C语言,g编译c. 编译代码: 上述两种方法均可,code.c是我的c语言文件,mycode是我给编译后产生的二进制文件起的名&#x…

ubuntu22.04下Meshlab打开obj文件闪退——使用Appimage并放入收藏夹中

文章目录 ubuntu22.04下Meshlab打开obj文件闪退,查了下是meshlab的apt没做好。 官网下载:https://www.meshlab.net/#download 赋予权限 sudo chmod a+x MeshLab2023.12-linux.AppImage 双击运行即可 打开权限——下面操作是放在桌面上的 创建桌面快捷方式 # 在 ~/desktop (…

MAVEN的环境配置

在下载好maven后或解压maven安装包后进行环境配置 1.在用户环境变量中 新建一个MAVEN_HOME 地址为MAVEN目录 注:地址为解压后maven文件的根目录!!! 2.在系统环境变量的path中添加该变量 %MAVEN_HOME%\bin 3. 测试maven安装是否成…

强化学习无痛上手笔记第1课

文章目录 Markov Decision ProcessDefinitionRelated Concepts Policy for MDP AgentDefinitionJudgement for PolicyValue FunctionsTD formula for value functionsRelation of V and QPolicy CriterionPolicy Improvement TheoremOptimal PolicyReinforcement Learning Fund…

智能设备上的 AI 移植与部署:新趋势与实践案例

1. 引言:智能设备如何运行 AI? 随着人工智能(AI)技术的快速发展,AI 计算已经从云端走向边缘,嵌入到智能设备中,如智能手机、智能摄像头、机器人、自动驾驶汽车等。这种本地化 AI 计算能够减少延…

【USRP】NVIDIA Sionna:用于 6G 物理层研究的开源库

目录 Sionna:用于 6G 物理层研究的开源库主要特点实现6G研究的民主化支持 5G、6G 等模块化、可扩展、可伸缩快速启动您的研究 好处原生人工智能支持综合研究平台开放生态系统 安装笔记使用 pip 安装基于Docker的安装从源代码安装“你好世界!”探索锡奥纳…

LLM大型语言模型(一)

1. 什么是 LLM? LLM(大型语言模型)是一种神经网络,专门用于理解、生成并对人类文本作出响应。这些模型是深度神经网络,通常训练于海量文本数据上,有时甚至覆盖了整个互联网的公开文本。 LLM 中的 “大” …

BUU44 [BJDCTF2020]ZJCTF,不过如此1 [php://filter][正则表达式get输入数据][捕获组反向引用][php中单双引号]

题目: 我仿佛见到了一位故人。。。也难怪,题目就是ZJCTF 按要求提交/?textdata://,I have a dream&filenext.php后: ......不太行,好像得用filephp://filter/convert.base64-encode/resourcenext.php 耶?那 f…