Python基于Kashgari NER模型的数据清洗与合并脚本
本文提供基于Kashgari库的Python代码,用于利用预训练Ner模型对Conll格式数据进行清洗与合并。核心逻辑包括读取原始数据,通过文本长度判断是否分块预测实体,最终将清洗后的文本与标签合并输出至目标文件,适用于需要批量处理序列标注数据的场景。
数据清洗与合并代码实现
直接展示相关实现代码。
# -*- coding: utf-8 -*-
from kashgari.corpus import DataReader
import re
from tqdm import tqdm
def cut_text(text, lenth):
textArr = re.findall('.{' + str(lenth) + '}', text)
textArr.append(text[(len(textArr) * lenth):])
return textArr
def clean_data(source_file, target_file, ner_model):
data_x, data_y = DataReader().read_conll_format_file(source_file)
with tqdm(total=len(data_x)) as pbar:
for idx, text_array in enumerate(data_x):
if len(text_array) <= 100:
ners = ner_model.predict([text_array])
ner = ners[0]
else:
texts = cut_text(''.join(text_array), 100)
ners = []
for text in texts:
ner = ner_model.predict([[char for char in text]])
ners = ners + ner[0]
ner = ners
# print('[-----------------------', idx, len(data_x))
# print(data_y[idx])
# print(ner)
for jdx, t in enumerate(text_array):
if ner[jdx].startswith('B') or ner[jdx].startswith('I') :
if data_y[idx][jdx] == 'O':
data_y[idx][jdx] = ner[jdx]
# print(data_y[idx])
# print('-----------------------]')
pbar.update(1)
f = open(target_file, 'a', encoding="utf-8")
for idx, text_array in enumerate(data_x):
if idx != 0:
f.writelines(['\n'])
for jdx, t in enumerate(text_array):
text = t + ' ' + data_y[idx][jdx]
if idx == 0 and jdx == 0:
text = text
else:
text = '\n' + text
f.writelines([text])
f.close()
data_x2, data_y2 = DataReader().read_conll_format_file(source_file)
print(data_x == data_x2, len(data_y) == len(data_y2), '数据清洗完成')
# -*- coding: utf-8 -*-
import kashgari
from data_tools import clean_data
time_ner = kashgari.utils.load_model('time_ner.h5')
clean_data('./data/example.dev', 'example.dev', time_ner)
以上分享了利用Python结合已有Ner模型进行数据清洗与合并的完整代码示例,供读者参考使用,欢迎支持。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









