@@ -375,4 +375,4 @@ fastNLP提供了Trainer对象来组织训练过程,包括完成loss计算(所 | |||||
.. raw:: html | .. raw:: html | ||||
<a href="../_static/notebooks/%E6%96%87%E6%9C%AC%E5%88%86%E7%B1%BB.ipynb" download="文本分类.ipynb">点击下载 IPython Notebook 文件 </a> | |||||
<a href="../_static/notebooks/%E6%96%87%E6%9C%AC%E5%88%86%E7%B1%BB.ipynb" download="文本分类.ipynb">点击下载 IPython Notebook 文件 </a><hr> |
@@ -154,3 +154,9 @@ csv 表格 | |||||
:meth:`fastNLP.DataSet.apply` | :meth:`fastNLP.DataSet.apply` | ||||
下面这个代码是不可行的,必须要用 r""" 才行: | |||||
.. code:: | |||||
:param float beta: f_beta分数, :math:`f_{beta} = \frac{(1 + {beta}^{2})*(pre*rec)}{({beta}^{2}*pre + rec)}` . 常用为 `beta=0.5, 1, 2` 若为0.5则精确率的权重高于召回率;若为1,则两者平等;若为2,则召回率权重高于精确率。 | |||||
@@ -44,7 +44,7 @@ __all__ = [ | |||||
"AutoPadder", | "AutoPadder", | ||||
"EngChar2DPadder", | "EngChar2DPadder", | ||||
"CollectFn", | |||||
# "CollectFn", | |||||
"ConcatCollectFn", | "ConcatCollectFn", | ||||
"MetricBase", | "MetricBase", | ||||
@@ -260,51 +260,51 @@ class DataSetIter(BatchIter): | |||||
class TorchLoaderIter(BatchIter): | class TorchLoaderIter(BatchIter): | ||||
""" | """ | ||||
与DataSetIter类似,但可以用于非fastNLP的数据容器对象,然后将其传入到Trainer中。 | 与DataSetIter类似,但可以用于非fastNLP的数据容器对象,然后将其传入到Trainer中。 | ||||
只需要保证数据容器实现了实现了以下的方法 | |||||
只需要保证数据容器实现了实现了以下的方法 | |||||
Example:: | |||||
import random | |||||
from fastNLP import TorchLoaderIter | |||||
import torch | |||||
class UdfDataSet: | |||||
def __init__(self, num_samples): | |||||
self.num_samples = num_samples | |||||
def __getitem__(self, idx): # 必须实现的方法,输入参数是一个int,范围为[0, len(self)) | |||||
x = [random.random() for _ in range(3)] | |||||
y = random.random() | |||||
return x,y | |||||
def __len__(self): # 需要实现该方法返回值需要是一个int数据 | |||||
return self.num_samples | |||||
# 需要实现collact_fn将数据转换为tensor | |||||
def collact_fn(data_list): | |||||
# [(x1,y1), (x2,y2), ...], 这里的输入实际上是将UdfDataSet的__getitem__输入结合为list | |||||
xs, ys = [], [] | |||||
for l in data_list: | |||||
x, y = l | |||||
xs.append(x) | |||||
ys.append(y) | |||||
# 不需要转移到gpu,Trainer或Tester会将其转移到model所在的device | |||||
x,y = torch.FloatTensor(xs), torch.FloatTensor(ys) | |||||
return {'x':x, 'y':y}, {'y':y} | |||||
Example:: | |||||
udf_dataset = UdfDataSet(10) | |||||
dataset = TorchLoaderIter(udf_dataset, collate_fn=collact_fn) | |||||
class Model(nn.Module): | |||||
def __init__(self): | |||||
super().__init__() | |||||
self.fc = nn.Linear(3, 1) | |||||
def forward(self, x, y): | |||||
return {'loss':torch.pow(self.fc(x).squeeze(-1)-y, 2).sum()} | |||||
def predict(self, x): | |||||
return {'pred':self.fc(x).squeeze(0)} | |||||
model = Model() | |||||
trainer = Trainer(train_data=dataset, model=model, loss=None, print_every=2, dev_data=dataset, | |||||
metrics=AccuracyMetric(target='y'), use_tqdm=False) | |||||
trainer.train(load_best_model=False) | |||||
import random | |||||
from fastNLP import TorchLoaderIter | |||||
import torch | |||||
class UdfDataSet: | |||||
def __init__(self, num_samples): | |||||
self.num_samples = num_samples | |||||
def __getitem__(self, idx): # 必须实现的方法,输入参数是一个int,范围为[0, len(self)) | |||||
x = [random.random() for _ in range(3)] | |||||
y = random.random() | |||||
return x,y | |||||
def __len__(self): # 需要实现该方法返回值需要是一个int数据 | |||||
return self.num_samples | |||||
# 需要实现collact_fn将数据转换为tensor | |||||
def collact_fn(data_list): | |||||
# [(x1,y1), (x2,y2), ...], 这里的输入实际上是将UdfDataSet的__getitem__输入结合为list | |||||
xs, ys = [], [] | |||||
for l in data_list: | |||||
x, y = l | |||||
xs.append(x) | |||||
ys.append(y) | |||||
# 不需要转移到gpu,Trainer或Tester会将其转移到model所在的device | |||||
x,y = torch.FloatTensor(xs), torch.FloatTensor(ys) | |||||
return {'x':x, 'y':y}, {'y':y} | |||||
udf_dataset = UdfDataSet(10) | |||||
dataset = TorchLoaderIter(udf_dataset, collate_fn=collact_fn) | |||||
class Model(nn.Module): | |||||
def __init__(self): | |||||
super().__init__() | |||||
self.fc = nn.Linear(3, 1) | |||||
def forward(self, x, y): | |||||
return {'loss':torch.pow(self.fc(x).squeeze(-1)-y, 2).sum()} | |||||
def predict(self, x): | |||||
return {'pred':self.fc(x).squeeze(0)} | |||||
model = Model() | |||||
trainer = Trainer(train_data=dataset, model=model, loss=None, print_every=2, dev_data=dataset, | |||||
metrics=AccuracyMetric(target='y'), use_tqdm=False) | |||||
trainer.train(load_best_model=False) | |||||
除此之外,还可以通过该方法实现OnTheFly的训练,如下面的代码所示 | 除此之外,还可以通过该方法实现OnTheFly的训练,如下面的代码所示 | ||||
@@ -321,7 +321,7 @@ class TorchLoaderIter(BatchIter): | |||||
data.append(x + [y]) | data.append(x + [y]) | ||||
with open(tmp_file_path, 'w') as f: | with open(tmp_file_path, 'w') as f: | ||||
for d in data: | for d in data: | ||||
f.write(' '.join(map(str, d)) + '\n') | |||||
f.write(' '.join(map(str, d)) + '\\n') | |||||
class FileDataSet: | class FileDataSet: | ||||
def __init__(self, tmp_file): | def __init__(self, tmp_file): | ||||
@@ -382,6 +382,7 @@ class TorchLoaderIter(BatchIter): | |||||
import os | import os | ||||
if os.path.exists(tmp_file_path): | if os.path.exists(tmp_file_path): | ||||
os.remove(tmp_file_path) | os.remove(tmp_file_path) | ||||
""" | """ | ||||
def __init__(self, dataset, batch_size=1, sampler=None, | def __init__(self, dataset, batch_size=1, sampler=None, | ||||
num_workers=0, pin_memory=False, drop_last=False, | num_workers=0, pin_memory=False, drop_last=False, | ||||
@@ -391,7 +392,6 @@ class TorchLoaderIter(BatchIter): | |||||
:param dataset: :class:`~fastNLP.DataSet` 对象, 数据集 | :param dataset: :class:`~fastNLP.DataSet` 对象, 数据集 | ||||
:param int batch_size: 取出的batch大小 | :param int batch_size: 取出的batch大小 | ||||
:param sampler: 规定使用的 :class:`~fastNLP.Sampler` 方式. 若为 ``None`` , 使用 :class:`~fastNLP.SequentialSampler`. | :param sampler: 规定使用的 :class:`~fastNLP.Sampler` 方式. 若为 ``None`` , 使用 :class:`~fastNLP.SequentialSampler`. | ||||
Default: ``None`` | Default: ``None`` | ||||
:param int num_workers: 使用多少个进程来预处理数据 | :param int num_workers: 使用多少个进程来预处理数据 | ||||
:param bool pin_memory: 是否将产生的tensor使用pin memory, 可能会加快速度。 | :param bool pin_memory: 是否将产生的tensor使用pin memory, 可能会加快速度。 | ||||
@@ -806,7 +806,7 @@ class TensorboardCallback(Callback): | |||||
.. warning:: | .. warning:: | ||||
fastNLP 已停止对此功能的维护,请等待 fastNLP 兼容 PyTorch1.1 的下一个版本。 | fastNLP 已停止对此功能的维护,请等待 fastNLP 兼容 PyTorch1.1 的下一个版本。 | ||||
或者使用和 fastNLP 高度配合的 fitlog(参见 :doc:`/tutorials/tutorial_11_fitlog` )。 | |||||
或者使用和 fastNLP 高度配合的 fitlog(参见 :doc:`/tutorials/extend_2_fitlog` )。 | |||||
""" | """ | ||||
@@ -282,7 +282,7 @@ | |||||
dataset.set_pad_val('chars', -1) | dataset.set_pad_val('chars', -1) | ||||
3.3 根据DataSet中多个field合成新的field | 3.3 根据DataSet中多个field合成新的field | ||||
-------------------------------------- | |||||
------------------------------------------------------------ | |||||
DataSet支持在进行batch时,默认只能看到当前的field的值,但在某些训练中可能存在以下的情况: (1)需要两个field拼接成为一个field; | DataSet支持在进行batch时,默认只能看到当前的field的值,但在某些训练中可能存在以下的情况: (1)需要两个field拼接成为一个field; | ||||
(2)需要在batch中进行负采样。这时候就需要能够同时利用多个field进行batch的操作,DataSet中的add_collect_fn()函数支持添加 | (2)需要在batch中进行负采样。这时候就需要能够同时利用多个field进行batch的操作,DataSet中的add_collect_fn()函数支持添加 | ||||
@@ -282,21 +282,31 @@ class MetricBase(object): | |||||
class ConfusionMatrixMetric(MetricBase): | class ConfusionMatrixMetric(MetricBase): | ||||
r""" | r""" | ||||
分类问题计算混淆矩阵的Metric(其它的Metric参见 :mod:`fastNLP.core.metrics` ) | 分类问题计算混淆矩阵的Metric(其它的Metric参见 :mod:`fastNLP.core.metrics` ) | ||||
最后返回结果为dict,{'confusion_matrix': ConfusionMatrix实例} | |||||
最后返回结果为:: | |||||
dict,{'confusion_matrix': ConfusionMatrix实例} | |||||
ConfusionMatrix实例的print()函数将输出矩阵字符串。 | ConfusionMatrix实例的print()函数将输出矩阵字符串。 | ||||
pred_dict = {"pred": torch.Tensor([2,1,3])} | |||||
target_dict = {'target': torch.Tensor([2,2,1])} | |||||
metric = ConfusionMatrixMetric() | |||||
metric(pred_dict=pred_dict, target_dict=target_dict, ) | |||||
print(metric.get_metric()) | |||||
{'confusion_matrix': | |||||
target 1.0 2.0 3.0 all | |||||
pred | |||||
1.0 0 1 0 1 | |||||
2.0 0 1 0 1 | |||||
3.0 1 0 0 1 | |||||
all 1 2 0 3 | |||||
} | |||||
.. code :: | |||||
pred_dict = {"pred": torch.Tensor([2,1,3])} | |||||
target_dict = {'target': torch.Tensor([2,2,1])} | |||||
metric = ConfusionMatrixMetric() | |||||
metric(pred_dict=pred_dict, target_dict=target_dict, ) | |||||
print(metric.get_metric()) | |||||
.. code :: | |||||
{'confusion_matrix': | |||||
target 1.0 2.0 3.0 all | |||||
pred | |||||
1.0 0 1 0 1 | |||||
2.0 0 1 0 1 | |||||
3.0 1 0 0 1 | |||||
all 1 2 0 3 | |||||
} | |||||
""" | """ | ||||
def __init__(self, | def __init__(self, | ||||
vocab=None, | vocab=None, | ||||
@@ -322,12 +332,12 @@ class ConfusionMatrixMetric(MetricBase): | |||||
def evaluate(self, pred, target, seq_len=None): | def evaluate(self, pred, target, seq_len=None): | ||||
""" | """ | ||||
evaluate函数将针对一个批次的预测结果做评价指标的累计 | evaluate函数将针对一个批次的预测结果做评价指标的累计 | ||||
:param torch.Tensor pred: 预测的tensor, tensor的形状可以是torch.Size([B,]), torch.Size([B, n_classes]), | :param torch.Tensor pred: 预测的tensor, tensor的形状可以是torch.Size([B,]), torch.Size([B, n_classes]), | ||||
torch.Size([B, max_len]), 或者torch.Size([B, max_len, n_classes]) | |||||
torch.Size([B, max_len]), 或者torch.Size([B, max_len, n_classes]) | |||||
:param torch.Tensor target: 真实值的tensor, tensor的形状可以是Element's can be: torch.Size([B,]), | :param torch.Tensor target: 真实值的tensor, tensor的形状可以是Element's can be: torch.Size([B,]), | ||||
torch.Size([B,]), torch.Size([B, max_len]), 或者torch.Size([B, max_len]) | |||||
torch.Size([B,]), torch.Size([B, max_len]), 或者torch.Size([B, max_len]) | |||||
:param torch.Tensor seq_len: 序列长度标记, 标记的形状可以是None, torch.Size([B]), 或者torch.Size([B]). | :param torch.Tensor seq_len: 序列长度标记, 标记的形状可以是None, torch.Size([B]), 或者torch.Size([B]). | ||||
""" | """ | ||||
if not isinstance(pred, torch.Tensor): | if not isinstance(pred, torch.Tensor): | ||||
raise TypeError( | raise TypeError( | ||||
@@ -489,11 +499,12 @@ class ClassifyFPreRecMetric(MetricBase): | |||||
'rec-label':xxx, | 'rec-label':xxx, | ||||
... | ... | ||||
} | } | ||||
""" | """ | ||||
def __init__(self, tag_vocab=None, pred=None, target=None, seq_len=None, ignore_labels=None, | def __init__(self, tag_vocab=None, pred=None, target=None, seq_len=None, ignore_labels=None, | ||||
only_gross=True, f_type='micro', beta=1): | only_gross=True, f_type='micro', beta=1): | ||||
""" | |||||
r""" | |||||
:param tag_vocab: 标签的 :class:`~fastNLP.Vocabulary` . 默认值为None。若为None则使用数字来作为标签内容,否则使用vocab来作为标签内容。 | :param tag_vocab: 标签的 :class:`~fastNLP.Vocabulary` . 默认值为None。若为None则使用数字来作为标签内容,否则使用vocab来作为标签内容。 | ||||
:param str pred: 用该key在evaluate()时从传入dict中取出prediction数据。 为None,则使用 `pred` 取数据 | :param str pred: 用该key在evaluate()时从传入dict中取出prediction数据。 为None,则使用 `pred` 取数据 | ||||
@@ -504,6 +515,7 @@ class ClassifyFPreRecMetric(MetricBase): | |||||
:param str f_type: `micro` 或 `macro` . `micro` :通过先计算总体的TP,FN和FP的数量,再计算f, precision, recall; `macro` : 分布计算每个类别的f, precision, recall,然后做平均(各类别f的权重相同) | :param str f_type: `micro` 或 `macro` . `micro` :通过先计算总体的TP,FN和FP的数量,再计算f, precision, recall; `macro` : 分布计算每个类别的f, precision, recall,然后做平均(各类别f的权重相同) | ||||
:param float beta: f_beta分数, :math:`f_{beta} = \frac{(1 + {beta}^{2})*(pre*rec)}{({beta}^{2}*pre + rec)}` . 常用为 `beta=0.5, 1, 2` 若为0.5则精确率的权重高于召回率;若为1,则两者平等;若为2,则召回率权重高于精确率。 | :param float beta: f_beta分数, :math:`f_{beta} = \frac{(1 + {beta}^{2})*(pre*rec)}{({beta}^{2}*pre + rec)}` . 常用为 `beta=0.5, 1, 2` 若为0.5则精确率的权重高于召回率;若为1,则两者平等;若为2,则召回率权重高于精确率。 | ||||
""" | """ | ||||
if tag_vocab: | if tag_vocab: | ||||
if not isinstance(tag_vocab, Vocabulary): | if not isinstance(tag_vocab, Vocabulary): | ||||
raise TypeError("tag_vocab can only be fastNLP.Vocabulary, not {}.".format(type(tag_vocab))) | raise TypeError("tag_vocab can only be fastNLP.Vocabulary, not {}.".format(type(tag_vocab))) | ||||
@@ -355,6 +355,7 @@ from .utils import _move_model_to_device | |||||
from ._parallel_utils import _model_contains_inner_module | from ._parallel_utils import _model_contains_inner_module | ||||
from ._logger import logger | from ._logger import logger | ||||
class Trainer(object): | class Trainer(object): | ||||
""" | """ | ||||
Trainer在fastNLP中用于组织单任务的训练过程,可以避免用户在不同训练任务中重复撰写 | Trainer在fastNLP中用于组织单任务的训练过程,可以避免用户在不同训练任务中重复撰写 | ||||
@@ -373,9 +374,8 @@ class Trainer(object): | |||||
dev_data=None, metrics=None, metric_key=None, | dev_data=None, metrics=None, metric_key=None, | ||||
validate_every=-1, save_path=None, use_tqdm=True, device=None, | validate_every=-1, save_path=None, use_tqdm=True, device=None, | ||||
callbacks=None, check_code_level=0, **kwargs): | callbacks=None, check_code_level=0, **kwargs): | ||||
""" | |||||
:param train_data: 训练集, :class:`~fastNLP.DataSet` 类型或 :class:`~fastNLP.BatchIter`的子类 | |||||
r""" | |||||
:param train_data: 训练集, :class:`~fastNLP.DataSet` 类型或 :class:`~fastNLP.BatchIter` 的子类 | |||||
:param nn.modules model: 待训练的模型 | :param nn.modules model: 待训练的模型 | ||||
:param optimizer: `torch.optim.Optimizer` 优化器。如果为None,则Trainer使用默认的Adam(model.parameters(), lr=4e-3)这个优化器 | :param optimizer: `torch.optim.Optimizer` 优化器。如果为None,则Trainer使用默认的Adam(model.parameters(), lr=4e-3)这个优化器 | ||||
:param int batch_size: 训练和验证的时候的batch大小。 | :param int batch_size: 训练和验证的时候的batch大小。 | ||||
@@ -26,6 +26,9 @@ class ElmoEmbedding(ContextualEmbedding): | |||||
""" | """ | ||||
使用ELMo的embedding。初始化之后,只需要传入words就可以得到对应的embedding。 | 使用ELMo的embedding。初始化之后,只需要传入words就可以得到对应的embedding。 | ||||
当前支持的使用名称初始化的模型: | 当前支持的使用名称初始化的模型: | ||||
.. code:: | |||||
en: 即en-medium hidden_size 1024; output_size 12 | en: 即en-medium hidden_size 1024; output_size 12 | ||||
en-medium: hidden_size 2048; output_size 256 | en-medium: hidden_size 2048; output_size 256 | ||||
en-origial: hidden_size 4096; output_size 512 | en-origial: hidden_size 4096; output_size 512 | ||||
@@ -27,6 +27,9 @@ class StaticEmbedding(TokenEmbedding): | |||||
StaticEmbedding组件. 给定预训练embedding的名称或路径,根据vocab从embedding中抽取相应的数据(只会将出现在vocab中的词抽取出来, | StaticEmbedding组件. 给定预训练embedding的名称或路径,根据vocab从embedding中抽取相应的数据(只会将出现在vocab中的词抽取出来, | ||||
如果没有找到,则会随机初始化一个值(但如果该word是被标记为no_create_entry的话,则不会单独创建一个值,而是会被指向unk的index))。 | 如果没有找到,则会随机初始化一个值(但如果该word是被标记为no_create_entry的话,则不会单独创建一个值,而是会被指向unk的index))。 | ||||
当前支持自动下载的预训练vector有: | 当前支持自动下载的预训练vector有: | ||||
.. code:: | |||||
en: 实际为en-glove-840b-300d(常用) | en: 实际为en-glove-840b-300d(常用) | ||||
en-glove-6b-50d: glove官方的50d向量 | en-glove-6b-50d: glove官方的50d向量 | ||||
en-glove-6b-100d: glove官方的100d向量 | en-glove-6b-100d: glove官方的100d向量 | ||||
@@ -88,8 +91,7 @@ class StaticEmbedding(TokenEmbedding): | |||||
:param dict kwargs: | :param dict kwargs: | ||||
bool only_train_min_freq: 仅对train中的词语使用min_freq筛选; | bool only_train_min_freq: 仅对train中的词语使用min_freq筛选; | ||||
bool only_norm_found_vector: 是否仅对在预训练中找到的词语使用normalize; | bool only_norm_found_vector: 是否仅对在预训练中找到的词语使用normalize; | ||||
bool only_use_pretrain_word: 仅使用出现在pretrain词表中的词,如果该词没有在预训练的词表中出现则为unk。如果 | |||||
embedding不需要更新建议设置为True。 | |||||
bool only_use_pretrain_word: 仅使用出现在pretrain词表中的词,如果该词没有在预训练的词表中出现则为unk。如果embedding不需要更新建议设置为True。 | |||||
""" | """ | ||||
super(StaticEmbedding, self).__init__(vocab, word_dropout=word_dropout, dropout=dropout) | super(StaticEmbedding, self).__init__(vocab, word_dropout=word_dropout, dropout=dropout) | ||||
if embedding_dim > 0: | if embedding_dim > 0: | ||||
@@ -227,7 +227,7 @@ class OntoNotesNERLoader(ConllLoader): | |||||
:header: "raw_words", "target" | :header: "raw_words", "target" | ||||
"['Hi', 'everyone', '.']", "['O', 'O', 'O']" | "['Hi', 'everyone', '.']", "['O', 'O', 'O']" | ||||
"['first', 'up', 'on', 'the', 'docket'], "['O', 'O', 'O', 'O', 'O']" | |||||
"['first', 'up', 'on', 'the', 'docket']", "['O', 'O', 'O', 'O', 'O']" | |||||
"[...]", "[...]" | "[...]", "[...]" | ||||
""" | """ | ||||
@@ -29,10 +29,10 @@ class CMRC2018Loader(Loader): | |||||
验证集DataSet将具备以下的内容,每个问题的答案可能有三个(有时候只是3个重复的答案) | 验证集DataSet将具备以下的内容,每个问题的答案可能有三个(有时候只是3个重复的答案) | ||||
.. csv-table:: | .. csv-table:: | ||||
:header:"title", "context", "question", "answers", "answer_starts", "id" | |||||
:header: "title", "context", "question", "answers", "answer_starts", "id" | |||||
"战国无双3", "《战国无双3》()是由光荣和ω-force开发...", "《战国无双3》是由哪两个公司合作开发的?", ["光荣和ω-force", "光荣和ω-force", "光荣和ω-force"], ["30", "30", "30"], "DEV_0_QUERY_0" | |||||
"战国无双3", "《战国无双3》()是由光荣和ω-force开发...", "男女主角亦有专属声优这一模式是由谁改编的?", ["村雨城", "村雨城", "任天堂游戏谜之村雨城"], ["226", "226", "219"], "DEV_0_QUERY_1" | |||||
"战国无双3", "《战国无双3》()是由光荣和ω-force开发...", "《战国无双3》是由哪两个公司合作开发的?", "['光荣和ω-force', '光荣和ω-force', '光荣和ω-force']", "[30, 30, 30]", "DEV_0_QUERY_0" | |||||
"战国无双3", "《战国无双3》()是由光荣和ω-force开发...", "男女主角亦有专属声优这一模式是由谁改编的?", "['村雨城', '村雨城', '任天堂游戏谜之村雨城']", "[226, 226, 219]", "DEV_0_QUERY_1" | |||||
"...", "...", "...","...", ".", "..." | "...", "...", "...","...", ".", "..." | ||||
其中answer_starts是从0开始的index。例如"我来自a复旦大学?",其中"复"的开始index为4。另外"Russell评价说"中的说的index为9, 因为 | 其中answer_starts是从0开始的index。例如"我来自a复旦大学?",其中"复"的开始index为4。另外"Russell评价说"中的说的index为9, 因为 | ||||
@@ -83,15 +83,19 @@ class CMRC2018BertPipe(Pipe): | |||||
.. csv-table:: | .. csv-table:: | ||||
:header: "context_len", "raw_chars", "target_start", "target_end", "chars" | :header: "context_len", "raw_chars", "target_start", "target_end", "chars" | ||||
492, ['范', '廷', '颂... ], 30, 34, [21, 25, ...] | |||||
491, ['范', '廷', '颂... ], 41, 61, [21, 25, ...] | |||||
492, ['范', '廷', '颂... ], 30, 34, "[21, 25, ...]" | |||||
491, ['范', '廷', '颂... ], 41, 61, "[21, 25, ...]" | |||||
".", "...", "...","...", "..." | |||||
".", "...", "...","...", "..." | |||||
raw_words列是context与question拼起来的结果(连接的地方加入了[SEP]),words是转为index的值, target_start为答案start的index,target_end为答案end的index | raw_words列是context与question拼起来的结果(连接的地方加入了[SEP]),words是转为index的值, target_start为答案start的index,target_end为答案end的index | ||||
(闭区间);context_len指示的是words列中context的长度。 | (闭区间);context_len指示的是words列中context的长度。 | ||||
其中各列的meta信息如下: | 其中各列的meta信息如下: | ||||
.. code:: | |||||
+-------------+-------------+-----------+--------------+------------+-------+---------+ | +-------------+-------------+-----------+--------------+------------+-------+---------+ | ||||
| field_names | context_len | raw_chars | target_start | target_end | chars | answers | | | field_names | context_len | raw_chars | target_start | target_end | chars | answers | | ||||
+-------------+-------------+-----------+--------------+------------+-------+---------| | +-------------+-------------+-----------+--------------+------------+-------+---------| | ||||
@@ -100,7 +104,7 @@ class CMRC2018BertPipe(Pipe): | |||||
| ignore_type | False | True | False | False | False | True | | | ignore_type | False | True | False | False | False | True | | ||||
| pad_value | 0 | 0 | 0 | 0 | 0 | 0 | | | pad_value | 0 | 0 | 0 | 0 | 0 | 0 | | ||||
+-------------+-------------+-----------+--------------+------------+-------+---------+ | +-------------+-------------+-----------+--------------+------------+-------+---------+ | ||||
""" | """ | ||||
def __init__(self, max_len=510): | def __init__(self, max_len=510): | ||||
super().__init__() | super().__init__() | ||||