23- 条件随机场CRF (NLP算法) (算法)

news2025/1/8 19:47:46
  • CRF模型构建 :
crf = sklearn_crfsuite.CRF(c1 = 0.1,c2 = 0.1,max_iterations=100,
                           all_possible_transitions=True)
crf.fit(X_train,y_train)

1、条件随机场CRF概述

将之前所有的观测作为未来预测的依据是不现实的,因为其复杂度会随着观测数量的增加而无限制地增长。因此,就有了马尔科夫模型,即假定未来的预测仅与最近的观测有关,而独立于其他所有的观测。
通过引入隐变量,解决Markov Model需要强独立性的问题,即隐马尔可夫模型 HMM。
隐马尔可夫模型HMM为生成式模型,计算联合概率分布 \bg_white \small P(X,Z)
条件随机场CRF则是判别式模型,计算条件概率 P(Y|X)。由于 CRF 利用最大熵模型的思路建立条件概率模型,对于观测序列并没有做马尔科夫假设,可以得到全局最优,而HMM则是在马尔科夫假设下建立的联合分布,会出现局部最优的情况。(此处Y, Z 均代表隐变量,X 为观测变量)

1.1、马尔可夫 Markov

引例:假设我们观测一个二值变量,这个二值变量表示某一天是否下雨。给定这个变量的一系列观测,我们希望预测下一天是否会下雨。

  • 如果我们将所有的数据都看成独立同分布的, 那么我们能够从数据中得到的唯一的信息就是雨天的相对频率;
  • 然而,我们知道天气经常会呈现出持续若干天的趋势。因此,观测到今天是否下雨对于预测明天是否下雨会有极大的帮助。

我们可以使用概率的乘积规则来表示观测序列的联合概率分布,形式为:

        

利用马尔科夫性(一个马尔可夫过程可以表示为系统在状态转移过程中,第 n 次结果只受第 n-1 次结果的影响,即只与当前状态有关,而与过去状态,即与系统的初始状态和此次转移前的所有状态无关),可以将上式变为一阶马尔科夫链。

        

1.2、隐马尔可夫 HMM

隐变量:离散
观测变量:离散或连续
观测变量和隐变量上的联合概率分布为:

        

HMM可以解决的三个问题:

  • 评估观察序列概率。
  • 模型参数学习。
  • 预测问题/解码问题。

1.3、马尔可夫随机场定义

什么叫随机场(MMF,Markov Random Field)?
随机场是由若干个位置组成的整体,当给每一个位置中按照某种分布随机赋予一个值之后,其全体就叫做随机场。
例:假如我们有一个十个词形成的句子需要做词性标注。这十个词每个词的词性可以在我们已知的词性集合(名词,动词...)中去选择。当我们为每个词选择完词性后,这就形成了一个随机场。

马尔可夫随机场是随机场的一个具有马尔可夫性得特例,它假设随机场中某一个位置的赋值仅仅与和它相邻的位置的赋值有关,和与其不相邻的位置的赋值无关。
例:如果我们假设所有词的词性只和它相邻的词的词性有关时,这个随机场就特化成一个马尔科夫随机场。比如第三个词的词性除了与自己本身的位置有关外,只与第二个词和第四个词的词性有关。

1.4、马尔可夫随机场拆解

马尔可夫随机场(Markov Random Field)包含两层意思。
马尔可夫性质:它指的是一个随机变量序列按时间先后关系依次排开的时候,第N+1时刻的分布特性,与N时刻以前的随机变量的取值无关。拿天气来打个比方。如果我们假定天气是马尔可夫的,其意思就是我们假设今天的天气仅仅与昨天的天气存在概率上的关联,而与前天及前天以前的天气没有关系。其它如传染病和谣言的传播规律,就是马尔可夫的。
随机场:当给每一个位置中按照某种分布随机赋予相空间的一个值之后,其全体就叫做随机场。我们不妨拿种地来打个比方。其中有两个概念:位置(site),相空间(phase space)。"位置"好比是一亩亩农田;"相空间"好比是种的各种庄稼。我们可以给不同的地种上不同的庄稼,这就好比给随机场的每个"位置",赋予相空间里不同的值。所以,通俗的说,随机场就是在哪块地里种什么庄稼的事情。
马尔可夫随机场:马尔科夫随机场是具有马尔科夫特性的随机拿种地打比方,如果任何一块地里种的庄稼的种类仅仅与它邻近的地里种的庄稼的种类有关,与其它地方的庄稼的种类无关,那么这些地里种的庄稼的集合,就是一个马尔可夫随机场。

