【NER】CCL2021医疗命名体识别之数据预处理(处理.json文件)

【NER】医疗命名体识别之数据预处理(处理.json文件)

数据来源:2021年中文计算语言学研究大会的智能对话诊疗评测比赛

任务: 根据提供的医患对话,(1)识别其中的药物和症状实体名称。(2)然后根据医患对话中识别的症状和服用的药物名称,以及患者自述的上下文,根据模板生成医疗报告。

数据预处理任务: 提取出.json文件中的BIO标注,存放进train.txt

一、原始数据

train.json文件中包含完整的医生和患者之间的对话信息,并且该数据中已经完成了疾病判断、自我报告、对话生成、序列标注任务,如下图所示:
请添加图片描述

二、目标数据(用于训练的数据)

训练数据需要将文本和标注一一对应,如下图所示:

请添加图片描述

三、具体实现
  1. 导入包json、tqdm其中json包用来处理json文件,tqdm包用来生成一个进度条,提示进度信息。
    tqdm作用如图:请添加图片描述
  2. 打开train.json文件,train_sent_txt保存所有的词和标签。原始数据中有用的部分为“sentence”“BIO_label”,分别用sent_textsent_label存储
  3. 将得到的训练数据按照格式存储到train_data.txt
  4. 具体代码如下:
    import json
    from tqdm import tqdm
    
    train_path = r"原始数据/train.json"
    # 保留所有的词和标签
    with open(train_path, 'r', encoding='utf8') as fp:
        json_train = json.load(fp)
        train_sent_txt = []
        for k_id in tqdm(json_train):
            dialogue = json_train[k_id]['dialogue']
            for sent_dict in dialogue:
                sent_text = sent_dict['sentence']  # 文本
                sent_label = sent_dict['BIO_label']  # 标签
                sent_item = [char + " " + sent_label.split(' ')[i] for i, char in enumerate(sent_text)]  # 将文本和标签放在一起
                train_sent_txt = train_sent_txt + sent_item + ['\n']
    
    # 将数据写入train_data.txt
    file = open('train_data.txt', 'w', encoding='utf8')
    for i in range(len(train_sent_txt)):
        if str(train_sent_txt[i]) != '\n':
            s = str(train_sent_txt[i]) + '\n'
        else:
            s = str(train_sent_txt[i])
        file.write(s)
    file.close()
    
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用NER标记output.txt文件json格式的数据的流程如下: 1. 读取output.txt文件中的json数据,可以使用Python内置的json库。 ```python import json with open('output.txt', 'r', encoding='utf-8') as f: for line in f: data = json.loads(line.strip()) # 对每个json数据进行处理 # ... ``` 2. 对每个json数据进行处理,首先需要获取文本内容和实标签。假设json数据的格式如下: ```json { "status": 0, "message": "success", "result": { "words": [ { "word": "张三", "location": { "left": 123, "top": 45, "width": 67, "height": 89 }, "text_type": "name" }, { "word": "李四", "location": { "left": 234, "top": 56, "width": 78, "height": 90 }, "text_type": "name" }, { "word": "北京市海淀区中关村", "location": { "left": 345, "top": 67, "width": 89, "height": 123 }, "text_type": "address" } ] } } ``` 可以通过以下代码获取文本内容和实标签: ```python words = data['result']['words'] text = ''.join([word['word'] for word in words]) tags = ['O'] * len(text) # 初始化标签,O表示非实 for word in words: start = word['location']['left'] end = start + word['location']['width'] tag = 'B-' + word['text_type'] # 实的开始标签 for i in range(start, end): if i == start: tags[i] = tag else: tags[i] = 'I-' + word['text_type'] # 实的内部标签 ``` 这里假设实类型包括name和address,因此实的标签可以分别为B-name、I-name、B-address和I-address。该代码将文本内容和实标签保存在text和tags变量中。 3. 对获取到的文本内容和实标签进行NER标记。可以使用常见的NER模型如CRF、BiLSTM和BERT等进行训练和预测。这里以CRF为例,使用Python库sklearn-crfsuite实现。 ```python from sklearn_crfsuite import CRF from sklearn.model_selection import cross_val_predict from sklearn.metrics import classification_report # 特征提取函数,可以根据实际情况进行修改 def word2features(text, i): features = { 'bias': 1.0, 'word.lower()': text[i].lower(), 'word[-3:]': text[i][-3:], 'word[-2:]': text[i][-2:], 'word.isupper()': text[i].isupper(), 'word.istitle()': text[i].istitle(), 'word.isdigit()': text[i].isdigit() } if i > 0: features.update({ 'prev_word.lower()': text[i-1].lower(), 'prev_word.istitle()': text[i-1].istitle(), 'prev_word.isupper()': text[i-1].isupper() }) else: features['BOS'] = True # 开始位置 if i < len(text) - 1: features.update({ 'next_word.lower()': text[i+1].lower(), 'next_word.istitle()': text[i+1].istitle(), 'next_word.isupper()': text[i+1].isupper() }) else: features['EOS'] = True # 结束位置 return features # 特征集提取函数 def extract_features(text, tags): return [word2features(text, i) for i in range(len(text))], tags # 定义CRF模型 crf = CRF(algorithm='lbfgs', c1=0.1, c2=0.1, max_iterations=100, all_possible_transitions=True) # 特征集提取和标签预测 X, y = [], [] with open('output.txt', 'r', encoding='utf-8') as f: for line in f: data = json.loads(line.strip()) words = data['result']['words'] text = ''.join([word['word'] for word in words]) tags = ['O'] * len(text) # 初始化标签,O表示非实 for word in words: start = word['location']['left'] end = start + word['location']['width'] tag = 'B-' + word['text_type'] # 实的开始标签 for i in range(start, end): if i == start: tags[i] = tag else: tags[i] = 'I-' + word['text_type'] # 实的内部标签 X_i, y_i = extract_features(text, tags) X.append(X_i) y.append(y_i) # 训练CRF模型并进行交叉验证 y_pred = cross_val_predict(crf, X, y, cv=5) # 输出分类报告 print(classification_report(y, y_pred)) ``` 该代码首先定义了一个特征提取函数`word2features()`,用于将每个词转换为一组特征。然后定义了一个特征集提取函数`extract_features()`,用于将文本和实标签转换为特征集。接着定义了一个CRF模型,并使用交叉验证进行训练和预测。最后输出分类报告,包括精度、召回率和F1得分等指标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值