会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132358个问题

通俗解释:概率图模型是NLP的“逻辑推理工具箱”

想象你要教一个机器人理解下面这句话:

“苹果很好吃,但苹果公司的手机也很贵。”

这里的两个“苹果”含义完全不同:

  • 第一个“苹果”是水果;

  • 第二个“苹果”是公司名称。

人类如何区分?
我们会根据上下文(“很好吃”和“公司”)判断词义。而概率图模型就是让计算机学会这种“上下文推理”的工具。


示例:用概率图模型解决NLP问题

1. 贝叶斯分类算法:垃圾邮件过滤

  • 原理:基于贝叶斯定理,计算某封邮件是垃圾邮件的概率。

  • 通俗解释:如果邮件中出现“免费”“中奖”等词,这些词在垃圾邮件中出现的概率更高,贝叶斯算法会综合这些词的概率来判断是否是垃圾邮件。

from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import CountVectorizer
# 训练数据:邮件内容 + 标签(0=正常,1=垃圾)
emails = ["点击领取免费奖品", "今晚开会讨论项目", "立即领取优惠券"]
labels = [1, 0, 1]
# 将文本转化为词频向量
vectorizer = CountVectorizer()X = vectorizer.fit_transform(emails)
# 训练贝叶斯分类器
model = MultinomialNB()model.fit(X, labels)
# 预测新邮件
new_email = ["今晚领取免费优惠券"]
prediction = model.predict(vectorizer.transform(new_email))
print("是垃圾邮件吗?", "是" if prediction[0] == 1 else "否")
# 输出:是垃圾邮件吗? 是


2. 隐含马尔可夫模型(HMM):词性标注

  • 原理:假设当前词的词性只依赖前一个词性(马尔可夫假设)。

  • 通俗解释:比如句子“猫吃鱼”,HMM会计算:

    • “猫”是名词的概率 → 高;

    • “吃”是动词的概率(如果前一个词是名词) → 高;

    • “鱼”是名词的概率(如果前一个词是动词) → 高。

import nltk

from nltk import hmm

# 训练数据:句子和对应的词性标签

train_data = [

    ("I love cats", ["PRON", "VERB", "NOUN"]),

    ("Cats eat fish", ["NOUN", "VERB", "NOUN"])

]

# 提取词性转移概率和发射概率

trainer = nltk.HiddenMarkovModelTrainer()

model = trainer.train_supervised(train_data)

# 预测新句子的词性

sentence = "I eat fish"

tags = model.tag(nltk.word_tokenize(sentence))

print(tags)

# 输出:[('I', 'PRON'), ('eat', 'VERB'), ('fish', 'NOUN')]


3. 条件随机场(CRF):命名实体识别

  • 原理:考虑整个句子的上下文信息,比HMM更灵活。

  • 通俗解释:在句子“马云在杭州创立了阿里巴巴”中:

    • HMM可能只根据“马云”和“阿里巴巴”单独判断;

    • CRF会结合“创立”“杭州”等上下文,更准确识别“马云”为人名,“阿里巴巴”为公司名。

import sklearn_crfsuite

# 训练数据:句子中的每个词及其特征(前后词、词性等)

train_data = [

    {

        'words': ['马云', '在', '杭州', '创立', '了', '阿里巴巴'],

        'labels': ['B-PER', 'O', 'B-LOC', 'O', 'O', 'B-ORG']

    }

]

# 定义特征函数:当前词、前一个词、词性等

def extract_features(sentence, i):

    word = sentence[i]

    features = {

        'word': word,

        'is_first_word': (i == 0),

        'is_last_word': (i == len(sentence)-1)

    }

    return features

# 训练CRF模型

X_train = [[extract_features(sent['words'], i) for i in range(len(sent['words']))] for sent in train_data]

y_train = [sent['labels'] for sent in train_data]


crf = sklearn_crfsuite.CRF()

crf.fit(X_train, y_train)


# 预测新句子

new_sentence = ['李彦宏', '在', '北京', '创办', '了', '百度']

X_new = [extract_features(new_sentence, i) for i in range(len(new_sentence))]

pred_labels = crf.predict_single(X_new)

print(list(zip(new_sentence, pred_labels)))

# 输出:[('李彦宏', 'B-PER'), ('在', 'O'), ('北京', 'B-LOC'), ('创办', 'O'), ('了', 'O'), ('百度', 'B-ORG')]


为什么概率图模型对NLP很重要?

  1. 处理不确定性:语言充满歧义(比如“苹果”),概率图模型能计算不同解释的可能性。

  2. 建模上下文依赖:HMM和CRF可以捕捉词与词之间的依赖关系(如动词后接名词)。

  3. 灵活的特征工程:CRF允许自定义特征(词性、词形、前后缀等),提升模型表现。

人工智能/第九阶段:机器学习-概率图模型/条件随机场 1楼
人工智能/第九阶段:机器学习-概率图模型/最大熵马尔可夫模型 2楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637