1.5、条件随机场 CRF

条件随机场 Conditional Random Field 是 马尔可夫随机场 + 隐状态的特例。
区别于生成式的隐马尔可夫模型HMM,CRF是判别式的。
假设我们有训练数据(X,Y),X是属性集合,Y是类别标记。这时来了一个新的样本 x ,我们想要预测它的类别 y。我们最终的目的是求得最大的条件概率 P(y|x)作为新样本的分类。
生成式模型:

一般会对每一个类建立一个模型,有多少个类别,就建立多少个模型。比如说类别标签有{猫,狗,猪},那首先根据猫的特征学习出一个猫的模型,再根据狗的特征学习出狗的模型,之后分别计算新样本 x 跟三个类别的联合概率 P(x|y),然后根据贝叶斯公式:

         

分别计算 P(y|x),选择三类中最大的 P(y|x) 作为样本的分类。与HMM类似,CRF也关心如下三种问题:

  • 评估观察序列概率。
  • 模型参数学习。
  • 预测问题/解码问题。

2、实体命名案例

2.1、三方库安装与导包

import nltk
import sklearn_crfsuite    # crf条件随机场

2.2  数据下载

# 网络设置,跳过安全验证
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
# 下载比较慢,不稳定
# 可以从百度网盘上下载,解压(解压到当前目录C:\Users\likai)到:C:\Users\likai\nltk_data
# nltk.download('conll2002') # 下载数据,下载路径:C:\Users\likai\AppData\Roaming\nltk_data
nltk.corpus.conll2002.fileids()   # 查看数据类别
%%time
train_sents = list(nltk.corpus.conll2002.iob_sents('esp.train'))
test_sents = list(nltk.corpus.conll2002.iob_sents('esp.testb'))
print('训练数据长度:',len(train_sents))      # 8323
print('测试数据的长度:',len(test_sents))     # 1517

2.3  特征处理

def word2features(sent, i):
    word = sent[i][0]
    postag = sent[i][1]
    # 当前词的特征信息
    features = {
        'word.lower()': word.lower(), # 小写形式
        'word[-3:]': word[-3:], # 词切片
        'word[-2:]': word[-2:],
        'word.isupper()': word.isupper(), # 判断是否大写
        'word.istitle()': word.istitle(), # 当前词的首字母大写,其他字母小写判断
        'word.isdigit()': word.isdigit(), # 判断是否是数字
        'postag': postag, # 词性
        'postag[:2]': postag[:2]} # 词性切片,去一部分
  
    # 前一个词的特征信息
    if i > 0:
        word1 = sent[i-1][0]
        postag1 = sent[i-1][1]
        features.update({
            '-1:word.lower()': word1.lower(),
            '-1:word.istitle()': word1.istitle(),
            '-1:word.isupper()': word1.isupper(),
            '-1:postag': postag1,
            '-1:postag[:2]': postag1[:2]})
    else:
        features['BOS'] = True # 表示开始
    
    # 后一个词的特征信息
    if i < len(sent)-1:
        word1 = sent[i+1][0]
        postag1 = sent[i+1][1]
        features.update({
            '+1:word.lower()': word1.lower(),
            '+1:word.istitle()': word1.istitle(),
            '+1:word.isupper()': word1.isupper(),
            '+1:postag': postag1,
            '+1:postag[:2]': postag1[:2]})
    else:
        features['EOS'] = True # 表示结束
    return features # 返回词特征信息

# 文本数据特征提取
def sent2features(sent):
    return [word2features(sent, i) for i in range(len(sent))]
# 文本数据对应词性
def sent2labels(sent):
    return [label for token, postag, label in sent]

2.4  文本特征提取

