import os
import pandas as pd
from collections import Counter
from data_process import split_text
from tqdm import tqdm
import jieba.posseg as psg # 结巴的词性标注
train_dir = '自己写'
def process_text(idx, split_method=None):
"""
idx:文件的名字 不要扩展名
split_method:切割文本的方法 是一个函数
这个函数的目的: 读取文本 切割 然后打上标记 并提取 词边界,词性,偏旁部首,拼音等文本特征
"""
data = {} # 用来保存我们所有的字的文本特征
#————————————————————————————————————获取句子—————————————————————————————————————————————#
if split_method is None:
with open(f'../data/{train_dir}/{idx}.txt', 'r', encoding='utf8') as f: # 可以根据我们每次传进来的idx读取不同的文件
texts = f.readlines()
else:
with open(f'../data/{train_dir}/{idx}.txt', 'r', encoding='utf8') as f:
texts = f.read()
texts = split_method(texts)
data['word'] = texts # 将提取出来的句子 赋值给字典data的word键!!!!
获取标签
怎么打标签 先给拿到的每一个字都打上O标记 获取到的数据是一个很长的列表 列表里面很多字符串 那么就给列表里的每一个元素标上O
tag_list = ['O' for s in texts for x in s] #先遍历texts里的每一句话 再遍历每一句话里的每一
return tag_list # 个字
读取这个文件对应的ann文件 然后拿到ann文件的 实体类别 和起始位置终止位置 找到下标为[1845, 1850]的 把下标改成Disease
tag = pd.read_csv(f'datas/{train_dir}/{idx}.ann',header=None, seq='\t') #没有表头 分隔符用的\t
for i in range(tag.shape[0]): # 行遍历
tag_item = tag.iloc[i][1].split(' ') # 取行下标为i 列下表为1的 也就是Disease 1845 1850 然后按 空格隔开
cls, start, end = tag_item[0], int(tag_item[1]), int(tag_item[-1])
# print(tag_item)
tag_list[start] = 'B-' + cls # 要终止位置减一才是实体的最后位置
for j in range(start+1, end):
tag_list[j] = 'I-' + cls
assert len([x for s in texts for x in s]) == len(tag_list) #双重for s是texts里的句子 先把句子遍历出来 x是一个句子里有多少个字 再把字遍历出来 返回的是x
return tag_list # 看标签打好了没有
打上标签这部分是非常重要的 也是经常用到的
统计一下 texts里面有多少个字
for s in texts:
l = len(s)
end += 1
tags.append(tag_list[start:end])
start += 1
data['label'] = tags
return texts, tags