Pytorch AllenNLP DatasetReader.read返回生成器,而不是AllennlpDataset 在研究AllenNLP框架(版本2.0.1)时,我尝试从https://guide.allennlp.org/training-and-prediction#1. 从拼花地板文件读取数据时,我得到: TypeError: unsupported operand type(s) for +: 'generator' and 'generator'
下一行:Pytorch AllenNLP DatasetReader.read返回生成器,而不是AllennlpDataset 在研究AllenNLP框架(版本2.0.1)时,我尝试从https://guide.allennlp.org/training-and-prediction#1. 从拼花地板文件读取数据时,我得到: TypeError: unsupported operand type(s) for +: 'generator' and 'generator',pytorch,allennlp,Pytorch,Allennlp,下一行: vocab = build_vocab(train_data + dev_data) 我怀疑返回值应该是AllennlpDataset,但可能是我弄错了。 我做错了什么 完整代码: train_path = <some_path> test_path = <some_other_path> class ClassificationJobReader(DatasetReader): def __init__(self,
vocab = build_vocab(train_data + dev_data)
我怀疑返回值应该是AllennlpDataset,但可能是我弄错了。
我做错了什么
完整代码:
train_path = <some_path>
test_path = <some_other_path>
class ClassificationJobReader(DatasetReader):
def __init__(self,
lazy: bool = False,
tokenizer: Tokenizer = None,
token_indexers: Dict[str, TokenIndexer] = None,
max_tokens: int = None):
super().__init__(lazy)
self.tokenizer = tokenizer or WhitespaceTokenizer()
self.token_indexers = token_indexers or {'tokens': SingleIdTokenIndexer()}
self.max_tokens = max_tokens
def _read(self, file_path: str) -> Iterable[Instance]:
df = pd.read_parquet(data_path)
for idx in df.index:
text = row['title'][idx] + ' ' + row['description'][idx]
print(f'text : {text}')
label = row['class_id'][idx]
print(f'label : {label}')
tokens = self.tokenizer.tokenize(text)
if self.max_tokens:
tokens = tokens[:self.max_tokens]
text_field = TextField(tokens, self.token_indexers)
label_field = LabelField(label)
fields = {'text': text_field, 'label': label_field}
yield Instance(fields)
def build_dataset_reader() -> DatasetReader:
return ClassificationJobReader()
def read_data(reader: DatasetReader) -> Tuple[Iterable[Instance], Iterable[Instance]]:
print("Reading data")
training_data = reader.read(train_path)
validation_data = reader.read(test_path)
return training_data, validation_data
def build_vocab(instances: Iterable[Instance]) -> Vocabulary:
print("Building the vocabulary")
return Vocabulary.from_instances(instances)
dataset_reader = build_dataset_reader()
train_data, dev_data = read_data(dataset_reader)
vocab = build_vocab(train_data + dev_data)
列车路径=
测试路径=
类ClassificationJobReader(DatasetReader):
定义初始化(自我,
lazy:bool=False,
标记器:标记器=无,
令牌索引器:Dict[str,令牌索引器]=None,
最大令牌数:int=None):
super()。\uuuu init\uuuu(惰性)
self.tokenizer=tokenizer或WhitespaceTokenizer()
self.token\u indexer=令牌\u索引器或{'tokens':SingleIdTokenIndexer()}
self.max\u令牌=max\u令牌
def_read(self,file_path:str)->Iterable[Instance]:
df=pd.读取拼花地板(数据路径)
对于df.index中的idx:
text=行['title'][idx]+''+行['description'][idx]
打印(f'text:{text}')
label=行['class_id'][idx]
打印(f'label:{label}')
tokens=self.tokenizer.tokenize(文本)
如果self.max_令牌:
令牌=令牌[:self.max\u令牌]
text\u field=TextField(令牌、self.token\u索引器)
标签\字段=标签字段(标签)
字段={'text':文本字段,'label':label\u字段}
产量实例(字段)
def build_dataset_reader()->DatasetReader:
返回ClassificationJobReader()
def read_data(reader:DatasetReader)->Tuple[Iterable[Instance],Iterable[Instance]]:
打印(“读取数据”)
training\u data=读卡器.read(train\u路径)
验证\数据=读卡器.read(测试\路径)
返回培训数据、验证数据
def build_vocab(实例:Iterable[Instance])->词汇:
打印(“建立词汇表”)
返回词汇表.from_实例(实例)
dataset\u reader=构建\u dataset\u reader()
列车数据,开发数据=读取数据(数据集读取器)
vocab=构建vocab(训练数据+开发数据)
感谢您的帮助请先查找下面的代码修复,然后再查找解释
代码修复
#extend_from_实例使用作为参数传递的实例扩展词汇表
#因此相当于词汇表
#以前
词汇表.从实例扩展实例(训练数据)
词汇表.从_实例(dev_数据)扩展_
解释
这是因为AllenNLP API在AllenNLP==2.0.1中有几处突破性的更改。您可以找到变更日志和升级指南。据我所知,该指南已经过时(这反映了AllenNLP感谢您的回答!我们正在将指南升级到AllenNLP 2.0。非常感谢您的回答您非常欢迎@Ido,如果它对您有所帮助,如果您能将我的回答标记为“已接受”,我将不胜感激。祝您好运!对于指南的混乱,我深表歉意。这将在合并后更新。