%%time
X_train = [sent2features(s) for s  in train_sents]
y_train = [sent2labels(s) for s in train_sents]

X_test = [sent2features(s) for s in test_sents]
y_test = [sent2labels(s) for s in test_sents]
display(X_train[0],y_train[0])

2.5  条件随机场建模

%%time
crf = sklearn_crfsuite.CRF(c1 = 0.1,c2 = 0.1,max_iterations=100,
                           all_possible_transitions=True)
crf.fit(X_train,y_train)

2.6  测试数据

y_ = crf.predict(X_test)
display(y_[:2],y_test[:2])
crf.score(X_test,y_test)

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

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

相关文章

【C++提高编程】C++全栈体系(二十)

C提高编程 第三章 STL - 常用容器 二、vector容器 1. vector基本概念 功能&#xff1a; vector数据结构和数组非常相似&#xff0c;也称为单端数组 vector与普通数组区别&#xff1a; 不同之处在于数组是静态空间&#xff0c;而vector可以动态扩展 动态扩展&#xff1a…

小菜版考试系统——“C”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容是小菜版考试系统&#xff0c;最近一直在忙C语言课程设计的事&#xff0c;那么&#xff0c;就请uu们看看我的学习成果吧。 课程设计任务 摘要 题目分析 流程图 关键程序代码 程序运行结果 结论与心得 参…

JVM08 StringTable

StringTable String的基本特性 String&#xff1a;字符串&#xff0c;使用一对 ”” 引起来表示 String s1 “mogublog” ; // 字面量的定义方式String s2 new String(“moxi”); string声明为final的&#xff0c;不可被继承String实现了Serializable接口&#xff1a;表示字…

python 调用 dll 出现精度问题

问题&#xff1a;python 在调用dll 的时候出现了精度问题 总结&#xff1a;使用decimal库进行转换就可以正常传递。 ‘ 心急的朋友可以略过下文了。 心急的朋友可以略过下文了。 心急的朋友可以略过下文了。 心急的朋友可以略过下文了。 ’ 遇到的问题具体情况 dll 生成函数…

手机棋牌游戏开发的流程是怎样的?

最近几年&#xff0c;随着网络游戏的兴起&#xff0c;棋牌手游开发也越来越受欢迎&#xff0c;在国内&#xff0c;几乎随处可见从事手游和手游的公司。不过&#xff0c;虽然公司和产品很多&#xff0c;但效果也不一样&#xff0c;区别就在于&#xff0c;他们能不能掌握好这款游…

实现一个更快的终端彩色文本格式化工具库

终端中打印的五颜六色的彩色文本&#xff0c;你知道是怎么实现的吗&#xff0c;你都知道或用过哪些相关的工具库呢&#xff1f;来一起了解一下吧&#xff01; 在前端项目开发中&#xff0c;说到控制台终端彩色文本格式化&#xff0c;你可能会想到 chalk、picocolors、ansi-colo…

ElasticSearch入门安装与SpringBoot集成实战

介绍 Elasticsearch 是一个实时分布式搜索和分析引擎&#xff0c;一般用于全文搜索、结构化搜索&#xff0c;分析或者三者混用。 它的底层是基于Apache Lucene&#xff08;TM&#xff09;的开源搜索引擎&#xff0c;但是lucene只是一个库&#xff0c;需要java开发然后集成到应…

LeetCode刷题复盘笔记—一文搞懂贪心算法之452. 用最少数量的箭引爆气球(贪心算法系列第十一篇)

今日主要总结一下可以使用贪心算法解决的一道题目&#xff0c;452. 用最少数量的箭引爆气球 题目&#xff1a;452. 用最少数量的箭引爆气球 Leetcode题目地址 题目描述&#xff1a; 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#…

备战蓝桥杯【二维前缀和】

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…

【自学MYSQL】MySQL Windows安装

MySQL Windows安装 MySQL Windows下载 首先&#xff0c;我们打开 MySQL 的官网&#xff0c;网址如下&#xff1a; https://dev.mysql.com/downloads/mysql/在官网的主页&#xff0c;我们首先根据我们的操作系统&#xff0c;选择对应的系统&#xff0c;这里我们选择 Windows&…

