# Copyright (c) 2019 PaddlePaddle Authors. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License" # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from __future__ import absolute_import from __future__ import division from __future__ import print_function import os import csv import json from collections import namedtuple from paddlehub.dataset import InputExample, HubDataset from paddlehub.common.downloader import default_downloader from paddlehub.common.dir import DATA_HOME from paddlehub.common.logger import logger DATA_URL = "https://paddlehub-dataset.bj.bcebos.com/msra_ner.tar.gz" class MSRA_NER(HubDataset): """ A set of manually annotated Chinese word-segmentation data and specifications for training and testing a Chinese word-segmentation system for research purposes. For more information please refer to https://www.microsoft.com/en-us/download/details.aspx?id=52531 """ def __init__(self): self.dataset_dir = os.path.join(DATA_HOME, "msra_ner") if not os.path.exists(self.dataset_dir): ret, tips, self.dataset_dir = default_downloader.download_file_and_uncompress( url=DATA_URL, save_path=DATA_HOME, print_progress=True) else: logger.info("Dataset {} already cached.".format(self.dataset_dir)) self._load_label_map() self._load_train_examples() self._load_test_examples() self._load_dev_examples() def _load_label_map(self): self.label_map_file = os.path.join(self.dataset_dir, "label_map.json") with open(self.label_map_file) as fi: self.label_map = json.load(fi) def _load_train_examples(self): train_file = os.path.join(self.dataset_dir, "train.tsv") self.train_examples = self._read_tsv(train_file) def _load_dev_examples(self): self.dev_file = os.path.join(self.dataset_dir, "dev.tsv") self.dev_examples = self._read_tsv(self.dev_file) def _load_test_examples(self): self.test_file = os.path.join(self.dataset_dir, "test.tsv") self.test_examples = self._read_tsv(self.test_file) def get_train_examples(self): return self.train_examples def get_dev_examples(self): return self.dev_examples def get_test_examples(self): return self.test_examples def get_labels(self): return ["B-PER", "I-PER", "B-ORG", "I-ORG", "B-LOC", "I-LOC", "O"] @property def num_labels(self): """ Return the number of labels in the dataset. """ return len(self.get_labels()) def get_label_map(self): return self.label_map def _read_tsv(self, input_file, quotechar=None): """Reads a tab separated value file.""" with open(input_file, "r") as f: reader = csv.reader(f, delimiter="\t", quotechar=quotechar) examples = [] seq_id = 0 header = next(reader) # skip header for line in reader: example = InputExample( guid=seq_id, label=line[1], text_a=line[0]) seq_id += 1 examples.append(example) return examples if __name__ == "__main__": ds = MSRA_NER() for e in ds.get_train_examples(): print("{}\t{}\t{}\t{}".format(e.guid, e.text_a, e.text_b, e.label))