注
- 模型:出于对所用数据的考虑,本实体关系提取实验未使用联合抽取模型,而是分别开展实体提取与关系提取部分。实体提取部分,使用Albert+
BiLSTM+CRF模型。 - 数据:信息丰富的多源文本数据(主要为亚洲象监测员发布的朋友圈 + 少量新闻/微博数据)
数据准备
数据标注
- 抽取数据以标注:在WPS-Excel中,每隔3行抽取一条数据,用于标注,使用以下语句实现:
=IF(MOD(ROW()-2,3)=0,A3,"")
![](https://img-blog.csdnimg.cn/20210401090205848.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1lXUF8yMDE2,size_16,color_FFFFFF,t_70)
- “BIO”数据标注:将数据化为每字一行(Excel而非WPS:两端对齐,填充),手动标注。注意单字后的标点符号,可以使用“分列”功能快速删除。
训练/测试/验证标注数据划分
- 按照6:2:2比例,将标注数据划分为训练集、测试集与验证集。
训练/测试/验证标注数据放至相应文件
- 即训练数据放入.train,测试数据放入.test,验证数据放入.dev
- 注意:① 各条数据之间需一个换行符,对应下下述代码:
for c in l.split('\n'):
- ②数据最后应有两个换行符,对应下述代码:
for l in f.split('\n\n'):
![](https://img-blog.csdnimg.cn/20210531144519239.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1lXUF8yMDE2,size_16,color_FFFFFF,t_70)
模型构建、训练与评估
- 详见本博客相关博文及GitHub(https://github.com/YWP-2019/ALBERT-CRF-for-name-quantity-and-geographic-entity-extraction)
模型应用
- 关键代码如下:
model.load_weights('…….weights')
#NER = NamedEntityRecognizer(trans=K.eval(CRF.trans), starts=[0], ends=[0])
r = open("……result.txt", 'w')
with open("……all data.txt", 'r', encoding='utf-8') as tt:
content = tt.readlines()
for line in content:
ner = NER.recognize(line)
print(ner, file=r)
程序报错及解决
编码问题:'gbk' codec can't encode character '\u3cd5' in position 34: illegal multibyte sequence
###模型应用时,调用以下程序:
model.load_weights('D:\Asian elephant\毕业\地理位置提取\代码\gao A_geography_NER\A_geography_NER\\last_model.weights')
r = open("…….txt", 'w',encoding='utf-8')
with open("…….txt", 'r') as tt: ###症结所在
content = tt.readlines()
for line in content:
ner = NER.recognize(line)
print(ner, file=r)
- 解决:打开文件的同时,设置编码方式: encoding='utf-8'
- 参考:https://www.jb51.net/article/64816.htm
值错误:ValueError: not enough values to unpack (expected 2, got 1)
char, this_flag = c.split(' ') #以空格分隔,char为前面汉字,this_flag为后面标注字母
- 可能的原因:各条数据之间应为一个换行符,但误写为一个空格。