如何按70:10:20拆分CoNLL格式的NER数据集为训练、验证、测试集?
拆分CoNLL格式NER数据集为训练/验证/测试集
直接用Python结合scikit-learn就能完成,不需要专门的NER库,步骤如下:
1. 读取CoNLL格式数据
先把文件内容按句子拆分,连续的词-标签行组成一个句子,空行作为句子分隔符:
def load_conll_data(file_path): sentences = [] current_sentence = [] with open(file_path, 'r', encoding='utf-8') as f: for line in f: line = line.strip() if not line: # 空行标记句子结束,存入列表后重置当前句子 if current_sentence: sentences.append(current_sentence) current_sentence = [] else: # 拆分词和标签(取首词和末标签) parts = line.split() if len(parts) >= 2: word = parts[0] label = parts[-1] current_sentence.append((word, label)) # 处理文件末尾无空行的最后一个句子 if current_sentence: sentences.append(current_sentence) return sentences
2. 按比例拆分数据集
用sklearn.model_selection.train_test_split实现分层随机拆分,设置固定随机种子保证结果可复现:
from sklearn.model_selection import train_test_split # 加载原始数据集 data = load_conll_data('your_dataset.conll') # 第一步:拆分出20%的测试集,剩余80%作为训练+验证集 train_val, test = train_test_split(data, test_size=0.2, random_state=42) # 第二步:从80%的训练+验证集中拆分出10%总数据量的验证集(0.125*0.8=0.1) train, val = train_test_split(train_val, test_size=0.125, random_state=42)
3. 保存拆分后的数据集
将拆分后的句子列表写回CoNLL格式文件:
def save_conll_data(sentences, output_path): with open(output_path, 'w', encoding='utf-8') as f: for sent in sentences: for word, label in sent: f.write(f"{word} {label}\n") # 句子间用空行分隔 f.write("\n") # 分别保存三个数据集 save_conll_data(train, 'train.conll') save_conll_data(val, 'val.conll') save_conll_data(test, 'test.conll')
注意事项
- 先安装依赖:
pip install scikit-learn - 如果数据集每行包含多列(如词性标注),只需调整
load_conll_data中的拆分逻辑,确保取到首词和末标签即可 - 固定
random_state值可以让每次拆分结果一致,便于调试 - 处理文件时注意编码格式,避免出现乱码问题
内容的提问来源于stack exchange,提问作者Mai
相关产品推荐
相关产品推荐

