@@ -6,9 +6,11 @@ __all__ = [ | |||||
'DataBundle', | 'DataBundle', | ||||
] | ] | ||||
from typing import Union | |||||
from ..core.dataset import DataSet | from ..core.dataset import DataSet | ||||
from ..core.vocabulary import Vocabulary | from ..core.vocabulary import Vocabulary | ||||
from typing import Union | |||||
class DataBundle: | class DataBundle: | ||||
""" | """ | ||||
@@ -22,11 +24,14 @@ class DataBundle: | |||||
train_data = data_bundle.datasets['train'] | train_data = data_bundle.datasets['train'] | ||||
dev_data = data_bundle.datasets['train'] | dev_data = data_bundle.datasets['train'] | ||||
:param vocabs: 从名称(字符串)到 :class:`~fastNLP.Vocabulary` 类型的dict | |||||
:param datasets: 从名称(字符串)到 :class:`~fastNLP.DataSet` 类型的dict | |||||
""" | """ | ||||
def __init__(self, vocabs: dict = None, datasets: dict = None): | def __init__(self, vocabs: dict = None, datasets: dict = None): | ||||
""" | |||||
:param vocabs: 从名称(字符串)到 :class:`~fastNLP.Vocabulary` 类型的dict | |||||
:param datasets: 从名称(字符串)到 :class:`~fastNLP.DataSet` 类型的dict | |||||
""" | |||||
self.vocabs = vocabs or {} | self.vocabs = vocabs or {} | ||||
self.datasets = datasets or {} | self.datasets = datasets or {} | ||||
@@ -53,13 +53,15 @@ class ConllLoader(Loader): | |||||
数据中以"-DOCSTART-"开头的行将被忽略,因为该符号在conll 2003中被用为文档分割符。 | 数据中以"-DOCSTART-"开头的行将被忽略,因为该符号在conll 2003中被用为文档分割符。 | ||||
:param list headers: 每一列数据的名称,需为List or Tuple of str。``header`` 与 ``indexes`` 一一对应 | |||||
:param list indexes: 需要保留的数据列下标,从0开始。若为 ``None`` ,则所有列都保留。Default: ``None`` | |||||
:param bool dropna: 是否忽略非法数据,若 ``False`` ,遇到非法数据时抛出 ``ValueError`` 。Default: ``True`` | |||||
""" | """ | ||||
def __init__(self, headers, indexes=None, dropna=True): | def __init__(self, headers, indexes=None, dropna=True): | ||||
""" | |||||
:param list headers: 每一列数据的名称,需为List or Tuple of str。``header`` 与 ``indexes`` 一一对应 | |||||
:param list indexes: 需要保留的数据列下标,从0开始。若为 ``None`` ,则所有列都保留。Default: ``None`` | |||||
:param bool dropna: 是否忽略非法数据,若 ``False`` ,遇到非法数据时抛出 ``ValueError`` 。Default: ``True`` | |||||
""" | |||||
super(ConllLoader, self).__init__() | super(ConllLoader, self).__init__() | ||||
if not isinstance(headers, (list, tuple)): | if not isinstance(headers, (list, tuple)): | ||||
raise TypeError( | raise TypeError( | ||||
@@ -14,14 +14,17 @@ class CSVLoader(Loader): | |||||
""" | """ | ||||
读取CSV格式的数据集, 返回 ``DataSet`` 。 | 读取CSV格式的数据集, 返回 ``DataSet`` 。 | ||||
:param List[str] headers: CSV文件的文件头.定义每一列的属性名称,即返回的DataSet中`field`的名称 | |||||
若为 ``None`` ,则将读入文件的第一行视作 ``headers`` . Default: ``None`` | |||||
:param str sep: CSV文件中列与列之间的分隔符. Default: "," | |||||
:param bool dropna: 是否忽略非法数据,若 ``True`` 则忽略,若 ``False`` ,在遇到非法数据时,抛出 ``ValueError`` . | |||||
Default: ``False`` | |||||
""" | """ | ||||
def __init__(self, headers=None, sep=",", dropna=False): | def __init__(self, headers=None, sep=",", dropna=False): | ||||
""" | |||||
:param List[str] headers: CSV文件的文件头.定义每一列的属性名称,即返回的DataSet中`field`的名称 | |||||
若为 ``None`` ,则将读入文件的第一行视作 ``headers`` . Default: ``None`` | |||||
:param str sep: CSV文件中列与列之间的分隔符. Default: "," | |||||
:param bool dropna: 是否忽略非法数据,若 ``True`` 则忽略,若 ``False`` ,在遇到非法数据时,抛出 ``ValueError`` . | |||||
Default: ``False`` | |||||
""" | |||||
super().__init__() | super().__init__() | ||||
self.headers = headers | self.headers = headers | ||||
self.sep = sep | self.sep = sep | ||||
@@ -33,10 +33,13 @@ class CWSLoader(Loader): | |||||
"上海 浦东 开发 与 法制 建设 同步" | "上海 浦东 开发 与 法制 建设 同步" | ||||
"新华社 上海 二月 十日 电 ( 记者 谢金虎 、 张持坚 )" | "新华社 上海 二月 十日 电 ( 记者 谢金虎 、 张持坚 )" | ||||
"..." | "..." | ||||
:param: str dataset_name: data的名称,支持pku, msra, cityu(繁体), as(繁体), None | |||||
""" | """ | ||||
def __init__(self, dataset_name:str=None): | def __init__(self, dataset_name:str=None): | ||||
""" | |||||
:param str dataset_name: data的名称,支持pku, msra, cityu(繁体), as(繁体), None | |||||
""" | |||||
super().__init__() | super().__init__() | ||||
datanames = {'pku': 'cws-pku', 'msra':'cws-msra', 'as':'cws-as', 'cityu':'cws-cityu'} | datanames = {'pku': 'cws-pku', 'msra':'cws-msra', 'as':'cws-as', 'cityu':'cws-cityu'} | ||||
if dataset_name in datanames: | if dataset_name in datanames: | ||||
@@ -14,15 +14,18 @@ class JsonLoader(Loader): | |||||
""" | """ | ||||
读取json格式数据.数据必须按行存储,每行是一个包含各类属性的json对象 | 读取json格式数据.数据必须按行存储,每行是一个包含各类属性的json对象 | ||||
:param dict fields: 需要读入的json属性名称, 和读入后在DataSet中存储的field_name | |||||
``fields`` 的 `key` 必须是json对象的属性名. ``fields`` 的 `value` 为读入后在DataSet存储的 `field_name` , | |||||
`value` 也可为 ``None`` , 这时读入后的 `field_name` 与json对象对应属性同名 | |||||
``fields`` 可为 ``None`` , 这时,json对象所有属性都保存在DataSet中. Default: ``None`` | |||||
:param bool dropna: 是否忽略非法数据,若 ``True`` 则忽略,若 ``False`` ,在遇到非法数据时,抛出 ``ValueError`` . | |||||
Default: ``False`` | |||||
""" | """ | ||||
def __init__(self, fields=None, dropna=False): | def __init__(self, fields=None, dropna=False): | ||||
""" | |||||
:param dict fields: 需要读入的json属性名称, 和读入后在DataSet中存储的field_name | |||||
``fields`` 的 `key` 必须是json对象的属性名. ``fields`` 的 `value` 为读入后在DataSet存储的 `field_name` , | |||||
`value` 也可为 ``None`` , 这时读入后的 `field_name` 与json对象对应属性同名 | |||||
``fields`` 可为 ``None`` , 这时,json对象所有属性都保存在DataSet中. Default: ``None`` | |||||
:param bool dropna: 是否忽略非法数据,若 ``True`` 则忽略,若 ``False`` ,在遇到非法数据时,抛出 ``ValueError`` . | |||||
Default: ``False`` | |||||
""" | |||||
super(JsonLoader, self).__init__() | super(JsonLoader, self).__init__() | ||||
self.dropna = dropna | self.dropna = dropna | ||||
self.fields = None | self.fields = None | ||||
@@ -128,7 +128,7 @@ class SNLILoader(JsonLoader): | |||||
def load(self, paths: Union[str, Dict[str, str]] = None) -> DataBundle: | def load(self, paths: Union[str, Dict[str, str]] = None) -> DataBundle: | ||||
""" | """ | ||||
从指定一个或多个路径中的文件中读取数据,返回:class:`~fastNLP.io.DataBundle` 。 | |||||
从指定一个或多个路径中的文件中读取数据,返回 :class:`~fastNLP.io.DataBundle` 。 | |||||
读取的field根据ConllLoader初始化时传入的headers决定。 | 读取的field根据ConllLoader初始化时传入的headers决定。 | ||||
@@ -16,12 +16,12 @@ from nltk import Tree | |||||
from .pipe import Pipe | from .pipe import Pipe | ||||
from .utils import get_tokenizer, _indexize, _add_words_field, _drop_empty_instance, _add_chars_field | from .utils import get_tokenizer, _indexize, _add_words_field, _drop_empty_instance, _add_chars_field | ||||
from ..data_bundle import DataBundle | from ..data_bundle import DataBundle | ||||
from ..loader.classification import ChnSentiCorpLoader | |||||
from ..loader.classification import IMDBLoader, YelpFullLoader, SSTLoader, SST2Loader, YelpPolarityLoader | from ..loader.classification import IMDBLoader, YelpFullLoader, SSTLoader, SST2Loader, YelpPolarityLoader | ||||
from ...core.const import Const | from ...core.const import Const | ||||
from ...core.dataset import DataSet | from ...core.dataset import DataSet | ||||
from ...core.instance import Instance | from ...core.instance import Instance | ||||
from ...core.vocabulary import Vocabulary | from ...core.vocabulary import Vocabulary | ||||
from ..loader.classification import ChnSentiCorpLoader | |||||
nonalpnum = re.compile('[^0-9a-zA-Z?!\']+') | nonalpnum = re.compile('[^0-9a-zA-Z?!\']+') | ||||
@@ -33,6 +33,7 @@ class _CLSPipe(Pipe): | |||||
""" | """ | ||||
def __init__(self, tokenizer: str = 'spacy', lang='en'): | def __init__(self, tokenizer: str = 'spacy', lang='en'): | ||||
self.tokenizer = get_tokenizer(tokenizer, lang=lang) | self.tokenizer = get_tokenizer(tokenizer, lang=lang) | ||||
def _tokenize(self, data_bundle, field_name=Const.INPUT, new_field_name=None): | def _tokenize(self, data_bundle, field_name=Const.INPUT, new_field_name=None): | ||||
@@ -98,13 +99,16 @@ class YelpFullPipe(_CLSPipe): | |||||
"Offers that ...", "[20, 40, ...]", 1, 21 | "Offers that ...", "[20, 40, ...]", 1, 21 | ||||
"...", "[...]", ., . | "...", "[...]", ., . | ||||
:param bool lower: 是否对输入进行小写化。 | |||||
:param int granularity: 支持2, 3, 5。若为2, 则认为是2分类问题,将1、2归为1类,4、5归为一类,丢掉2;若为3, 则有3分类问题,将 | |||||
1、2归为1类,3归为1类,4、5归为1类;若为5, 则有5分类问题。 | |||||
:param str tokenizer: 使用哪种tokenize方式将数据切成单词。支持'spacy'和'raw'。raw使用空格作为切分。 | |||||
""" | """ | ||||
def __init__(self, lower: bool = False, granularity=5, tokenizer: str = 'spacy'): | def __init__(self, lower: bool = False, granularity=5, tokenizer: str = 'spacy'): | ||||
""" | |||||
:param bool lower: 是否对输入进行小写化。 | |||||
:param int granularity: 支持2, 3, 5。若为2, 则认为是2分类问题,将1、2归为1类,4、5归为一类,丢掉2;若为3, 则有3分类问题,将 | |||||
1、2归为1类,3归为1类,4、5归为1类;若为5, 则有5分类问题。 | |||||
:param str tokenizer: 使用哪种tokenize方式将数据切成单词。支持'spacy'和'raw'。raw使用空格作为切分。 | |||||
""" | |||||
super().__init__(tokenizer=tokenizer, lang='en') | super().__init__(tokenizer=tokenizer, lang='en') | ||||
self.lower = lower | self.lower = lower | ||||
assert granularity in (2, 3, 5), "granularity can only be 2,3,5." | assert granularity in (2, 3, 5), "granularity can only be 2,3,5." | ||||
@@ -191,11 +195,14 @@ class YelpPolarityPipe(_CLSPipe): | |||||
"Offers that ...", "[20, 40, ...]", 1, 21 | "Offers that ...", "[20, 40, ...]", 1, 21 | ||||
"...", "[...]", ., . | "...", "[...]", ., . | ||||
:param bool lower: 是否对输入进行小写化。 | |||||
:param str tokenizer: 使用哪种tokenize方式将数据切成单词。支持'spacy'和'raw'。raw使用空格作为切分。 | |||||
""" | """ | ||||
def __init__(self, lower: bool = False, tokenizer: str = 'spacy'): | def __init__(self, lower: bool = False, tokenizer: str = 'spacy'): | ||||
""" | |||||
:param bool lower: 是否对输入进行小写化。 | |||||
:param str tokenizer: 使用哪种tokenize方式将数据切成单词。支持'spacy'和'raw'。raw使用空格作为切分。 | |||||
""" | |||||
super().__init__(tokenizer=tokenizer, lang='en') | super().__init__(tokenizer=tokenizer, lang='en') | ||||
self.lower = lower | self.lower = lower | ||||
@@ -237,15 +244,18 @@ class SSTPipe(_CLSPipe): | |||||
"Offers that ...", "[20, 40, ...]", 1, 18 | "Offers that ...", "[20, 40, ...]", 1, 18 | ||||
"...", "[...]", ., . | "...", "[...]", ., . | ||||
:param bool subtree: 是否将train, test, dev数据展开为子树,扩充数据量。 Default: ``False`` | |||||
:param bool train_subtree: 是否将train集通过子树扩展数据。 | |||||
:param bool lower: 是否对输入进行小写化。 | |||||
:param int granularity: 支持2, 3, 5。若为2, 则认为是2分类问题,将0、1归为1类,3、4归为一类,丢掉2;若为3, 则有3分类问题,将 | |||||
0、1归为1类,2归为1类,3、4归为1类;若为5, 则有5分类问题。 | |||||
:param str tokenizer: 使用哪种tokenize方式将数据切成单词。支持'spacy'和'raw'。raw使用空格作为切分。 | |||||
""" | """ | ||||
def __init__(self, subtree=False, train_subtree=True, lower=False, granularity=5, tokenizer='spacy'): | def __init__(self, subtree=False, train_subtree=True, lower=False, granularity=5, tokenizer='spacy'): | ||||
""" | |||||
:param bool subtree: 是否将train, test, dev数据展开为子树,扩充数据量。 Default: ``False`` | |||||
:param bool train_subtree: 是否将train集通过子树扩展数据。 | |||||
:param bool lower: 是否对输入进行小写化。 | |||||
:param int granularity: 支持2, 3, 5。若为2, 则认为是2分类问题,将0、1归为1类,3、4归为一类,丢掉2;若为3, 则有3分类问题,将 | |||||
0、1归为1类,2归为1类,3、4归为1类;若为5, 则有5分类问题。 | |||||
:param str tokenizer: 使用哪种tokenize方式将数据切成单词。支持'spacy'和'raw'。raw使用空格作为切分。 | |||||
""" | |||||
super().__init__(tokenizer=tokenizer, lang='en') | super().__init__(tokenizer=tokenizer, lang='en') | ||||
self.subtree = subtree | self.subtree = subtree | ||||
self.train_tree = train_subtree | self.train_tree = train_subtree | ||||
@@ -327,11 +337,14 @@ class SST2Pipe(_CLSPipe): | |||||
"unflinchingly bleak and...", "[10, 11, 7,...]", 1, 21 | "unflinchingly bleak and...", "[10, 11, 7,...]", 1, 21 | ||||
"...", "...", ., . | "...", "...", ., . | ||||
:param bool lower: 是否对输入进行小写化。 | |||||
:param str tokenizer: 使用哪种tokenize方式将数据切成单词。支持'spacy'和'raw'。raw使用空格作为切分。 | |||||
""" | """ | ||||
def __init__(self, lower=False, tokenizer='spacy'): | def __init__(self, lower=False, tokenizer='spacy'): | ||||
""" | |||||
:param bool lower: 是否对输入进行小写化。 | |||||
:param str tokenizer: 使用哪种tokenize方式将数据切成单词。支持'spacy'和'raw'。raw使用空格作为切分。 | |||||
""" | |||||
super().__init__(tokenizer=tokenizer, lang='en') | super().__init__(tokenizer=tokenizer, lang='en') | ||||
self.lower = lower | self.lower = lower | ||||
@@ -402,11 +415,14 @@ class IMDBPipe(_CLSPipe): | |||||
其中raw_words为str类型,是原文; words是转换为index的输入; target是转换为index的目标值; | 其中raw_words为str类型,是原文; words是转换为index的输入; target是转换为index的目标值; | ||||
words列被设置为input; target列被设置为target。 | words列被设置为input; target列被设置为target。 | ||||
:param bool lower: 是否将words列的数据小写。 | |||||
:param str tokenizer: 使用什么tokenizer来将句子切分为words. 支持spacy, raw两种。raw即使用空格拆分。 | |||||
""" | """ | ||||
def __init__(self, lower: bool = False, tokenizer: str = 'spacy'): | def __init__(self, lower: bool = False, tokenizer: str = 'spacy'): | ||||
""" | |||||
:param bool lower: 是否将words列的数据小写。 | |||||
:param str tokenizer: 使用什么tokenizer来将句子切分为words. 支持spacy, raw两种。raw即使用空格拆分。 | |||||
""" | |||||
super().__init__(tokenizer=tokenizer, lang='en') | super().__init__(tokenizer=tokenizer, lang='en') | ||||
self.lower = lower | self.lower = lower | ||||
@@ -471,14 +487,17 @@ class ChnSentiCorpPipe(Pipe): | |||||
其中chars, seq_len是input,target是target | 其中chars, seq_len是input,target是target | ||||
:param bool bigrams: 是否增加一列bigrams. bigrams的构成是['复', '旦', '大', '学', ...]->["复旦", "旦大", ...]。如果 | |||||
设置为True,返回的DataSet将有一列名为bigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 | |||||
data_bundle.get_vocab('bigrams')获取. | |||||
:param bool trigrams: 是否增加一列trigrams. trigrams的构成是 ['复', '旦', '大', '学', ...]->["复旦大", "旦大学", ...] | |||||
。如果设置为True,返回的DataSet将有一列名为trigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 | |||||
data_bundle.get_vocab('trigrams')获取. | |||||
""" | """ | ||||
def __init__(self, bigrams=False, trigrams=False): | def __init__(self, bigrams=False, trigrams=False): | ||||
""" | |||||
:param bool bigrams: 是否增加一列bigrams. bigrams的构成是['复', '旦', '大', '学', ...]->["复旦", "旦大", ...]。如果 | |||||
设置为True,返回的DataSet将有一列名为bigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 | |||||
data_bundle.get_vocab('bigrams')获取. | |||||
:param bool trigrams: 是否增加一列trigrams. trigrams的构成是 ['复', '旦', '大', '学', ...]->["复旦大", "旦大学", ...] | |||||
。如果设置为True,返回的DataSet将有一列名为trigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 | |||||
data_bundle.get_vocab('trigrams')获取. | |||||
""" | |||||
super().__init__() | super().__init__() | ||||
self.bigrams = bigrams | self.bigrams = bigrams | ||||
@@ -54,7 +54,7 @@ class _NERPipe(Pipe): | |||||
"[...]", "[...]" | "[...]", "[...]" | ||||
:param ~fastNLP.DataBundle data_bundle: 传入的DataBundle中的DataSet必须包含raw_words和ner两个field,且两个field的内容均为List[str]在传入DataBundle基础上原位修改。 | :param ~fastNLP.DataBundle data_bundle: 传入的DataBundle中的DataSet必须包含raw_words和ner两个field,且两个field的内容均为List[str]在传入DataBundle基础上原位修改。 | ||||
:return DataBundle: | |||||
:return DataBundle: | |||||
""" | """ | ||||
# 转换tag | # 转换tag | ||||
for name, dataset in data_bundle.datasets.items(): | for name, dataset in data_bundle.datasets.items(): | ||||
@@ -94,8 +94,6 @@ class Conll2003NERPipe(_NERPipe): | |||||
raw_words列为List[str], 是未转换的原始数据; words列为List[int],是转换为index的输入数据; target列是List[int],是转换为index的 | raw_words列为List[str], 是未转换的原始数据; words列为List[int],是转换为index的输入数据; target列是List[int],是转换为index的 | ||||
target。返回的DataSet中被设置为input有words, target, seq_len; 设置为target有target。 | target。返回的DataSet中被设置为input有words, target, seq_len; 设置为target有target。 | ||||
:param: str encoding_type: target列使用什么类型的encoding方式,支持bioes, bio两种。 | |||||
:param bool lower: 是否将words小写化后再建立词表,绝大多数情况都不需要设置为True。 | |||||
""" | """ | ||||
def process_from_file(self, paths) -> DataBundle: | def process_from_file(self, paths) -> DataBundle: | ||||
@@ -112,18 +110,21 @@ class Conll2003NERPipe(_NERPipe): | |||||
class Conll2003Pipe(Pipe): | class Conll2003Pipe(Pipe): | ||||
def __init__(self, chunk_encoding_type='bioes', ner_encoding_type='bioes', lower: bool = False): | |||||
""" | |||||
经过该Pipe后,DataSet中的内容如下 | |||||
r""" | |||||
经过该Pipe后,DataSet中的内容如下 | |||||
.. csv-table:: | |||||
:header: "raw_words", "words", "pos", "chunk", "ner", "seq_len" | |||||
.. csv-table:: | |||||
:header: "raw_words" , "words", "pos", "chunk", "ner", "seq_len" | |||||
"[Nadim, Ladki]", "[2, 3]", "[0, 0]", "[1, 2]", "[1, 2]", 2 | |||||
"[AL-AIN, United, Arab, ...]", "[4, 5, 6,...]", "[1, 2...]", "[3, 4...]", "[3, 4...]", 6 | |||||
"[...]", "[...]", "[...]", "[...]", "[...]". | |||||
"[Nadim, Ladki]", "[2, 3]", "[0, 0]", "[1, 2]", "[1, 2]", 2 | |||||
"[AL-AIN, United, Arab, ...]", "[4, 5, 6,...]", "[1, 2...]", "[3, 4...]", "[3, 4...]", 6 | |||||
"[...]", "[...]", "[...]", "[...]", "[...]", . | |||||
其中words, seq_len是input; pos, chunk, ner, seq_len是target | |||||
其中words, seq_len是input; pos, chunk, ner, seq_len是target | |||||
""" | |||||
def __init__(self, chunk_encoding_type='bioes', ner_encoding_type='bioes', lower: bool = False): | |||||
""" | |||||
:param str chunk_encoding_type: 支持bioes, bio。 | :param str chunk_encoding_type: 支持bioes, bio。 | ||||
:param str ner_encoding_type: 支持bioes, bio。 | :param str ner_encoding_type: 支持bioes, bio。 | ||||
@@ -148,7 +149,7 @@ class Conll2003Pipe(Pipe): | |||||
"[Nadim, Ladki]", "[NNP, NNP]", "[B-NP, I-NP]", "[B-PER, I-PER]" | "[Nadim, Ladki]", "[NNP, NNP]", "[B-NP, I-NP]", "[B-PER, I-PER]" | ||||
"[AL-AIN, United, Arab, ...]", "[NNP, NNP...]", "[B-NP, B-NP, ...]", "[B-LOC, B-LOC,...]" | "[AL-AIN, United, Arab, ...]", "[NNP, NNP...]", "[B-NP, B-NP, ...]", "[B-LOC, B-LOC,...]" | ||||
"[...]", "[...]", "[...]", "[...]". | |||||
"[...]", "[...]", "[...]", "[...]", . | |||||
:param data_bundle: | :param data_bundle: | ||||
:return: 传入的DataBundle | :return: 传入的DataBundle | ||||
@@ -204,8 +205,6 @@ class OntoNotesNERPipe(_NERPipe): | |||||
raw_words列为List[str], 是未转换的原始数据; words列为List[int],是转换为index的输入数据; target列是List[int],是转换为index的 | raw_words列为List[str], 是未转换的原始数据; words列为List[int],是转换为index的输入数据; target列是List[int],是转换为index的 | ||||
target。返回的DataSet中被设置为input有words, target, seq_len; 设置为target有target。 | target。返回的DataSet中被设置为input有words, target, seq_len; 设置为target有target。 | ||||
:param: str encoding_type: target列使用什么类型的encoding方式,支持bioes, bio两种。 | |||||
:param bool lower: 是否将words小写化后再建立词表,绝大多数情况都不需要设置为True。 | |||||
""" | """ | ||||
def process_from_file(self, paths): | def process_from_file(self, paths): | ||||
@@ -222,16 +221,19 @@ class _CNNERPipe(Pipe): | |||||
raw_chars列为List[str], 是未转换的原始数据; chars列为List[int],是转换为index的输入数据; target列是List[int],是转换为index的 | raw_chars列为List[str], 是未转换的原始数据; chars列为List[int],是转换为index的输入数据; target列是List[int],是转换为index的 | ||||
target。返回的DataSet中被设置为input有chars, target, seq_len; 设置为target有target, seq_len。 | target。返回的DataSet中被设置为input有chars, target, seq_len; 设置为target有target, seq_len。 | ||||
:param: str encoding_type: target列使用什么类型的encoding方式,支持bioes, bio两种。 | |||||
:param bool bigrams: 是否增加一列bigrams. bigrams的构成是['复', '旦', '大', '学', ...]->["复旦", "旦大", ...]。如果 | |||||
设置为True,返回的DataSet将有一列名为bigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 | |||||
data_bundle.get_vocab('bigrams')获取. | |||||
:param bool trigrams: 是否增加一列trigrams. trigrams的构成是 ['复', '旦', '大', '学', ...]->["复旦大", "旦大学", ...] | |||||
。如果设置为True,返回的DataSet将有一列名为trigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 | |||||
data_bundle.get_vocab('trigrams')获取. | |||||
""" | """ | ||||
def __init__(self, encoding_type: str = 'bio', bigrams=False, trigrams=False): | def __init__(self, encoding_type: str = 'bio', bigrams=False, trigrams=False): | ||||
""" | |||||
:param str encoding_type: target列使用什么类型的encoding方式,支持bioes, bio两种。 | |||||
:param bool bigrams: 是否增加一列bigrams. bigrams的构成是['复', '旦', '大', '学', ...]->["复旦", "旦大", ...]。如果 | |||||
设置为True,返回的DataSet将有一列名为bigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 | |||||
data_bundle.get_vocab('bigrams')获取. | |||||
:param bool trigrams: 是否增加一列trigrams. trigrams的构成是 ['复', '旦', '大', '学', ...]->["复旦大", "旦大学", ...] | |||||
。如果设置为True,返回的DataSet将有一列名为trigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 | |||||
data_bundle.get_vocab('trigrams')获取. | |||||
""" | |||||
if encoding_type == 'bio': | if encoding_type == 'bio': | ||||
self.convert_tag = iob2 | self.convert_tag = iob2 | ||||
else: | else: | ||||
@@ -346,7 +348,6 @@ class WeiboNERPipe(_CNNERPipe): | |||||
raw_chars列为List[str], 是未转换的原始数据; chars列为List[int],是转换为index的输入数据; target列是List[int],是转换为index的 | raw_chars列为List[str], 是未转换的原始数据; chars列为List[int],是转换为index的输入数据; target列是List[int],是转换为index的 | ||||
target。返回的DataSet中被设置为input有chars, target, seq_len; 设置为target有target。 | target。返回的DataSet中被设置为input有chars, target, seq_len; 设置为target有target。 | ||||
:param: str encoding_type: target列使用什么类型的encoding方式,支持bioes, bio两种。 | |||||
""" | """ | ||||
def process_from_file(self, paths=None) -> DataBundle: | def process_from_file(self, paths=None) -> DataBundle: | ||||
@@ -5,13 +5,15 @@ __all__ = [ | |||||
] | ] | ||||
import collections | |||||
import numpy as np | |||||
from fastNLP.core.vocabulary import Vocabulary | |||||
from .pipe import Pipe | from .pipe import Pipe | ||||
from ..data_bundle import DataBundle | from ..data_bundle import DataBundle | ||||
from ..loader.coreference import CRLoader | from ..loader.coreference import CRLoader | ||||
from ...core.const import Const | from ...core.const import Const | ||||
from fastNLP.core.vocabulary import Vocabulary | |||||
import numpy as np | |||||
import collections | |||||
class CoreferencePipe(Pipe): | class CoreferencePipe(Pipe): | ||||
@@ -25,8 +27,8 @@ class CoreferencePipe(Pipe): | |||||
def process(self, data_bundle: DataBundle): | def process(self, data_bundle: DataBundle): | ||||
""" | """ | ||||
对load进来的数据进一步处理 | |||||
原始数据包含:raw_key,raw_speaker,raw_words,raw_clusters | |||||
对load进来的数据进一步处理原始数据包含:raw_key,raw_speaker,raw_words,raw_clusters | |||||
.. csv-table:: | .. csv-table:: | ||||
:header: "raw_key", "raw_speaker","raw_words","raw_clusters" | :header: "raw_key", "raw_speaker","raw_words","raw_clusters" | ||||
@@ -35,6 +37,7 @@ class CoreferencePipe(Pipe): | |||||
"[...]", "[...]","[...]","[...]" | "[...]", "[...]","[...]","[...]" | ||||
处理完成后数据包含文章类别、speaker信息、句子信息、句子对应的index、char、句子长度、target: | 处理完成后数据包含文章类别、speaker信息、句子信息、句子对应的index、char、句子长度、target: | ||||
.. csv-table:: | .. csv-table:: | ||||
:header: "words1", "words2","words3","words4","chars","seq_len","target" | :header: "words1", "words2","words3","words4","chars","seq_len","target" | ||||
@@ -146,15 +146,18 @@ class CWSPipe(Pipe): | |||||
其中bigrams仅当bigrams列为True的时候为真 | 其中bigrams仅当bigrams列为True的时候为真 | ||||
:param str,None dataset_name: 支持'pku', 'msra', 'cityu', 'as', None | |||||
:param str encoding_type: 可以选择'bmes', 'segapp'两种。"我 来自 复旦大学...", bmes的tag为[S, B, E, B, M, M, E...]; segapp | |||||
的tag为[seg, app, seg, app, app, app, seg, ...] | |||||
:param bool replace_num_alpha: 是否将数字和字母用特殊字符替换。 | |||||
:param bool bigrams: 是否增加一列bigram. bigram的构成是['复', '旦', '大', '学', ...]->["复旦", "旦大", ...] | |||||
:param bool trigrams: 是否增加一列trigram. trigram的构成是 ['复', '旦', '大', '学', ...]->["复旦大", "旦大学", ...] | |||||
""" | """ | ||||
def __init__(self, dataset_name=None, encoding_type='bmes', replace_num_alpha=True, bigrams=False, trigrams=False): | def __init__(self, dataset_name=None, encoding_type='bmes', replace_num_alpha=True, bigrams=False, trigrams=False): | ||||
""" | |||||
:param str,None dataset_name: 支持'pku', 'msra', 'cityu', 'as', None | |||||
:param str encoding_type: 可以选择'bmes', 'segapp'两种。"我 来自 复旦大学...", bmes的tag为[S, B, E, B, M, M, E...]; segapp | |||||
的tag为[seg, app, seg, app, app, app, seg, ...] | |||||
:param bool replace_num_alpha: 是否将数字和字母用特殊字符替换。 | |||||
:param bool bigrams: 是否增加一列bigram. bigram的构成是['复', '旦', '大', '学', ...]->["复旦", "旦大", ...] | |||||
:param bool trigrams: 是否增加一列trigram. trigram的构成是 ['复', '旦', '大', '学', ...]->["复旦大", "旦大学", ...] | |||||
""" | |||||
if encoding_type == 'bmes': | if encoding_type == 'bmes': | ||||
self.word_lens_to_tags = _word_lens_to_bmes | self.word_lens_to_tags = _word_lens_to_bmes | ||||
else: | else: | ||||
@@ -253,7 +256,7 @@ class CWSPipe(Pipe): | |||||
def process_from_file(self, paths=None) -> DataBundle: | def process_from_file(self, paths=None) -> DataBundle: | ||||
""" | """ | ||||
:param str paths: | :param str paths: | ||||
:return: | :return: | ||||
""" | """ | ||||
@@ -37,11 +37,14 @@ class MatchingBertPipe(Pipe): | |||||
words列被设置为input,target列被设置为target和input(设置为input以方便在forward函数中计算loss, | words列被设置为input,target列被设置为target和input(设置为input以方便在forward函数中计算loss, | ||||
如果不在forward函数中计算loss也不影响,fastNLP将根据forward函数的形参名进行传参). | 如果不在forward函数中计算loss也不影响,fastNLP将根据forward函数的形参名进行传参). | ||||
:param bool lower: 是否将word小写化。 | |||||
:param str tokenizer: 使用什么tokenizer来将句子切分为words. 支持spacy, raw两种。raw即使用空格拆分。 | |||||
""" | """ | ||||
def __init__(self, lower=False, tokenizer: str = 'raw'): | def __init__(self, lower=False, tokenizer: str = 'raw'): | ||||
""" | |||||
:param bool lower: 是否将word小写化。 | |||||
:param str tokenizer: 使用什么tokenizer来将句子切分为words. 支持spacy, raw两种。raw即使用空格拆分。 | |||||
""" | |||||
super().__init__() | super().__init__() | ||||
self.lower = bool(lower) | self.lower = bool(lower) | ||||
@@ -163,12 +166,14 @@ class MatchingPipe(Pipe): | |||||
words1是premise,words2是hypothesis。其中words1,words2,seq_len1,seq_len2被设置为input;target被设置为target | words1是premise,words2是hypothesis。其中words1,words2,seq_len1,seq_len2被设置为input;target被设置为target | ||||
和input(设置为input以方便在forward函数中计算loss,如果不在forward函数中计算loss也不影响,fastNLP将根据forward函数 | 和input(设置为input以方便在forward函数中计算loss,如果不在forward函数中计算loss也不影响,fastNLP将根据forward函数 | ||||
的形参名进行传参)。 | 的形参名进行传参)。 | ||||
:param bool lower: 是否将所有raw_words转为小写。 | |||||
:param str tokenizer: 将原始数据tokenize的方式。支持spacy, raw. spacy是使用spacy切分,raw就是用空格切分。 | |||||
""" | """ | ||||
def __init__(self, lower=False, tokenizer: str = 'raw'): | def __init__(self, lower=False, tokenizer: str = 'raw'): | ||||
""" | |||||
:param bool lower: 是否将所有raw_words转为小写。 | |||||
:param str tokenizer: 将原始数据tokenize的方式。支持spacy, raw. spacy是使用spacy切分,raw就是用空格切分。 | |||||
""" | |||||
super().__init__() | super().__init__() | ||||
self.lower = bool(lower) | self.lower = bool(lower) | ||||
@@ -13,6 +13,7 @@ class Pipe: | |||||
doc | doc | ||||
""" | """ | ||||
def process(self, data_bundle: DataBundle) -> DataBundle: | def process(self, data_bundle: DataBundle) -> DataBundle: | ||||
""" | """ | ||||
对输入的DataBundle进行处理,然后返回该DataBundle。 | 对输入的DataBundle进行处理,然后返回该DataBundle。 | ||||