我需要在最后实现一个带有CRF层的双向LSTM网络.特别是本文提出的模型,并对其进行训练.
http://www.aclweb.org/anthology/P15-1109
我想用Python实现它.任何人都可以提供一些库或示例代码来说明如何做到这一点.我看了PyBrain,但真的不明白.
我也对其他编程语言的工具包持开放态度.
我使用的是python2.7,nltk 3.2.1和python-crfsuite 0.8.4.我关注此页面:http://www.nltk.org/api/nltk.tag.html?hilight = stanford = nltk.tag.stanford.NERTagger for nltk.tag.crf module.
首先,我只是运行它
from nltk.tag import CRFTagger
ct = CRFTagger()
train_data = [[('dfd','dfd')]]
ct.train(train_data,"abc")
Run Code Online (Sandbox Code Playgroud)
我也尝试过这个
f = open("abc","wb")
ct.train(train_data,f)
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误,
File "C:\Python27\lib\site-packages\nltk\tag\crf.py", line 129, in <genexpr>
if all (unicodedata.category(x) in punc_cat for x in token):
TypeError: must be unicode, not str
Run Code Online (Sandbox Code Playgroud) model= Sequential()
model.add(keras.layers.Embedding(vocab_size,output_dim=100,input_length=input_len,weights=[embedding_matrix],trainable=False))
model.add(keras.layers.Bidirectional(keras.layers.LSTM(512, return_sequences=True,recurrent_dropout=0.2, dropout=0.2)))
model.add(keras.layers.Bidirectional(keras.layers.LSTM(512, return_sequences=True,recurrent_dropout=0.2, dropout=0.2)))
model.add(keras.layers.Dense(128, activation="relu"))
model.add(keras.layers.TimeDistributed(keras.layers.Dense(vocab_size_label, activation="softmax")))
model.compile(optimizer=optim,loss='sparse_categorical_crossentropy',metrics=["accuracy"])
model.summary()
Run Code Online (Sandbox Code Playgroud)
我已经为 NER Tagging 构建了一个 Bi-lstm 模型,现在我想在其中引入 CRF 层。我很困惑如何使用 Tensorflow 插入 CRF 层
tfa.text.crf_log_likelihood(
inputs,
tag_indices,
sequence_lengths,
transition_params=None
)
Run Code Online (Sandbox Code Playgroud)
我在 tfa.txt 中找到了这个,并且有 3 个关于这个函数的查询: 1. 我如何传递这些参数?2. 我是否必须在编译器中将此输出用作损失(log_likelihood 的负数)。有人可以帮助我吗?
什么是条件随机场?精确的条件随机字段如何在结构化或非结构化文本中将专有名称标识为人员,组织或地点?
例如:本产品由StackOverFlow Inc.订购.
条件随机字段如何将StackOverFlow Inc.识别为一个组织?
metadata named-entity-recognition information-extraction crf
我是CRF ++的新手.我正在教自己查看它的手册:http: //crfpp.googlecode.com/svn/trunk/doc/index.html?source = navbar#templ
我不明白这意味着什么:
这是一个描述unigram功能的模板.当你给一个
模板"U01:%x [0,1]",CRF ++自动生成一组功能
函数(func1 ... funcN)如:
func1 = if(output = B-NP and feature ="U01:DT")返回1否则返回0
func2 = if(output = I-NP and feature ="U01:DT")返回1否则返回0
func3 = if(output = O and feature ="U01:DT")返回1否则返回0
.... funcXX = if(output = B-NP and feature ="U01:NN")返回1否则返回0
funcXY = if(output = O and feature ="U01:NN")return 1 else return 0.模板生成的要素函数数量
等于(L*N),其中L是输出的数量
为什么Unigram功能有很多行,它们是什么意思?
我想实现句子级对数似然,如 Collobert等人所述.,p.14.
要计算转换分数,我可以使用CRF,但我不知道如何将它集成到tensorflow中.我想过使用 tf.contrib.crf.CrfForwardRnnCell来计算转换分数,但是这个类返回一对包含新alpha值的[batch_size,num_tags]矩阵值,而不是像我期望的那样[batch_size,num_tags,num_tags]张量.
有没有人有一个如何在张量流中使用CRF的例子?谢谢!
我正在寻找有关编写/了解MALLET课程的人.我知道它是ML问题的一个很好的工具,现在我尝试实现这里描述的基于CRF的距离算法Andrew McCallum,Kedar Bellare和Fernando Pereira.
作者告诉他们,他们已经将所提出的模型实现为Mallet FST类.令人遗憾的是,java并不是我所熟知的Ruby语言,这就是为什么我有一些问题需要理解如何使用他们的模型,例如哪些类,我坚持缺乏大型Mallet类结构中的文档.
听听一些如何用Mallet实现算法的指导信息会很高兴.
我已经训练了一个CRF GenericAcrfTui
,它写了ACRF
一个文件.我不太确定如何加载和使用训练有素的CRF但是
import cc.mallet.grmm.learning.ACRF;
import cc.mallet.util.FileUtils;
ACRF c = (ACRF) FileUtils.readObject(Paths.get("acrf.ser.gz").toFile());
Run Code Online (Sandbox Code Playgroud)
似乎工作.但是,标签似乎不正确,似乎依赖于我传递的标签作为输入. 如何使用加载的ACRF进行标记?
这是我做标签的方式:
GenericAcrfData2TokenSequence instanceMaker = new GenericAcrfData2TokenSequence();
instanceMaker.setDataAlphabet(c.getInputAlphabet());
instanceMaker.setIncludeTokenText(true);
instanceMaker.setFeaturesIncludeToken(true);
instanceMaker.setLabelsAtEnd(false);
Pipe pipe = new SerialPipes(new Pipe[] {
instanceMaker,
new TokenSequence2FeatureVectorSequence(c.getInputAlphabet(),
true, false),
});
InstanceList testing = new InstanceList(pipe);
Iterator<Instance> testSource = new LineGroupIterator(
// initialize the labels to O
new StringReader("O O ---- what W=the@1 W=hell@2\n"
+ "O O ---- the W=what@-1 W=hell@1\n"
+ "O O ---- hell W=what@-2 W=the@-1"),
Pattern.compile("^\\s*$"), true); …
Run Code Online (Sandbox Code Playgroud) 这个问题是的扩展这一个着重于LSTM相对于CRF.不幸的是,我对CRF没有任何经验,这就是我提出这些问题的原因.
问题:
我想预测多个非独立组的二进制信号序列.我的数据集中等很小(每组约1000条记录),所以我想在这里尝试一个CRF模型.
可用数据:
我有一个包含以下变量的数据集:
使用此数据集我想预测group_a_activity
,group_b_activity
哪些都是0或1.
请注意,这些组被认为是交叉相关的,并且可以从时间戳中提取其他功能 - 为简单起见,我们可以假设我们只从时间戳中提取了一个功能.
到目前为止我所拥有的:
以下是您可以在自己的计算机上重现的数据设置.
# libraries
import re
import numpy as np
import pandas as pd
data_length = 18 # how long our data series will be
shift_length = 3 # how long of a sequence do we want
df = (pd.DataFrame # create a sample dataframe
.from_records(np.random.randint(2, size=[data_length, 3]))
.rename(columns={0:'a', 1:'b', 2:'extra'}))
df.head() # check it out
# shift (assuming data is sorted …
Run Code Online (Sandbox Code Playgroud) keras
我使用&实现了带有条件随机场层 (BiLSTM-CRF) 的双向长短期记忆神经网络 (BiLSTM-CRF) keras_contrib
(后者用于实现 CRF,它不是本机的一部分keras functionality
。该任务被命名为实体识别分类为 6 种之一)网络的输入是一系列 300 维预训练的 GloVe 词嵌入。这是我的模型摘要:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 648) 0
_________________________________________________________________
embedding_1 (Embedding) (None, 648, 300) 1500000
_________________________________________________________________
bidirectional_1 (Bidirection (None, 648, 10000) 3204000
_________________________________________________________________
crf_1 (CRF) (None, 648, 6) 6054
=================================================================
Run Code Online (Sandbox Code Playgroud)
现在我想在TensorFlow
1.15 中实现相同的模型。由于 keras_contrib CRF 模块仅适用于 keras 而不适用于 TensorFlow,因此我使用了此TensorFlow
存储库中为 1.X构建的 CRF 实现。该存储库包含两个很好的 CRF 示例实现(此处),但在使用我的数据进行训练时,每个示例都会产生不同的错误。
实施1
from tensorflow.keras.layers import Bidirectional, Embedding, LSTM, TimeDistributed …
Run Code Online (Sandbox Code Playgroud)