神奇的nextTick一定能获取到最新的dom么?

前言 众所周知&#xff0c;vue的dom更新操作时异步的&#xff0c;为了获取更新后的dom官方提供了相应的apinextTick,文档中对该api的描述为&#xff1a;将回调延迟到下次 DOM 更新循环之后执行 , 所谓的下一次&#xff0c;到底是哪一次呢&#xff1f;dom更新是异步任务&#xf…

【数据结构与算法】链表1:移除链表 设计链表链表反转(双指针法、递归法)

文章目录今日任务1.链表理论基础&#xff08;1&#xff09;什么是链表&#xff1f;&#xff08;2&#xff09;链表的类型&#xff08;3&#xff09;链表的存储方式&#xff08;4&#xff09;链表的定义&#xff08;5&#xff09;链表的操作&#xff08;6&#xff09;性能分析2.…

【设计模式】综述

设计模式概述 文章目录一、设计模式1. 基本简介2. 面向对象设计原则二、基本类别1. 创建型模式会更新每种模式的详细博客超链接&#xff0c;敬请期待呀参考博客&#x1f60a;点此到文末惊喜↩︎ 一、设计模式 1. 基本简介 定义&#xff1a;设计模式是一个针对重复发生的问题的…

使用HTTP隧道代理,请求超过频率要怎么办?

在网上&#xff0c;经常会看到有人说使用隧道代理经常遇到429错误&#xff08;请求超过频率&#xff09;&#xff0c;我们要如何解决这一问题呢&#xff1f;通常情况&#xff0c;优质的HTTP代理厂商隧道代理服务器采用的是高性能主机构建的动态IP代理服务器&#xff0c;是可以支…

IO流

标题IO流的体系结构FileReader和FileWriterFileReader读入数据的基本操作FileReader中使用read(char [] cbuf)读入数据FileWriter写出数据字节流使用FileInputStream和FileOutputStream读写文本文件使用FileInputStream和FileOutputStream读写非文本文件缓冲流缓冲流&#xff0…

智慧校园平台源码:实现互联互通的校园管理一体化

智慧校园管理平台主要以校园安全、智慧校园数据管理云平台为核心&#xff0c;实现数据统一管理&#xff0c;以智慧电子班牌为学生智慧之窗&#xff0c;以移动管理平台、家校沟通为辅。实现教师—家长一学校—学生循环的无纸化管理模式及教学服务&#xff0c;实现多领域的信息互…

【JavaSE】Lambda、Stream(659~686)

659.每天一考 1.写出获取Class实例的三种常见方式 Class clazz1 String.class; Class clazz2 person.getClass(); //sout(person); //xxx.yyy.zzz.Person... Class clazz3 Class.forName(String classPath);//体现反射的动态性2.谈谈你对Class类的理解 Class实例对应着加载…

小小bat-day1-自动文件上传

前言&#xff1a;日常服务器备份文件或者生产设备等数据文件都统一保存至文件服务器&#xff0c;进行日志分析或者将生产文件CSV、图片等转存至数仓进行数据分析&#xff0c;尤其生产的部分数据是保存在个人电脑的PC端&#xff0c;数据杂&#xff0c;获取困难&#xff0c;手动整…

day45【代码随想录】动态规划之完全平方数、单词拆分、打家劫舍、打家劫舍 II

文章目录前言一、完全平方数&#xff08;力扣279&#xff09;二、单词拆分&#xff08;力扣139&#xff09;三、打家劫舍&#xff08;力扣198&#xff09;四、打家劫舍 II前言 1、完全平方数 2、单词拆分 3、打家劫舍 4、打家劫舍 II 一、完全平方数&#xff08;力扣279&#…

2023软考报名(上半年)报名什么时候开始?-弘博创新

2023软考报名&#xff08;上半年&#xff09;报名预计在3月底-4月初开始&#xff0c;现在可以先进入备考了&#xff0c;参加学习可以到弘博创新&#xff0c;专业考前辅导多年&#xff0c;专业靠谱&#xff01; 系统集成项目管理工程师是全国计算机技术与软件专业技术资格&#…