本文目的
最近在研究命名体识别的多种方法,主要是为了让一些像我这样的人少走些弯路,直接找到最实用的方法,对下面几种最常用的方法进行了实践.
本项目完整源码地址:
链接: https://pan.baidu.com/s/1UO9SSKON9rQm97eNv-l9pg 提取码: djvv
项目博客地址:
https://blog.csdn.net/qq_29153321/article/details/104016881
一、斯坦福命名体识别
官方文档
https://nlp.stanford.edu/software/CRF-NER.shtml#Extensions
https://github.com/Lynten/stanford-corenlp
使用
stanford-corenlp-full目录
ner_predict.py
from stanfordcorenlp import StanfordCoreNLP
with StanfordCoreNLP(r'stanford-corenlp-full-2018-02-27',lang='zh') as nlp:
import csv
import time
birth_data = []
path = '../content_t.csv'
csv_reader = csv.reader(open(path, "r", encoding="utf-8"))
birth_header = next(csv_reader) # 读取第一行每一列的标题
for row in csv_reader: # 将csv 文件中的数据保存到birth_data中
a=time.time()
# birth_data.append(row)
print(row[0])
sentence = row[1]
print(sentence)
# print(nlp.word_tokenize(sentence))
# print(nlp.pos_tag(sentence))
print(nlp.ner(sentence))
# print(nlp.parse(sentence))
# print(nlp.dependency_parse(sentence))
print(time.time()-a)
print()
部分结果示例如下:
8748098
大连万达2022年到期的美元债跌幅创纪录
[('大连', 'CITY'), ('万', 'NUMBER'), ('达', 'O'), ('2022年', 'DATE'), ('到期', 'O'), ('的', 'O'), ('美元', 'O'), ('债', 'O'), ('跌幅', 'O'), ('创', 'O'), ('纪录', 'O')]
0.07579708099365234
8748097
恒指大跌2.62%失守二万七关口 蓝筹股普跌
[('恒指', 'O'), ('大跌', 'O'), ('2.62%', 'PERCENT'), ('失守', 'O'), ('二万七', 'NUMBER'), ('关口', 'O'), ('蓝筹股', 'O'), ('普跌', 'O')]
0.03789854049682617
8748096
送水节期间金边空气质量优良为主
[('送水节', 'O'), ('期间', 'O'), ('金边', 'GPE'), ('空气', 'O'), ('质量', 'O'), ('优良', 'O'), ('为主', 'O')]
0.014959573745727539
8748095
今晚阿里大厦灯火通明通宵达旦!这是马云退休后的第一个双十一,又刷新了很多记录,你贡献了多少呢#双十一 #深圳
[('今晚', 'DATE'), ('阿里', 'O'), ('大厦', 'O'), ('灯火通明', 'O'), ('通宵', 'O'), ('达旦', 'O'), ('!', 'O'), ('这', 'O'), ('是', 'O'), ('马云', 'PERSON'), ('退休', 'O'), ('后', 'O'), ('的', 'O'), ('第一', 'ORDINAL'), ('个', 'O'), ('双', 'O'), ('十一', 'NUMBER'), (',', 'O'), ('又', 'O'), ('刷新', 'O'), ('了', 'O'), ('很多', 'NUMBER'), ('记录', 'O'), (',', 'O'), ('你', 'O'), ('贡献', 'O'), ('了', 'O'), ('多少', 'NUMBER'), ('呢', 'O'), ('#', 'O'), ('双十一', 'NUMBER'), ('#深圳', 'O')]
0.024933576583862305
二、BiLSTM-CRF模型
https://github.com/Determined22/zh-NER-TF
第一层是查找层,旨在将每个字符表示从一个热向量转换为字符嵌入。
第二层BiLSTM层可以有效地使用过去和将来的输入信息,并自动提取特征。
第三层,CRF层,在一个句子中标记每个字符的标签。如果我们使用Softmax层进行标记,由于Softmax层分别标记每个位置,我们可能会得到不合语法的标签序列。我们知道“ I-LOC”不能跟随“ B-PER”,但是Softmax不知道。与Softmax相比,CRF层可以使用句子级标签信息并对每个两个不同标签的过渡行为进行建模。
部分结果示例如下:
8748100
白色客车司机神预判,救了一车人性命!为这样的司机点赞! #交通安全 #客车 #赞 @
['白色客车司']
8748099
最近流行的双拉链马丁靴,果断入手啦喜欢 老板还送了一双袜子?#1111好物发现节 #热门
['马丁靴']
8748098
大连万达2022年到期的美元债跌幅创纪录
['大连万达']
8748097
恒指大跌2.62%失守二万七关口 蓝筹股普跌
['恒指']
8748096
送水节期间金边空气质量优良为主
[]
8748095
今晚阿里大厦灯火通明通宵达旦!这是马云退休后的第一个双十一,又刷新了很多记录,你贡献了多少呢#双十一 #深圳
['阿里大厦', '深圳', '马云']
8748094
小姐姐是被拖着走的?#玻璃桥
[]
三、BERT-BiLSTM-CRF-NER
https://github.com/macanv/BERT-BiLSTM-CRF-NER
对该代码进行了整合,分为调用服务和不调用服务两个方法都能实现NER:
BERT-BiLSTM-CRF-NER目录
方法1:调用服务
BERT_use_service目录
1.自己训练模型train:
bert-base-ner-train \
-data_dir NERdata \
-output_dir BERT_no_service/output \
-init_checkpoint BERT_use_service/chinese_L-12_H-768_A-12/bert_model.ckpt \
-bert_config_file BERT_use_service/chinese_L-12_H-768_A-12/bert_config.json \
-vocab_file BERT_use_service/chinese_L-12_H-768_A-12/vocab.txt \
-batch_size 16
2.启动服务:
bert-base-serving-start \
-model_dir BERT_no_service/output \
-bert_model_dir BERT_use_service/chinese_L-12_H-768_A-12
-mode NER
3.进行预测:
python3 BERT_use_service/bert_predict_server.py
如果是使用作者训练好的模型,则使用下命令代替1.-2.步
bert-base-serving-start -model_dir BERT_use_service/BERT_NER -bert_model_dir BERT_use_service/chinese_L-12_H-768_A-12 -model_pb_dir BERT_use_service/BERT_PD -mode NER
方法2:不调用服务
BERT_no_service目录
python3 bert_base/runs/__init__.py \
-do_train=True \
-do_eval=True \
-do_predict=True \
-data_dir=NERdata \
-vocab_file=BERT_use_service/chinese_L-12_H-768_A-12/vocab.txt \
-bert_config_file=BERT_use_service/chinese_L-12_H-768_A-12/bert_config.json \
-init_checkpoint=BERT_use_service/chinese_L-12_H-768_A-12/bert_model.ckpt \
-max_seq_length=128 \
-batch_size=32 \
-learning_rate=2e-5 \
-num_train_epochs=3.0 \
-output_dir=./output/
在线预测:
python3 BERT_no_service/terminal_predict.py
部分结果示例如下:
8748100
白色客车司机神预判,救了一车人性命!为这样的司机点赞! #交通安全 #客车 #赞 @
LOC
PER
ORG
0.04587602615356445
8748099
最近流行的双拉链马丁靴,果断入手啦喜欢 老板还送了一双袜子?#1111好物发现节 #热门
LOC
PER
ORG
0.053827762603759766
8748098
大连万达2022年到期的美元债跌幅创纪录
LOC
PER
ORG, 大连万达
0.027925491333007812
8748097
恒指大跌2.62%失守二万七关口 蓝筹股普跌
LOC
PER
ORG, 恒
0.03191423416137695
8748096
送水节期间金边空气质量优良为主
LOC, 金边
PER
ORG
0.025930404663085938
8748095
今晚阿里大厦灯火通明通宵达旦!这是马云退休后的第一个双十一,又刷新了很多记录,你贡献了多少呢#双十一 #深圳
LOC, 阿里大厦, 深圳
PER, 马云
ORG
0.2524852752685547
总结
其中当然是BERT-BiLSTM-CRF-NER方法最优,斯坦福NER最差,BiLSTM-CRF模型一般,容易预测出很多错的NER出来。