通俗解释:概率图模型是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):词性标注
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更灵活。
通俗解释:在句子“马云在杭州创立了阿里巴巴”中:
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很重要?
处理不确定性:语言充满歧义(比如“苹果”),概率图模型能计算不同解释的可能性。
建模上下文依赖:HMM和CRF可以捕捉词与词之间的依赖关系(如动词后接名词)。
灵活的特征工程:CRF允许自定义特征(词性、词形、前后缀等),提升模型表现。