训练NER
在example/training中有spaCy提供的几个模型训练样例,直接拷贝一个train_ner.py到spaCy的根目录,然后修改代码中的训练语料,改成中文训练语料:
TRAIN_DATA = [
('到底谁是张三?',{
'entities': [(4, 6,'PERSON')]
}),
('我非常喜欢伦敦和柏林.',{
'entities': [(5, 7,'LOC'), (8, 10, 'LOC')]
})
]
其中,'entities': [(4, 6, 'PERSON')]:标记出语句中实体所在位置和实体类型,位置计数从0开始,4, 6表示第4各自开始,到第6个字之前,类型为‘PERSON’。然后运行代码:
python train_ner_cn.py -mzh_model -o zh_model
其中:-m 为语言模型名称,-o 为ner模型训练后保存的路径。
代码运行完成后输出:
Entities [('伦敦', 'LOC'), ('柏林', 'LOC')]
Tokens [('我', '', 2), ('非常', '', 2), ('喜欢', '', 2), ('伦敦', 'LOC', 3), ('和', '', 2), ('柏林', 'LOC', 3), ('.', '', 2)]
Entities [('张三', 'PERSON')]
Tokens [('到底', '', 2), ('谁', '', 2), ('是', '', 2), ('张', 'PERSON', 3), ('三', 'PERSON', 1), ('?', '', 2)]
在zh_model目录中可以看到生成了ner目录,目录结构如下:
zh_model
└──ner
├──cfg
├──lower_model
├──moves
├──tok2vec_model
└──upper_model
打开cfg文件查看,可以看到其中的labels已经有了PERSON和LOC两个实体类别。
到此,中文的ner模型就训练完成了,对于精度提升,需要准备至少几百条标注语料才能达到一定的好结果,准备好语料后重新运行训练代码即可。
添加实体分类
实体的分类可以进行自定义添加,同样可以直接使用example/training中的样例,拷贝一个train_new_entity_type.py到spaCy的根目录,然后修改代码中的训练语料,写入中文训练语料:
LABEL = 'ANIMAL'
# training data
# Note: If you're using an existing model, make sure to mix in examples of
# other entity types that spaCy correctly recognized before. Otherwise, your
# model might learn the new type, but "forget" what it previously knew.
# https://explosion.ai/blog/pseudo-rehearsal-catastrophic-forgetting
TRAIN_DATA = [
("马是又高大又善良的动物,是人类的好伙伴。", { 'entities': [(0, 1, 'ANIMAL')]}),
("它们咬人不?", {'entities': []}),
("很多人都很喜爱马。", {'entities': [(7, 8, 'ANIMAL')]}),
("人善人欺,马善人骑。", {'entities': [(5, 6, 'ANIMAL')]}),
("蒙古有一种马的品种,个子很矮。", {'entities': [(5, 6, 'ANIMAL')]}),
("马?", {'entities': [(0, 1, 'ANIMAL')]})
]
在代码的后面(115行)是一个简单的验证,需要修改text文本为中文,而且包含训练样本中指定的实体:
test_text = '您喜欢马吗?'
运行
python train_new_entity_type.py -m zh_model -nm animal -o zh_model
输出结果为:
Entities in '您喜欢马吗?'
ANIMAL 马
此时,再打开cfg文件查看,可以看到其中的labels新增了ANIMAL这个实体分类。
文中完整代码可参考 https://github.com/jeusgao/spaCy-new-language-test-Chinese