crf

Pytorch Bi-LSTM + CRF 代码详解

安稳与你 提交于 2019-12-02 01:16:21
久闻LSTM + CRF的效果强大,最近在看Pytorch官网文档的时候,看到了这段代码,前前后后查了很多资料,终于把代码弄懂了。我希望在后来人看这段代码的时候,直接就看我的博客就能完全弄懂这段代码。 看这个博客之前,我首先建议看看 Pytorch 关于Bi-LSTM + CRF的解释 看完再看看这位的博客 Bi-LSTM-CRF for Sequence Labeling PENG 这两部分内容都看完了之后,我就接着上面这位的博客继续讲,他讲的很好了,只是没有讲的更细致。 首先我们来看看Score的定义: 这部分博主的解释很详细了,这里我想多提醒一下的是,我们的每一个Score都是对应于一个完整的路径,举例说 【我 爱 中国人民】对应标签【N V N】那这个标签就是一个完整的路径,也就对应一个Score值。 接下来我想讲的是这个公式 这个公式成立是很显然的,动笔算一算就知道了,代码里其实就是用了这个公式的原理,但是这位博主并没有详细解释代码是怎么实现这个公式的,所以我就写下这篇博客来完成这位博主没有做完的工作。 先上代码 def _forward_alg(self, feats): # Do the forward algorithm to compute the partition function init_alphas = torch.Tensor(1, self

Hanlp等七种优秀的开源中文分词库推荐

心已入冬 提交于 2019-12-01 08:28:47
中文分词是中文文本处理的基础步骤,也是中文人机自然语言交互的基础模块。由于中文句子中没有词的界限,因此在进行中文自然语言处理时,通常需要先进行分词。 纵观整个开源领域,陆陆续续做中文分词的也有不少,不过目前仍在维护的且质量较高的并不多。下面整理了一些个人认为比较优秀的中文分词库,以供大家参考使用。 1、 HanLP —— 汉语言处理包 HanLP是一系列模型与算法组成的NLP工具包,由大快搜索主导并完全开源,目标是普及自然语言处理在生产环境中的应用。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。 HanLP提供下列功能: 中文分词 HMM-Bigram(速度与精度最佳平衡;一百兆内存) 最短路分词、N-最短路分词 由字构词(侧重精度,可识别新词;适合NLP任务) 感知机分词、CRF分词 词典分词(侧重速度,每秒数千万字符;省内存) 极速词典分词 所有分词器都支持: 索引全切分模式 用户自定义词典 兼容繁体中文 训练用户自己的领域模型 词性标注 HMM词性标注(速度快) 感知机词性标注、CRF词性标注(精度高) 命名实体识别 基于HMM角色标注的命名实体识别 (速度快) 中国人名识别、音译人名识别、日本人名识别、地名识别、实体机构名识别 基于线性模型的命名实体识别(精度高) 感知机命名实体识别、CRF命名实体识别 关键词提取 TextRank关键词提取

条件随机场CRF原理介绍 以及Keras实现

夙愿已清 提交于 2019-12-01 05:35:44
本文是对CRF基本原理的一个简明的介绍。当然,“简明”是相对而言中,要想真的弄清楚CRF,免不了要提及一些公式,如果只关心调用的读者,可以直接移到文末。 图示 # 按照之前的思路,我们依旧来对比一下普通的逐帧softmax和CRF的异同。 逐帧softmax # CRF主要用于序列标注问题,可以简单理解为是 给序列中的每一帧都进行分类 ,既然是分类,很自然想到将这个序列用CNN或者RNN进行编码后,接一个全连接层用softmax激活,如下图所示 逐帧softmax并没有直接考虑输出的上下文关联 条件随机场 # 然而,当我们设计标签时,比如用s、b、m、e的4个标签来做字标注法的分词,目标输出序列本身会带有一些上下文关联,比如s后面就不能接m和e,等等。逐标签softmax并没有考虑这种输出层面的上下文关联,所以它意味着把这些关联放到了编码层面,希望模型能自己学到这些内容,但有时候会“强模型所难”。 而CRF则更直接一点,它 将输出层面的关联分离了出来 ,这使得模型在学习上更为“从容”: CRF在输出端显式地考虑了上下文关联 数学 # 当然,如果仅仅是引入输出的关联,还不仅仅是CRF的全部,CRF的真正精巧的地方,是它 以路径为单位,考虑的是路径的概率 。 模型概要 # 假如一个输入有 n n 帧,每一帧的标签有 k k 种可能性,那么理论上就有 k n kn 中不同的输出

CRF系列——一个简单的例子

