这几天再看关于医学命名实体识别的论文,想着自己尝试去运行一下论文中的代码。但是第一步就是我们对数据记得处理。结合csdn中的一些博主的代码命名实体识别ccks2020数据集的数据预处理之上进行了修改,因为我需要的格式需要对数据集中的每一个句子进行编码。为了方便得到每一个句子的编码表示。我们在预处理时为每一个句字中间都加了一个\n\n用来区分不同的句子。
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]
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):
with open(path, "w", encoding="utf-8") as fw: # 打开指定文件
for line1, line2 in zip(word_data, tag_data):
for l1, l2 in zip(line1, line2):
fw.write(l1 + " " + l2 + "\n") # 每行末尾添加换行符
fw.write("\n\n")
if __name__ == '__main__':
# 训练集
train_tag_lists, train_word_lists = get_data_lists('./train_data.txt')
write_data('./new_data/train.txt', train_word_lists, train_tag_lists)
# 验证集
val_tag_lists, val_word_lists = get_data_lists('./val_data.txt')
write_data('./new_data/eval.txt', val_word_lists, val_tag_lists)