準備待標註數據
創建 raw_data.txt 待標註數據
如何預防高血壓?高血壓的防治高血壓的防治
我是小三陽,有糖尿病,高血脂,我該怎麼吃藥?糖尿病患者能喫減肥藥嗎.
糖尿病的的危害,糖尿病怎樣治療呢
醫院糖尿病腎病治療怎麼樣,糖尿病如何防治?
糖尿病人能喫蜂王漿嗎,高血糖可以喝蜂蜜嗎
乳腺癌術後淋巴結轉移怎麼辦,乳腺癌脾臟轉移怎麼辦?
糖尿病腎病三期能治癒嗎,糖尿病可怕些還是慢性腎炎可怕些?
喫多含糖食物會得糖尿病嗎?什麼人容易的糖尿病
將待標數據生成文件
generate_ann_data.py
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:
fo.write(line)
數據標註
下載標註軟件
精靈標註助手:http://www.jinglingbiaozhu.com/
創建項目
標註數據
將後面的數據全部標註
導出數據
ANN 轉 BIO
ann2bio.py
import glob
def bratann_to_bio_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]) # 使用空格連接文字和BIO標註,如果需要 tab形式間隔,可以換成 \t
print(line)
fstream.write(line)
fstream.write('\n') # 每一個文本(一行)寫完,然後進行換行
fstream.write('\n') # 使用換行符,將每一個文本用一個空行分開,在train.txt文檔中可以很清晰的看到句與句的切分
def gen_ner_training_data():
# 設置標註文件所在文件夾目錄
root_dir = './data/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/outputs\\10000.ann'
# 轉換爲:'./data/outputs/10000.ann'
ann_path = ann_path.replace('\\', '/')
# 獲得txt路徑
txt_path = ann_path.replace('/outputs', '').replace('ann', 'txt') # 然後使用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
bratann_to_bio_format(text, ann, stream)
except Exception as e:
print(ann_path, e)
stream.close()
if __name__ == '__main__':
gen_ner_training_data()
通過上面代碼,將 精靈標註助手 標的 ann 文件轉在 NLP 算法需要的 BIO 形式
來源:https://www.bilibili.com/video/BV1ft4y1g7s7/?spm_id_from=333.337.search-card.all.click