我与影子孤独终老i 提交于 2019-11-30 22:05:28
CRF可以应用于对一串序列进行自动标注的问题。例如对文字序列进行词性标,即要自动判断句子中每个单词的词性。在这样的问题中,每一个词的标注结果,不仅依赖于该词语本身,还会依赖于其他词语的标注结果。CRF可以考虑到这样的依赖关系。 本文会以一个词性标注的应用为例,介绍CRF所解决的问题以及CRF模型的建立,学习与预测过程。 任务描述 词性标注 (part-of-speech tagging),其目标就是对一个句子即一串单词的序列进行打标签(tagging),标注每个词的词性(ADJECTIVE, NOUN, PREPOSITION, VERB, ADVERB, ARTICLE)。我们假设在词性标准任务中, 每个单词的词性不仅依赖其本身,而且也会依赖其前一个单词 (这里做了简化,实际上每个单词的标注结果依赖更多东西)。 下面,我将针对对这个问题,建立一个简单的线性链条件随机场(linear-chain CRF)。并介绍这个CRF是如何表示上述的依赖关系,以及如何利用这个CRF来求解这个问题。 实际上,和其他的统计机器学习模型一样,我们有三个任务要完成: 1)指定模型参数(建立模型) 2)估计这些参数(学习) 3)利用这些参数进行预测(预测) 第一个任务——建立模型 特征函数 为了评价序列中每个单词属于各个tag的可能性,我们要根据单词的位置定义一系列 特征函数 (feature

CRF系列——一个简单的例子

对着背影说爱祢 提交于 2019-11-30 22:05:19
CRF可以应用于对一串序列进行自动标注的问题。例如对文字序列进行词性标,即要自动判断句子中每个单词的词性。在这样的问题中,每一个词的标注结果,不仅依赖于该词语本身,还会依赖于其他词语的标注结果。CRF可以考虑到这样的依赖关系。 本文会以一个词性标注的应用为例,介绍CRF所解决的问题以及CRF模型的建立,学习与预测过程。 任务描述 词性标注 (part-of-speech tagging),其目标就是对一个句子即一串单词的序列进行打标签(tagging),标注每个词的词性(ADJECTIVE, NOUN, PREPOSITION, VERB, ADVERB, ARTICLE)。我们假设在词性标准任务中, 每个单词的词性不仅依赖其本身,而且也会依赖其前一个单词 (这里做了简化,实际上每个单词的标注结果依赖更多东西)。 下面,我将针对对这个问题,建立一个简单的线性链条件随机场(linear-chain CRF)。并介绍这个CRF是如何表示上述的依赖关系,以及如何利用这个CRF来求解这个问题。 实际上,和其他的统计机器学习模型一样,我们有三个任务要完成: 1)指定模型参数(建立模型) 2)估计这些参数(学习) 3)利用这些参数进行预测(预测) 第一个任务——建立模型 特征函数 为了评价序列中每个单词属于各个tag的可能性,我们要根据单词的位置定义一系列 特征函数 (feature

CRF实现NER

北城余情 提交于 2019-11-30 04:14:23
1. NER(命名实体识别)   NER,英文全称:Named Entity Recognition。主要是用来识别一段文本中哪些是物体的名字,比如人名、公司名。   常见算法如下: 2. CRF (条件随机场)   CRF(Conditional random field,条件随机场)是一种 判别式模型 (HMM是生成式模型)。是给定一组输入随机变量条件下另一组输出随机变量的条件概率分布模型,其特点是假设输出随机变量构成马尔可夫(Markov)随机场。 3. 标签体系   对于NER任务,常见的标签体系包括IO、BIO、BMEWO、BMEWO+。下面举例说明不同标签体系的区别。 4. 开源工具   CRF++:C++实现,提供python 和 java接口。 详情参考 这里 。   NLTK : Python 的自然语言处理工具箱,使用方式参考 这里 。   Stanford NLP: Java 实现,但是集成到了 NLTK 里,所以也可以使用 Python。详情参考 这里 。   Sklearn_crfsuite: Python 的一个包,使用方式参考 这里 。 来源: https://www.cnblogs.com/chen8023miss/p/11558320.html

pyhanlp 中文词性标注与分词简介

谁说我不能喝 提交于 2019-11-30 03:11:06
pyhanlp 中文词性 标注 与分词简介 pyhanlp实现的分词器有很多,同时pyhanlp获取hanlp中分词器也有两种方式 第一种是直接从封装好的hanlp类中获取,这种获取方式一共可以获取五种分词器,而现在默认的就是第一种维特比分词器 1. 维特比 (viterbi):效率和效果的最佳平衡。也是最短路分词,HanLP最短路求解采用Viterbi算法 2. 双数组trie树 (dat):极速词典分词,千万字符每秒(可能无法获取词性,此处取决于你的词典) 3. 条件随机场 (crf):分词、词性标注与命名实体识别精度都较高,适合要求较高的NLP任务 4. 感知机 (perceptron):分词、词性标注与命名实体识别,支持在线学习 5. N最短路 (nshort):命名实体识别稍微好一些,牺牲了速度 第二种方式是使用JClass直接获取java类,然后使用。这种方式除了获取上面的五种分词器以外还可以获得一些其他分词器,如NLP分词器,索引分词,快速词典分词等等 两种使用方式的对比 第一种是使用作者给的HanLP直接获取分词器,直接segment() 会获取 默认的标准分词器也就是维特比分词器,也**可以使用newSegment函数,传入上面的分词器英文名称来获取新的分词器,如使用HanLP.newSegment("crf")来获取CRF分词器。*

pyhanlp 停用词与用户自定义词典功能详解

对着背影说爱祢 提交于 2019-11-30 03:10:51
hanlp的词典模式 之前我们看了hanlp的词性标注,现在我们就要使用自定义词典与停用词功能了,首先关于HanLP的词性标注方式具体请看HanLP词性标注集。 其核心词典形式如下: 自定义词典 自定义词典有多种添加模式,首先是展示的一个小例子,展示了词汇的动态增加与强行插入,删除等。更复杂的内容请参考后边的第二段代码。 简单的例子 from pyhanlp import * text = "攻城狮逆袭单身狗,迎娶白富美,走上人生巅峰" # 怎么可能噗哈哈! print(HanLP.segment(text)) CustomDictionary = JClass("com.hankcs.hanlp.dictionary.CustomDictionary") CustomDictionary.add("攻城狮") # 动态增加 CustomDictionary.insert("白富美", "nz 1024") # 强行插入 #CustomDictionary.remove("攻城狮"); # 删除词语(注释掉试试) CustomDictionary.add("单身狗", "nz 1024 n 1") # 展示该单词词典中的词频统计 展示分词 print(CustomDictionary.get("单身狗")) print(HanLP.segment(text)) # 增加用户词典

简单的NER模型实现——CRF+LSTM

僤鯓⒐⒋嵵緔 提交于 2019-11-29 21:25:17
记录从零到实现CRF+LSTM的整个过程 查找概述,了解实现的过程【1h30min】 建立模型【3h30min】 阅读代码,对于实现细节有进一步的了解【4h】 自己手动实现【】 背景知识 NER 神经网络 成为可以有效处理许多NLP任务的模型。这类方法对于序列标注任务(如CWS、POS、NER)的处理方式是类似的,将 token 从离散one-hot表示 映射到低维空间中成为稠密的embedding ,随后将句子的embedding序列 输入到RNN中 ,用神经网络 自动提取特征 , Softmax来预测每个token的标签 。 缺点在于对于token打标签的时候是独立的分类,不能够直接利用上文已经预测的标签。 为了解决这个问题,提出LSTM+CRF模型做序列标注,在LSTM层后接入CRF层来做句子级别的标签预测,使得标注过程不再是对各个token独立分类。 LSTM 信息来源:《Neural Network Methods for NLP》 LSTM,即为Long Short-Term Memory,是目前最成功的 RNN架构 类型之一。 从名字可以看出,其设计的主要目的是 解决RNN的梯度消失问题和梯度爆炸问题 。门机制能够使得与记忆部分相关的梯度保留很长时间。因此,RNN能够在更长的序列中有更好的表现。 主要手段是首次引入 门机制 。所谓的门机制,简单来说,就是利用一个0

Hanlp中使用纯JAVA实现CRF分词

自作多情 提交于 2019-11-29 18:54:57
与基于隐马尔可夫模型的最短路径分词、N-最短路径分词相比,基于条件随机场(CRF)的分词对未登录词有更好的支持。本文(HanLP)使用纯Java实现CRF模型的读取与维特比后向解码,内部特征函数采用 双数组Trie树(DoubleArrayTrie)储存,得到了一个高性能的中文分词器。 开源项目 本文代码已集成到HanLP中开源: http://hanlp.com/ CRF简介 CRF是序列标注场景中常用的模型,比HMM能利用更多的特征,比MEMM更能抵抗标记偏置的问题。 CRF训练 这类耗时的任务,还是交给了用C++实现的CRF++。关于CRF++输出的CRF模型,请参考《CRF++模型格式说明》。 CRF解码 解码采用维特比算法实现。并且稍有改进,用中文伪码与白话描述如下: 首先任何字的标签不仅取决于它自己的参数,还取决于前一个字的标签。但是第一个字前面并没有字,何来标签?所以第一个字的处理稍有不同,假设第0个字的标签为X,遍历X计算第一个字的标签,取分数最大的那一个。 如何计算一个字的某个标签的分数呢?某个字根据CRF模型提供的模板生成了一系列特征函数,这些函数的输出值乘以该函数的权值最后求和得出了一个分数。该分数只是“点函数”的得分,还需加上“边函数”的得分。边函数在本分词模型中简化为f(s',s),其中s'为前一个字的标签,s为当前字的标签。于是该边函数就可以用一个4