第8章:命名实体识别——手动标注BIO

手动数据标注+BIO标注

原数据:

如何预防高血压?高血压的防治高血压的防治
我是小三阳,有糖尿病,高血脂,我该怎么吃药?糖尿病患者能吃减肥药吗.
糖尿病的的危害,糖尿病怎样治疗呢
医院糖尿病肾病治疗怎么样,糖尿病如何防治?
糖尿病人能吃蜂王浆吗,高血糖可以喝蜂蜜吗
乳腺癌术后淋巴结转移怎么办,乳腺癌脾脏转移怎么办?
糖尿病肾病三期能治愈吗,糖尿病可怕些还是慢性肾炎可怕些??只能
25阳性,还需注射乙肝疫苗加强针吗,小时候打的乙肝疫苗是打多少针的呢能预防多久
吃多含糖食物会得糖尿病吗?什么人容易的糖尿病
高血压喝什么汤比较好可以喝猪骨汤吗,高血压患者能喝羊汤吗昨晚喝了四小碗羊汤
喝饮料会影响尿糖检测吗,糖尿病引起代酸的原因和机制
乙肝小三阳治疗方法都有哪些,乙肝小三阳治疗方法
强直性脊柱炎好多年了能治吗,强直性脊柱炎,哪个医院好强直性脊柱炎,哪个医院好
怀孕糖尿病怎么办,孕妇糖尿病怎么办
乳腺癌术后如何用药,乳腺癌术后五年用药
得了艾滋病会死吗,得了艾滋病什么时候会死啊
糖尿病引起的肾衰竭吃什么药,~~糖尿病患者的血小板高怎么回事
乳房有硬块是不是乳腺癌,请问乳房有硬块就一定会是乳腺癌吗?
老年人高血压如何防治?高血压的标准是什么,我的血压9514
重型乙肝治疗要多少钱,重型乙肝饮食方案
慢性乙肝就诊科室在哪,一被慢性乙肝患者传染到就是慢性的吗
万医生你好我老父亲糖尿病脚肿怎么治好,有糖尿病家族史,我会被遗传吗?

任务1:将一句话认为是一个txt文档

import os

raw_data_path = './data/raw_data.txt'

save_folder = './data/biaozhushuju'
if not os.path.exists(save_folder):
	os.makedirs(save_folder)

with open(raw_data_path,'r',encoding='utf8') as f:
	for i,line in enumerate(f.readlines()):
		line = line.strip()  #strip()表示删除掉数据中的换行符

		with open(os.path.join(save_folder,'%s.txt' % str(10000+i)),'w',encoding='utf8') as fo:  #os.path.join()函数用于路径拼接文件路径,可以传入多个路径
			fo.write(line)

任务2:利用标注软件对txt文档进行标注

2.1BRAT标注(运行于Linux系统中)
2.2精灵标注助手(运行于Win系统)

任务3:将标注后的ann文件和原数据进行BIL标注

import glob
def bratann2BIO_format(text,ann_str,fstream):
   #将每一行的元素变为list,strip()删除的字符,按照split()中的符号进行每行元素分割为list的元素
  ann_list = ann_str.strip().split('\n')
  
  
  label = ['O' for _ in range(len(text))] #对所有的文字赋值为标签"O"
  for i,line in enumerate(ann_list): #enumerate函数用于遍历序列中的元素以及它们的下标   
    try:
        #line:T1    疾病 4 7  高血压
      T,typ,word = line.strip().split('\t') 
      t,s,e = typ.split() #分别t=疾病 s=起始位置下标 e=结束位置
      s,e = int(s),int(e)
      label[s] = 'B-'+t
      while s < e-1:
        s += 1
        label[s] = 'I-'+t
    except:
      continue
   
  for t,l in zip(list(text),label):  #list() 构造函数在 Python 中返回一个列表,将文本以字切分为列表
      #str.join(item1,itemm2),join函数是一个字符串操作函数,使用str符号将item1和item2串联起来
      line = ' '.join([t,l])
      print(line)
      fstream.write(line)
      fstream.write('\n') #每一个文本(一行)写完,然后进行换行
   stream.write('\n') #使用换行符,将每一个文本用一个空行分开,在train.txt文档中可以很清晰的看到句与句的切分

def gen_NER_training_data():
  # 设置标注文件所在文件夹目录
  root_dir = './data/biaozhushuju/outputs'
  # 设置训练样本输出文件路径
  stream = open('./data/train.txt','a+',encoding='utf8')
  # ann:E:\工作空间\NER-data-process\data\biaozhushuju\outputs\10000.ann
  # txt:E:\工作空间\NER-data-process\data\biaozhushuju\10000.txt
  file_list = glob.glob(root_dir+'/*.ann')  #glob.glob() 函数的作用:在一个文件中,要遍历所有的文件内容

  for ann_path in file_list:
      #转换路径:转换前:'./data/biaozhushuju/outputs\\10000.ann'
     # 转换为:'./data/biaozhushuju/outputs/10000.ann'
    ann_path = ann_path.replace('\\','/') 
   # 获得txt路径
    txt_path = ann_path.replace('/outputs','').replace('ann','txt') #将biaozhushuju取消,然后使用txt替换掉ann
    
    try:
      ft = open(txt_path,'r',encoding='utf8')
      text = ft.read().strip()
      ft.close()
      fa = open(ann_path,'r',encoding='utf8')
      ann = fa.read().strip()
      fa.close()
      if ann == '':
        continue
      bratann2BIO_format(text,ann,stream)
    except Exception as e:
      print(ann_path,e)
      
  stream.close()

if __name__ == '__main__':
  gen_NER_training_data()

标注结果:

第8章:命名实体识别——手动标注BIO_第1张图片

参考:https://www.bilibili.com/video/BV1ft4y1g7s7/?spm_id_from=333.337.search-card.all.click

你可能感兴趣的:(自然语言处理,python)