- gajanlee
- 代碼已開源github
- 如有幫助,歡迎star
- 如有問題,歡迎Issue
BERT實體識別
- 實體識別是一個序列輸出模型,所以與分類模型略有不同
- 實體標籤有順序關係,加入CRF層準確率會提升
- 最小文件run_ner.py
- 對配置文件進行抽取,減少命令行的參數量
Usage
- 把run_ner.py放在bert目錄下
- 使用predictor讀取配置文件,並進行訓練、預測
- 測試命令【service模式輸出】:
python predictor.py
2020-05-29 17:45:00,886 - ./output/ner.log - INFO -
吳奇隆很帥啊
[(0, 3, ['吳', '奇', '隆'], 'PER')]
2020-05-29 17:45:00,886 - ./output/ner.log - INFO -
你認識周潤發嗎?
[(3, 6, ['周', '潤', '發'], 'PER')]
2020-05-29 17:45:00,886 - ./output/ner.log - INFO -
東風風神AX7大戰啓辰T90
[]
2020-05-29 17:45:00,886 - ./output/ner.log - INFO -
2018年美國中期選舉,你認爲特朗普會下臺嗎?
[(12, 15, ['特', '朗', '普'], 'PER')]
2020-05-29 17:45:00,886 - ./output/ner.log - INFO -
【海泰發展連續三日漲停提示風險:公司沒有與創投相關的收入來源】連續三日漲停的海泰發展11月12日晚間披露風險提示公告,經公司自查,誰不想做吳彥祖?公司目前生產經營活動正常。目前,公司主營業務收入和利潤來源爲貿易和房產租售,沒有與創投相關的收入來源,也沒有科技產業投資項目。公司對應2017年每股收益的市盈率爲271.95倍,截至11月12日,公司動態市盈率爲2442.10倍,請投資者注意投資風險。另外,誰帥過吳彥祖?
[(5, 8, ['吳', '彥', '祖'], 'PER'), (6, 9, ['吳', '彥', '祖'], 'PER')]
- 運行環境
- tensorflow[-gpu] == 1.12.0
數據
- run.sh中提供三個數據的下載鏈接
- config.json包括各個模式的設置及相應的batch_size
思路
bert-ner主要依賴BERT對輸入的句子進行encode,然後經過CRF層對輸出標籤的順序進行限制,對每個token預測一個分類標籤,“B-PER”、“I-PER”、"O"等。
相比run_classifier.py的修改
- Features中的label_ids變爲多個標籤,即長度爲N的文本,對應(N+2)個label([CLS], [SEP]).
- create_model變爲get_sequence_output, 接入CRF模型
- 生成label_ids時的補充策略:定義
_X
標籤作爲一個特殊label,即不參與實體識別。通常應用在word piece和[CLS]、[SEP].
其他事項
- estimator.predict()返回max_seq_length個lable_id
- NERFastPredictor,免去每次預測重新加載模型
- 在預測出來結果後,text中每個詞與predict_id一一對應,略過
_X
標籤即可 - 標籤以
B-
,I-
,[E-
]爲標準 - nvidia-docker
Docker-Nvidia
- docker18.03以下使用docker-nvidia1.0,以上使用docker-nvidia2
17.12.1-ce正常運行
- 安裝nvidia-docker1.0
yum install -y nvidia-docker
-
列出所有nvidia-docker volume
- 應該有一個
nvidia-docker volume ls
- 如果沒有的話
docker volume create --driver=nvidia-docker --name=nvidia_driver_$(modinfo -F version nvidia) nvidia-docker volume ls
-
查看顯卡和docker是否正常
- 直接輸出信息
nvidia-docker run --rm nvidia/cuda nvidia-smi
- 進入鏡像查看
# 直接查看失敗的話進入鏡像運行 nvidia-docker run -it -p 8888:8888 --name ten tensorflow/tensorflow:0.11.0rc0-gpu /bin/sh nvidia-smi python >>> import tensorflow as tf >>> tf.test.is_gpu_available()
-
構建容器
nvidia-docker build --network host -t service:bert .
- 運行容器
nvidia-docker run --network host -it --rm -p 1234:1234 -v data:data service:bert /bin/bash