中文命名體識別的幾種方法介紹及比較

本文目的

最近在研究命名體識別的多種方法,主要是爲了讓一些像我這樣的人少走些彎路,直接找到最實用的方法,對下面幾種最常用的方法進行了實踐.

本項目完整源碼地址:
鏈接: 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出來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章