本文目的
最近在研究命名體識別的多種方法,主要是爲了讓一些像我這樣的人少走些彎路,直接找到最實用的方法,對下面幾種最常用的方法進行了實踐.
本項目完整源碼地址:
鏈接: 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出來。