原始数据样例
5)房室结消融和起搏器植入作为反复发作或难治性心房内折返性心动过速的替代疗法。|||3 7 pro|||9 13 pro|||16 33 dis|||
(6)发作一次伴血流动力学损害的室性心动过速(ventriculartachycardia),可接受导管消融者。|||8 21 dis|||23 44 dis|||50 53 pro|||
4.第三类(1)无症状性WPW综合征患者,年龄小于5岁。|||8 17 dis|||
处理后数据样例
( O
5 O
) O
房 B-pro
室 I-pro
结 I-pro
消 I-pro
融 E-pro
和 O
起 B-pro
搏 I-pro
器 I-pro
植 I-pro
入 E-pro
作 O
为 O
反 B-dis
复 I-dis
发 I-dis
作 I-dis
或 I-dis
难 I-dis
治 I-dis
性 I-dis
心 I-dis
房 I-dis
内 I-dis
折 I-dis
返 I-dis
性 I-dis
心 I-dis
动 I-dis
过 I-dis
速 E-dis
的 O
替 O
代 O
疗 O
法 O
。 O
( O
6 O
) O
发 O
作 O
一 O
次 O
伴 O
血 B-dis
流 I-dis
动 I-dis
力 I-dis
学 I-dis
损 I-dis
害 I-dis
的 I-dis
室 I-dis
性 I-dis
心 I-dis
动 I-dis
过 I-dis
速 E-dis
( O
v B-dis
e I-dis
n I-dis
t I-dis
r I-dis
i I-dis
c I-dis
u I-dis
l I-dis
a I-dis
r I-dis
t I-dis
a I-dis
c I-dis
h I-dis
y I-dis
c I-dis
a I-dis
r I-dis
d I-dis
i I-dis
a E-dis
) O
, O
可 O
接 O
受 O
导 B-pro
管 I-pro
消 I-pro
融 E-pro
者 O
。 O
4 O
. O
第 O
三 O
类 O
( O
1 O
) O
无 B-dis
症 I-dis
状 I-dis
性 I-dis
W I-dis
P I-dis
W I-dis
综 I-dis
合 I-dis
征 E-dis
患 O
者 O
, O
年 O
龄 O
小 O
于 O
5 O
岁 O
。 O
处理代码
import os
import re
# 把re认为是一个正则表达式module
def get_data_lists(filepath):
# 打开所要处理的文件
# python的with open()函数,第一个参数是读取文件路径,第二个参数是读取方式('r':只读,'w':只写,'r+':读写均可,'a':可追加至文件末尾)
# 第四个参数是指如果读取发生错误的处理方式
with open(filepath, "r", encoding='utf-8', errors='ignore') as fp:
text = fp.readlines() # fp.readlines():返回的是由字符串构成的 list
tag_lists = []
word_lists = []
for sent in range(len(text)):
'''
r'' 告诉python这是一个原始字符串,将不处理转义序列(\n、\b 等)
>>> print('\n') # 打印换行符 >>>print(r'\n') # 不处理转义序列\n
>>> print('\b') # 打印退格字符 >>>print(r'\b') # 不处理转义序列\b
re.findall(pattern, string, flags=0)
pattern -->正则表达式
string -->需要处理的字符串
flags -->说明匹配模式
'''
# 对列表里的每个句子进行处理,获取标注信息labels和文本信息content
labels = re.findall(r'(?<=\|\|\|).*?(?=\|\|\|)', text[sent])
content = re.findall(r'.*?(?=\|\|\|)', text[sent])[0]
# 将文本转化为单字序列
word_list = [word for word in content]
word_lists.append(word_list)
# 生成标记序列
tag_list = []
begin = []
end = []
tags = []
# begin包含所有实体的起始位置,end包含对应实体的结束为止,tags包含对应标注内容
for j in range(len(labels)):
pos = re.split(r'\s', labels[j])
pos = [x for x in pos if x != '']
begin.append(int(pos[0]))
end.append(int(pos[1]))
tags.append(pos[2])
# 从文本第一个位置开始,生成标记序列
idxb = 0
for i in range(len(content)):
if i in begin:
idxb = begin.index(i)
tag = 'B' + '-' + tags[idxb]
elif (i > begin[idxb]) & (i < end[idxb]):
tag = 'I' + '-' + tags[idxb]
elif i == end[idxb]:
tag = 'E' + '-' + tags[idxb]
else:
tag = 'O'
tag_list.append(tag)
tag_lists.append(tag_list)
return tag_lists, word_lists
# 将数据写入新文件操作
def write_data(path, word_data, tag_data):
new_word_data = []
new_tag_data = []
# 先处理成一维数组
for line in word_data:
for i in line:
new_word_data.append(i)
for line in tag_data:
for i in line:
new_tag_data.append(i)
with open(path, "w", encoding="utf-8") as fw: # 打开指定文件
for i in range(len(new_word_data)):
fw.write(new_word_data[i] + " " + new_tag_data[i] + "\n") # 每行末尾添加换行符
if __name__ == '__main__':
#训练集
train_tag_lists, train_word_lists = get_data_lists('./raw_data/train_data.txt')
write_data('./new_data/train.txt', train_word_lists, train_tag_lists)
#验证集
val_tag_lists, val_word_lists = get_data_lists('./raw_data/val_data.txt')
write_data('./new_data/eval.txt', val_word_lists, val_tag_lists)
处理代码
import os
import re
# 把re认为是一个正则表达式module
def process_test_data(filepath, newpath):
# 把原始数据处理成一维字序列
testdata = []
with open(filepath, "r", encoding='utf-8', errors='ignore') as fp:
text = fp.readlines()
for sent in range(len(text)):
content = re.findall(r'.', text[sent])
for word in content:
testdata.append(word)
# 写入文件
with open(newpath, "w", encoding="utf-8") as fw: # 打开指定文件
for i in range(len(testdata)):
fw.write(testdata[i] + "\n")
if __name__ == '__main__':
process_test_data('./raw_data/test2.txt', './new_data/test2.txt')