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,如果它对您有所帮助,如果您能将我的回答标记为“已接受”,我将不胜感激。祝您好运!对于指南的混乱,我深表歉意。这将在合并后更新。