zoukankan      html  css  js  c++  java
  • NER的数据处理

    import os
    class TransferData:
        def __init__(self):
            cur = '/'.join(os.path.abspath(__file__).split('/')[:-1])  #获取当前文件地址的上级目录
            #对分类进行标记
            self.label_dict = {
                          '检查和检验': 'CHECK',
                          '症状和体征': 'SIGNS',
                          '疾病和诊断': 'DISEASE',
                          '治疗': 'TREATMENT',
                          '身体部位': 'BODY'}
    
            self.origin_path = os.path.join(cur, 'data_origin')  #原始数据地址
            self.train_filepath = os.path.join(cur, 'train.txt') #转化后的训练数据地址
            return
        def transfer(self):
            f = open(self.train_filepath, 'w+',encoding='utf-8')   #以写入的方式打开训练数据要保存的文件
            count = 0
            for root,dirs,files in os.walk(self.origin_path):
            #for (root, dirs, files) in walk(roots):
            # roots代表需要遍历的根文件夹;
            # root表示正在遍历的文件夹的名字(根/子);
            # dirs记录正在遍历的文件夹下的子文件夹集合;
            # files记录正在遍历的文件夹中的文件集合
                for file in files:
                    filepath = os.path.join(root, file)
                    if 'original' not in filepath:
                        continue
                    label_filepath = filepath.replace('.txtoriginal','')
                    print(filepath, '		', label_filepath)  #data_origin一般项目一般项目-1.txtoriginal.txt 	data_origin一般项目一般项目-1.txt
                    content = open(filepath,encoding='utf-8').read().strip()  #打开案例描述文件,去掉收尾空格
                    res_dict = {}
                    for line in open(label_filepath,encoding='utf-8'):  #打开实体类别文件
                        res = line.strip().split('	')  #每个实体描述按空格分隔 ['右髋部',‘21’,‘23’,‘身体部位’]
                        start = int(res[1])  #实体的其实字符位置
                        end = int(res[2])  #实体的结束字符位置
                        label = res[3]  #实体类别
                        label_id = self.label_dict.get(label)   #返回分类字典中实体类别对应的values,作为实体名称的id
                        for i in range(start, end+1):
                            if i == start:
                                label_cate = label_id + '-B'  #定义实体的首字符
                            else:
                                label_cate = label_id + '-I'  #实体的非首字符
                            res_dict[i] = label_cate   #构建实体字典{位置index:字符}
    
                    for indx, char in enumerate(content):  #indx文本中字符的位置,char字符
                        char_label = res_dict.get(indx, 'O')  #如果indx在字典的key中,则返回字典value;否则返回O,代表非实体
                        print(char, char_label)   #字符:字符实体标注
                        f.write(char + '	' + char_label + '
    ')
            f.close()
            return
    if __name__ == '__main__':
        handler = TransferData()
        train_datas = handler.transfer()
  • 相关阅读:
    SERV-U处于“域正离线”怎么办?
    在wampserver3.0.6中配置虚拟主机(设置二级域名)
    解决Win7系统新建选项中无记事本问题
    解决Windows Server 2008 R2安装WAMPSERVER3.0.6问题总结
    php实现定时任务的思路
    https配置for apache
    jquery传值
    有趣的em
    自我感觉良好的配搭
    正则基础整理
  • 原文地址:https://www.cnblogs.com/hrnn/p/13534744.html
Copyright © 2011-2022 走看看