【極簡】基於BERT的實體識別,並在舊版docker上部署

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