Exemple #1
0
def get_data(train_data_path: str, dev_data_path: str, label2id_path: str, id2label_path: str):
    """
    传入训练集、验证集、标签字典路径,读取json文件内容,训练集、验证集数据以及标签字典。
    :param train_data_path:(str)训练集数据路径
    :param dev_data_path:(str)验证集数据路径
    :param label2id_path:(str)label2id字典路径
    :param id2label_path:(str)id2label字典路径
    :return:train_data(list)、dev_data(list)、label2id(dict)、id2label(dict)
    """
    if not valid_file(train_data_path):
        logger.error(f"训练数据{train_data_path} 路径错误!")
    elif not valid_file(dev_data_path):
        logger.error(f"验证数据{dev_data_path} 路径错误!")
    elif not valid_file(label2id_path):
        logger.error(f"cameo2id文件{label2id_path} 路径错误!")
    elif not valid_file(id2label_path):
        logger.error(f"id2cameo文件{id2label_path} 路径错误!")

    # 加载训练数据集
    train_data = read_json(train_data_path)
    # 加载验证集
    dev_data = read_json(dev_data_path)
    # 加载标签字典
    label2id = read_json(label2id_path)
    id2label = read_json(id2label_path)
    # 构造模型训练数据集[(sentence, cameo), ]
    train_data = [(data, label2id[label]) for data, label in list(train_data.items())]
    # 构造模型验证数据集[(sentence, cameo), ]
    dev_data = [(data, label2id[label]) for data, label in list(dev_data.items())]

    return train_data, dev_data, label2id, id2label
Exemple #2
0
def get_data(train_data_path: str, dev_data_path: str,
             supplement_data_dir: str):
    """
    传入训练集、验证集、补充数据路径,读取并解析json数据,将补充数据补充到训练集中,返回解析后的数据
    :param train_data_path:(str)训练集路径
    :param dev_data_path:(str)验证集路径
    :param supplement_data_dir:(str)补充数据保存路径
    :return:train_data(list), dev_data(list)
    """
    if not valid_file(train_data_path):
        logger.error(f"训练数据{train_data_path} 路径错误!")
    elif not valid_file(dev_data_path):
        logger.error(f"验证数据{dev_data_path} 路径错误!")
    elif not os.path.exists(supplement_data_dir) or os.path.isfile(
            supplement_data_dir):
        logger.error(f"补充数据集{supplement_data_dir} 文件夹路径错误!")

    # 加载训练数据集
    train_data = read_json(train_data_path)
    # 加载验证集
    dev_data = read_json(dev_data_path)

    # 加载补充数据
    file_list = os.listdir(supplement_data_dir)
    supplement_data = []
    for file in file_list:
        supplement_data_path = cat_path(supplement_data_dir, file)
        supplement_data.extend(read_json(supplement_data_path))
    train_data.extend(supplement_data)

    return train_data, dev_data
Exemple #3
0
def execute(raw_dir, target_dir):
    """
    传入原始标注数据文件夹路径和解析后文件存放的路径,按照时间生成json文件名称,将解析好的数据保存到目标文件夹
    :param raw_dir: 存放原始标注数据的文件夹
    :param target_dir: 存放解析后数据的文件夹
    :return: status--解析状态, corpus_num--数据量
    """
    # 存放所有解析后的数据
    all_datas = []
    # 语料中的句子数量
    all_sentence_num = 0
    # 语料中的事件数量
    all_event_num = 0

    try:
        # 判断数据路径是否正确
        if valid_dir(raw_dir):
            # 判断目标文件夹路径是否存在,不存在则创建
            if not valid_dir(target_dir):
                os.makedirs(target_dir)
            file_name = f"{time.strftime('%Y-%m-%d', time.localtime(time.time()))}.json"
            target_file_path = cat_path(target_dir, file_name)
            # 获取文件夹下所有文件的名称
            file_names = os.listdir(raw_dir)
            file_names = list(
                set(file_name.split(".")[0] for file_name in file_names))
            # 遍历文件进行解析
            for file_name in tqdm(file_names):
                file_path = os.path.join(raw_dir, file_name)
                # 判断两个文件是否都同时存在
                if valid_file(f"{file_path}.ann") and valid_file(
                        f"{file_path}.txt"):

                    # 解析文件获取事件和文件中的句子以及事件数量
                    data, sentence_num, event_num = data_process(file_path)
                    all_datas.extend(data)
                    all_sentence_num += sentence_num
                    all_event_num += event_num

            logger.info(f"总共有句子:{all_sentence_num},总共有事件:{all_event_num}")
            # 将解析后的数据保存到目标文件
            save_json(all_datas, target_file_path)

            return {
                "status": "success",
                "results": {
                    "sentences": all_sentence_num,
                    "events": all_event_num
                }
            }

        else:
            logger.error(f"存放原始标注数据的文件夹:{raw_dir}没有找到")
            raise FileNotFoundError
    except:
        trace = traceback.format_exc()
        logger.error(trace)
        return {"status": "failed", "results": trace}
def data_parse(source_dir, target_dir, verbose=False):
    """
    传入原始标注数据文件夹路径和解析后文件存放的路径,将解析好的数据保存到目标文件夹
    :param source_dir: 存放原始标注数据的文件夹
    :param target_dir: 存放解析后数据的文件夹
    :param verbose: 是否显示进度
    :return: status--解析状态, results--数据量
    """
    # 语料中的句子数量
    all_sentence_num = 0
    # 判断目标文件夹路径是否存在,不存在则创建
    if not valid_dir(target_dir):
        os.makedirs(target_dir)
    file_names = os.listdir(source_dir)
    file_names = list(set(file_name.split(".")[0] for file_name in file_names))
    with open(target_dir, 'w', encoding='utf-8') as f:
        # 显示进度
        if verbose:
            file_names = tqdm(file_names)
        # 同步遍历所有ann和txt文件,提取其中触发词信息
        for file_name in file_names:
            file_path = os.path.join(source_dir, file_name)
            # 判断两个文件是否都同时存在
            if valid_file(f"{file_path}.ann") and valid_file(f"{file_path}.txt"):
                # 解析文件获取关系触发词的索引
                try:
                    sentence, kw_infos = get_kw_ind(file_path)
                except Exception as e:
                    logger.error(f"触发词信息获取失败:{file_path}:{e}")
                    continue
                # 未获得触发词信息时,跳过这次循环
                if not kw_infos:
                    continue
                # 根据触发词位置信息,生成标签序列tag->['O', 'O', 'B-CS', 'I-CS', ...]
                try:
                    tag, kw_flag = data_trans(sentence, kw_infos)
                except Exception as e:
                    logger.error(f"生成标签序列失败:{file_path}:{e}")
                    continue
                # 不包含触发词时,跳出循环,这种情况一般是kw_infos中的触发词信息元组长度有问题,长度只能是3和5
                if not kw_flag:
                    continue
                # 遍历句子和标签序列,写入文件,文件中每一行为句子中的一个字和其对应的标签,例:但\tB-OS\n
                for i in range(len(sentence)):
                    f.write(sentence[i] + '\t' + tag[i] + '\n')
                f.write('\n')
                all_sentence_num += 1
            else:
                logger.error(f"ann或txt文件缺失:{file_path}")
                continue
    if all_sentence_num > 0:
        return {"status": "success", "results": {"sentences": all_sentence_num}}
    # 数据解析0条
    else:
        return {"status": "failed", "results": {"sentences": all_sentence_num}}
Exemple #5
0
def data_parse(source_dir, target_dir, verbose=False):
    """
    传入原始标注数据文件夹路径和解析后文件存放的路径,将解析好的数据保存到目标文件夹
    :param source_dir: 存放原始标注数据的文件夹
    :param target_dir: 存放解析后数据的文件夹
    :param verbose: 是否显示进度
    :return: status--解析状态, results--数据量
    """
    # 正反样本总数
    all_pos_num = 0
    all_neg_num = 0
    # 判断目标文件夹路径是否存在,不存在则创建
    if not valid_dir(target_dir):
        os.makedirs(target_dir)
    file_names = os.listdir(source_dir)
    file_names = list(set(file_name.split(".")[0] for file_name in file_names))
    with open(target_dir, 'w', encoding='utf-8') as f:
        # 显示进度
        if verbose:
            file_names = tqdm(file_names)
        # 同步遍历所有ann和txt文件,提取其中触发词信息
        for file_name in file_names:
            file_path = os.path.join(source_dir, file_name)
            # 判断两个文件是否都同时存在
            if valid_file(f"{file_path}.ann") and valid_file(
                    f"{file_path}.txt"):
                # 解析文件获取事件关系信息
                try:
                    event_rl_infos, num_pos, num_neg = get_rl_info(file_path)
                except Exception as e:
                    logger.error(f"事件关系信息获取失败:{file_path}:{e}")
                    continue
                # 未获得事件关系信息时,跳过这次循环
                if not event_rl_infos:
                    continue
                # 遍历句子和标签序列,写入文件,文件中每一行为句子中的一个字和其对应的标签,例:但\tB-OS\n
                for event_rl_info in event_rl_infos:
                    f.write(event_rl_info)
                all_pos_num += num_pos
                all_neg_num += num_neg
            else:
                logger.error(f"ann或txt文件缺失:{file_path}")
                continue
    # 确保正负样本个数大于1
    if all_pos_num * all_neg_num != 0:
        return {
            "status": "success",
            "results": {
                "pos_num": all_pos_num,
                "neg_num": all_neg_num
            }
        }
    # 数据解析0条
    else:
        return {
            "status": "failed",
            "results": {
                "pos_num": all_pos_num,
                "neg_num": all_neg_num
            }
        }