Giter Site home page Giter Site logo

eagle705 / pytorch-bert-crf-ner Goto Github PK

View Code? Open in Web Editor NEW
480.0 15.0 108.0 27.28 MB

KoBERT와 CRF로 만든 한국어 개체명인식기 (BERT+CRF based Named Entity Recognition model for Korean)

License: Apache License 2.0

Jupyter Notebook 91.28% Python 8.03% Shell 0.01% JavaScript 0.69% HTML 0.01%
bert kobert crf bert-crf ner named-entity-recognition pytorch pytorch-implementation korean nlp

pytorch-bert-crf-ner's Introduction

Pytorch-BERT-CRF-NER

Hits

A PyTorch implementation of Korean NER Tagger based on BERT + CRF (PyTorch v1.2 / Python 3.x)

kobert_crf_fig

Examples

ner_jupyter_notebook

Logs

문장을 입력하세요: 지난달 28일 수원에 살고 있는 윤주성 연구원은 코엑스(서울 삼성역)에서 개최되는 DEVIEW 2019 Day1에 참석했다. LaRva팀의 '엄~청 큰 언어 모델 공장 가동기!' 세션을 들으며 언어모델을 학습시킬때 multi-GPU, TPU 모두 써보고 싶다는 생각을 했다.
len: 90, input_token:['[CLS]', '▁지난달', '▁28', '일', '▁수원', '에', '▁살', '고', '▁있는', '▁윤', '주', '성', '▁연구원은', '▁코', '엑스', '(', '서울', '▁삼성', '역', ')', '에서', '▁개최', '되는', '▁D', 'E', 'V', 'I', 'E', 'W', '▁20', '19', '▁D', 'ay', '1', '에', '▁참석했다', '.', '▁L', 'a', 'R', 'v', 'a', '팀', '의', "▁'", '엄', '~', '청', '▁큰', '▁언', '어', '▁모델', '▁공장', '▁가동', '기', "!'", '▁세', '션', '을', '▁들', '으며', '▁언', '어', '모델', '을', '▁학습', '시킬', '때', '▁', 'm', 'ul', 't', 'i', '-', 'G', 'P', 'U', ',', '▁T', 'P', 'U', '▁모두', '▁써', '보고', '▁싶다', '는', '▁생각을', '▁했다', '.', '[SEP]']
len: 90, pred_ner_tag:['[CLS]', 'O', 'B-DAT', 'I-DAT', 'B-LOC', 'O', 'O', 'O', 'O', 'B-PER', 'I-PER', 'I-PER', 'O', 'B-LOC', 'I-LOC', 'O', 'B-LOC', 'B-LOC', 'I-LOC', 'O', 'O', 'O', 'O', 'B-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'O', 'O', 'O', 'B-ORG', 'I-ORG', 'I-ORG', 'I-ORG', 'I-ORG', 'I-ORG', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', '[SEP]']
decoding_ner_sentence: [CLS] 지난달 <28일:DAT> <수원:LOC>에 살고 있는 <윤주성:PER> 연구원은 <코엑스:LOC>(<서울:LOC> <삼성역:LOC>)에서 개최되는 <DEVIEW 2019 Day1:POH>에 참석했다. <LaRva팀:ORG>의 '엄~청 큰 언어 모델 공장 가동기!' 세션을 들으며 언어모델을 학습시킬때 multi-GPU, TPU 모두 써보고 싶다는 생각을 했다.[SEP]
   
문장을 입력하세요: 문재인 대통령은 28일 서울 코엑스에서 열린 ‘데뷰 (Deview) 2019’ 행사에 참석해 젊은 개발자들을 격려하면서 우리 정부의 인공지능 기본구상을 내놓았다.  출처 : 미디어오늘 (http://www.mediatoday.co.kr)
len: 66, input_token:['[CLS]', '▁문재인', '▁대통령은', '▁28', '일', '▁서울', '▁코', '엑스', '에서', '▁열린', '▁‘', '데', '뷰', '▁(', 'D', 'e', 'v', 'i', 'e', 'w', ')', '▁20', '19', '’', '▁행사에', '▁참석해', '▁젊은', '▁개발', '자들', '을', '▁격려', '하면서', '▁우리', '▁정부의', '▁인', '공', '지', '능', '▁기본', '구', '상을', '▁내놓', '았다', '.', '▁출처', '▁:', '▁미디어', '오늘', '▁(', 'http', '://', 'www', '.', 'm', 'ed', 'i', 'at', 'o', 'd', 'ay', '.', 'co', '.', 'kr', ')', '[SEP]']
len: 66, pred_ner_tag:['[CLS]', 'B-PER', 'O', 'B-DAT', 'I-DAT', 'B-LOC', 'I-LOC', 'I-LOC', 'O', 'O', 'O', 'B-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'B-POH', 'I-POH', 'O', 'B-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'O', '[SEP]']
decoding_ner_sentence: [CLS] <문재인:PER> 대통령은 <28일:DAT> <서울 코엑스:LOC>에서 열린 ‘<데뷰 (Deview) 2019:POH>’ 행사에 참석해 젊은 개발자들을 격려하면서 우리 정부의 인공지능 기본구상을 내놓았다. 출처 : <미디어오늘:POH> (<http://www.mediatoday.co.kr:POH>)[SEP]
   
문장을 입력하세요: SKTBrain에서 KoBERT 모델을 공개해준 덕분에 BERT-CRF 기반 개체명인식기를 쉽게 개발할 수 있었다.
len: 39, input_token:['[CLS]', '▁SK', 'T', 'B', 'ra', 'in', '에서', '▁K', 'o', 'B', 'ER', 'T', '▁모델', '을', '▁공개', '해', '준', '▁덕분에', '▁B', 'ER', 'T', '-', 'C', 'R', 'F', '▁기반', '▁개', '체', '명', '인', '식', '기를', '▁쉽게', '▁개발', '할', '▁수', '▁있었다', '.', '[SEP]']
len: 39, pred_ner_tag:['[CLS]', 'B-ORG', 'I-ORG', 'I-ORG', 'I-ORG', 'I-ORG', 'O', 'B-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'O', 'O', 'O', 'O', 'O', 'O', 'B-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', '[SEP]']
decoding_ner_sentence: [CLS] <SKTBrain:ORG>에서 <KoBERT:POH> 모델을 공개해준 덕분에 <BERT-CRF:POH> 기반 개체명인식기를 쉽게 개발할 수 있었다.[SEP]
   
문장을 입력하세요: 터미네이터: 다크 페이트 (Terminator: Dark Fate)는 2019년 개봉한 미국의 SF, 액션영화이다. 1991년 영화 터미네이터 2: 심판의 날 이후 28년 만에 제임스 카메론이 제작자로서 시리즈에 복귀한 작품이다. 린다 해밀턴이 사라 코너 역으로 돌아오면서 아널드 슈워제네거와 함께 주연을 맡았다.
len: 102, input_token:['[CLS]', '▁터', '미', '네', '이', '터', ':', '▁다', '크', '▁페', '이', '트', '▁(', 'T', 'er', 'm', 'in', 'at', 'or', ':', '▁D', 'ar', 'k', '▁F', 'at', 'e', ')', '는', '▁20', '19', '년', '▁개봉', '한', '▁미국의', '▁S', 'F', ',', '▁액션', '영화', '이다', '.', '▁19', '91', '년', '▁영화', '▁터', '미', '네', '이', '터', '▁2', ':', '▁심판', '의', '▁날', '▁이후', '▁28', '년', '▁만에', '▁제임스', '▁카', '메', '론', '이', '▁제작', '자', '로서', '▁시리즈', '에', '▁복귀', '한', '▁작품', '이다', '.', '▁', '린다', '▁해', '밀', '턴', '이', '▁사', '라', '▁코너', '▁역', '으로', '▁돌아오', '면서', '▁아', '널', '드', '▁슈', '워', '제', '네', '거', '와', '▁함께', '▁주연', '을', '▁맡았다', '.', '[SEP]']
len: 102, pred_ner_tag:['[CLS]', 'B-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'B-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'O', 'B-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'O', 'O', 'B-DAT', 'I-DAT', 'I-DAT', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'B-DAT', 'I-DAT', 'I-DAT', 'O', 'B-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'O', 'B-NOH', 'I-DUR', 'O', 'B-PER', 'I-PER', 'I-PER', 'I-PER', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'B-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'O', 'B-PER', 'I-PER', 'I-PER', 'O', 'O', 'O', 'O', 'B-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'O', 'O', 'O', 'O', 'O', 'O', '[SEP]']
decoding_ner_sentence: [CLS] <터미네이터::POH> <다크 페이트:POH> (<Terminator: Dark Fate:POH>)는 <2019년:DAT> 개봉한 미국의 SF, 액션영화이다. <1991년:DAT> 영화 <터미네이터 2: 심판의 날:POH> 이후 <28년:NOH> 만에 <제임스 카메론:PER>이 제작자로서 시리즈에 복귀한 작품이다. <린다 해밀턴:PER>이 <사라 코너:PER> 역으로 돌아오면서 <아널드 슈워제네거:PER>와 함께 주연을 맡았다.[SEP]
   
문장을 입력하세요: 전 세계 최고의 기대작 <어벤져스> 시리즈의 압도적 대미를 장식할 <어벤져스: 엔드게임>이 지난 4월 14일(일)과 15일(월) 양일간 진행된 대한민국 내한 행사를 성공적으로 마무리 지었다. <어벤져스: 엔드게임>의 주역 로버트 다우니 주니어, 제레미 레너, 브리 라슨, 안소니 루소&조 루소 감독, 트린 트랜 프로듀서, 케빈 파이기 마블 스튜디오 대표까지 방문하여 특별한 대한민국 사랑을 뽐냈다.
len: 134, input_token:['[CLS]', '▁전', '▁세계', '▁최고의', '▁기대', '작', '▁<', '어', '벤', '져', '스', '>', '▁시리즈', '의', '▁압도적', '▁대', '미', '를', '▁장', '식', '할', '▁<', '어', '벤', '져', '스', ':', '▁엔', '드', '게임', '>', '이', '▁지난', '▁4', '월', '▁14', '일', '(', '일', ')', '과', '▁15', '일', '(', '월', ')', '▁양', '일간', '▁진행된', '▁대한민국', '▁내', '한', '▁행사를', '▁성공', '적으로', '▁마무리', '▁지', '었다', '.', '▁<', '어', '벤', '져', '스', ':', '▁엔', '드', '게임', '>', '의', '▁주', '역', '▁', '로', '버', '트', '▁다', '우', '니', '▁주', '니', '어', ',', '▁제', '레', '미', '▁레', '너', ',', '▁', '브리', '▁라', '슨', ',', '▁안', '소', '니', '▁루', '소', '&', '조', '▁루', '소', '▁감독', ',', '▁트', '린', '▁트', '랜', '▁프로', '듀', '서', ',', '▁케', '빈', '▁파', '이', '기', '▁마', '블', '▁스', '튜', '디', '오', '▁대표', '까지', '▁방문', '하여', '▁특별한', '▁대한민국', '▁사랑을', '▁뽐냈다', '.', '[SEP]']
len: 134, pred_ner_tag:['[CLS]', 'O', 'O', 'O', 'O', 'O', 'O', 'B-POH', 'I-POH', 'I-POH', 'I-POH', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'B-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'O', 'O', 'O', 'B-DAT', 'I-DAT', 'I-DAT', 'I-DAT', 'O', 'B-DAT', 'O', 'O', 'B-DAT', 'I-DAT', 'O', 'B-DAT', 'O', 'B-NOH', 'I-NOH', 'O', 'B-LOC', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'B-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'I-POH', 'O', 'O', 'O', 'O', 'B-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'O', 'B-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'O', 'B-PER', 'I-PER', 'I-PER', 'I-PER', 'O', 'B-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'O', 'B-PER', 'I-PER', 'I-PER', 'O', 'O', 'B-PER', 'I-PER', 'I-PER', 'I-PER', 'O', 'O', 'O', 'O', 'B-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'B-ORG', 'I-ORG', 'I-ORG', 'I-ORG', 'I-ORG', 'I-ORG', 'O', 'O', 'O', '[SEP]', 'O', 'B-ORG', 'O', 'O', 'O', '[SEP]']
decoding_ner_sentence: [CLS] 전 세계 최고의 기대작 <<어벤져스:POH>> 시리즈의 압도적 대미를 장식할 <<어벤져스: 엔드게임:POH>>이 지난 <4월 14일:DAT>(<일:DAT>)과 <15일:DAT>(<월:DAT>) <양일간:NOH> 진행된 <대한민국:LOC> 내한 행사를 성공적으로 마무리 지었다. <<어벤져스: 엔드게임:POH>>의 주역 <로버트 다우니 주니어:PER>, <제레미 레너:PER>, <브리 라슨:PER>, <안소니 루소:PER>&<조 루소:PER> 감독, <트린 트랜:PER> 프로듀서, <케빈 파이기:PER> <마블 스튜디오:ORG> 대표까지 방문하여 특별한 <대한민국:ORG> 사랑을 뽐냈다.[SEP]
   
문장을 입력하세요: ‘모든 단점은 장점이 될수 있다'  (Lionel Andres Messi)
len: 29, input_token:['[CLS]', '▁‘', '모', '든', '▁단', '점', '은', '▁장점', '이', '▁될', '수', '▁있다', "'", '▁(', 'L', 'i', 'on', 'el', '▁A', 'n', 'd', 're', 's', '▁M', 'es', 's', 'i', ')', '[SEP]']
len: 29, pred_ner_tag:['[CLS]', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'B-POH', 'I-POH', 'I-PER', 'I-POH', 'I-POH', 'I-POH', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'I-PER', 'O', '[SEP]']
decoding_ner_sentence: [CLS] ‘모든 단점은 장점이 될수 있다' (<Lionel Andres Messi:POH>)[SEP]

Note

  • 엔티티를 토큰화할때 토큰의 길이가 엔티티 자체보다 길어지는 경우, 정확한 엔티티 추출이 안될 수 있음 (토크나이저의 한계)
    • 이러한 경우에 대해서는 제외하고 학습할 수도 있지만, 더 넓은 범위를 커버하기 위해 포함하는 것으로 결정
    • e.g.) 첫 회를 시작으로 <13일:DAT>까지 -> ('▁13', 'B-DAT') ('일까지', 'I-DAT') (조사등이 같이 추출됨)
  • 반대로 토큰화한 길이가 엔티티 자체보다 작은 경우 'I-tag' 토큰으로 해결가능
  • pretrained sentencepiece를 사용하기 때문에 사전 변경은 안됨 (이것과 별개로 sp 사전을 변경 하는 방법은 따로 찾아봐야함)
  • pytorch-crf 라이브러리가 multi-gpu에서 안됨
    • 추후 변경
  • BERT가 LM기반이라 그런지 오타에도 어느정도 강건한 편인듯함
  • 문장 길이에 따라 NER 결과가 달라짐
  • 영어 데이터에 대해서는 학습이 안되서 잘 안됨
  • 사전에 나오는 '▁' 토큰과 우리가 흔히 사용하는 underscore '_'는 다르므로 주의할 것
  • B 태그의 NER과 I 태그의 NER이 다를 경우를 방지하기 위해 BERT+Bi(LSTM or GRU)+CRF 구조로도 테스트 해봄
    • 장점
      • 엔티티 토큰의 길이가 긴 경우는 잘 잡아냄
      • B 태그의 NER과 I 태그의 NER이 다른 경우가 확실히 줄어듬
    • 단점
      • 모델 사이즈가 커진다는 것
      • B 태그의 위치를 잘 못잡는 경우가 발생함 <12일:DAT>로 잡아야되는걸 앞문장의 구두점을 포함해서 <. 12일:DAT>로 잡거나, <1.83%:PNT>으로 잡아야 되는걸 1.8<3%:PNT> 잡기도함
    • 느낀점
      • B 태그 위치를 잘못잡는것 때문에 쓰기가 약간 애매하다는 생각이 듬 (보완이 필요함)
      • 학습은 GRU가 LSTM 보다 1 epoch정도 더 빠르게 성능이 올라감
  • If you want to apply it to other languages, you don't have to change the model architecture. Instead, you just change vocab, pretrained BERT(from huggingface), and training dataset.

Dataset

NER tagset

  • 총 8개의 태그가 있음
    • PER: 사람이름
    • LOC: 지명
    • ORG: 기관명
    • POH: 기타
    • DAT: 날짜
    • TIM: 시간
    • DUR: 기간
    • MNY: 통화
    • PNT: 비율
    • NOH: 기타 수량표현
  • 개체의 범주
    • 개체이름: 사람이름(PER), 지명(LOC), 기관명(ORG), 기타(POH)
    • 시간표현: 날짜(DAT), 시간(TIM), 기간 (DUR)
    • 수량표현: 통화(MNY), 비율(PNT), 기타 수량표현(NOH)

Results

  • Epoch: 12 (without early stopping)

  • num of train: 23032, num of val: 931

  • Training set: 00002_NER.txt, ..., EXOBRAIN_NE_CORPUS_007.txt (1,425 files)

  • Validation set: EXOBRAIN_NE_CORPUS_009.txt, EXOBRAIN_NE_CORPUS_010.txt (2 files)

  • Classification Report

    • 대체적으로 DAT, PER, NOH, ORG, PNT 순으로 높음
    • POH, LOC등은 좀 낮은 편
    • validation set 기준, macro avg F1: 87.56

  • Confusion Matrix
    • POH를 ORG로 예측하는 경우가 있음 (기타를 기관으로 분류하는 거니 어느정도 그럴 수 있다고 생각)
    • ORG를 PER로 예측하는 경우도 좀 있음 (수정해야되는 케이스)

  • Training & Evaluation Accurcay & Loss Graph

  • Benchmark (Devset F1 scroe )
Model MacroAvg F1 score Epoch Date
KoBERT 0.8554 12 191129
KoBERT+CRF 0.8756 12 191129
KoBERT+BiLSTM+CRF 0.8659 12 191129

Requirements

pip install -r requirements.txt

Model File Link

train

python train_bert_crf.py 

inference

python inference.py 

Visualization

BERT_NER_viz

Future work

  • Validation pipeline
  • NER tag probability
  • RestfulAPI
  • Knowledge Distillation
  • Apex fp16 half-precision
  • Refactoring, Refactoring, Refactoring

Reference Repo

pytorch-bert-crf-ner's People

Contributors

cpprhtn avatar dependabot[bot] avatar eagle705 avatar seongjunkang avatar someonewho avatar tucan9389 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pytorch-bert-crf-ner's Issues

data_utils/ner_dataset.py 파일과 관련 질문드립니다 (solution for ERROR: No module named 'data_utils' / 'KoBERT' when running 'ner_dataset.py)

Thanks for your code.

When I tried 'ner_dataset.py' in 'data_utils' directory of this repository in colab(Runtime: GPU), I realized
ERROR: No module named 'data_utils' / 'KoBERT'
is keep happening.

So I like to know whether I should install KoBERT first, and then install this project in that file.
And I also like to know how to solve ERROR I mentioned. I've searched for the similar error in Google many times. But I couldn't find the proper solution for those ERROR.

Anyone who know how to solve that ERROR? Thanks for your answer.

BERT CRF model file with validation 모델을 로드할 때 생기는 오류 및 대처법

오류 1. RuntimeError: Error(s) in loading state_dict for KobertCRF: Missing key(s) in state_dict: "bert.embeddings.position_ids".

  • 원인 : model/net.py 에서 사용하는 bert version 이 transformers 버전이나, 훈련 시 pytorch_pretrained_bert 버전으로 훈련한 것으로 보임

  • 해결책 : model/net.py 에서 BertModel 버전 수정

#from transformers import BertModel, BertConfig
from pytorch_pretrained_bert import BertModel, BertConfig

오류 2. TypeError: dropout(): argument 'input' (position 1) must be Tensor, not list

  • 원인 : 예전 버전의 bert와 현재 버전의 bert의 출력 형식의 차이에서 오는 오류
  • 해결책 : model/net.py에서 KobertCRF class의 bert 출력 수정
outputs = self.bert(input_ids=input_ids,
		token_type_ids=token_type_ids,
		attention_mask=attention_mask,
		output_all_encoded_layers=False)

최종 시퀀스 스코어

안녕하세요

Inference 단계에서 self.crf.decode( )를 통해서 나오는 tag_seq 에 대한 확률값/vieterbi_score 를 얻을 수는 없나요 ?

감사합니다

모델의 환경설정 및 README의 'Requirements'항목에 나온 라이브러리 다운로드와 관련하여 질문드립니다. (related to Requirements in README)

(KOR)
안녕하세요.
최근에 제작하신 모델을 실행시켜 보기 위해서 다운로드 및 환경설정을 진행하다가 몇 가지 궁금한 점이 생겨 질문드리게 되었습니다.

  1. GPU가 2개인 PC에서 Mxnet 및 Gluonnlp 설치를 진행하다가 'Note' 부분에서 Multi GPU에 대해 PyTorch-CRF 라이브러리가 안된다고 적혀있는 것을 확인하였는데, 2021년 1월 현재도 같은 상황인지 알고 싶습니다.

  2. 현재 Requirements에 있는 Mxnet과 Gluonnlp 라이브러리를 Windows10의 Conda 환경에서 다운로드 받을 수 없는 상황인데, 혹시 모델을 실행시킬 수 있거나 두 라이브러리들을 다운로드 받을 수 있는 정확한 OS나 환경이 무엇인지 알고 싶습니다.

(ENG)
Hi! I'm deeply interested in your code and confirmed your model. Thanks.
But I have some questions from settings for your model(code).

  1. The PC has two GPUs. I tried to download 'MxNet 'and 'GluonNlp' in 'Requirements' in README, but there were big problems to find proper settings (e.x proper version of NVIDIA driver, CUDA, CUDNN etc.). My PC's environment is WIndows 10 + Conda. So can I seek for advice for the proper OS and environments that this project's model can run?

  2. I've confirmed 'In Multi-GPU, PyTorch-CRF library doesn't works.' on your 'Note' in README. As I wrote in Q1, my PC has two GPUs. So I would like to know is it same in January 2021.

Thank you.

mxnet library import 에러

requirements.txt에 명시된
mxnet ==1.8.0.post0 버전을 pip 에서 찾을 수 없다고 합니다
mxnet 1.7.0post1 등의 하위버전을 설치하면 의존성이 꼬여 해결할 수 없는 지점까지 갑니다(상호 충돌하여 어느 하나의 라이브러리를 삭제 해야 함 )
python 버전은 3.8.3입니다

interactive_shell_NER.ipynb 실행시 model load 부분 문제

main() 실행 시 RuntimeError: Input, output and indices must be on the current device라고 뜨면서 NER수행이 안되는데 혹시 수정할 부분 있을까요 의존성은 requirements.txt대로 깔았습니다 ㅠ
전체 에러문입니다.
`RuntimeError Traceback (most recent call last)
Input In [5], in <cell line: 1>()
----> 1 main()

Input In [3], in main()
45 list_of_input_ids = tokenizer.list_of_string_to_list_of_cls_sep_token_ids([input_text])
46 x_input = torch.tensor(list_of_input_ids).long()
---> 47 list_of_pred_ids = model(x_input)
49 list_of_ner_word, decoding_ner_sentence = decoder_from_res(list_of_input_ids=list_of_input_ids, list_of_pred_ids=list_of_pred_ids)
50 print("output>", decoding_ner_sentence)

File /electra/ner_tagging/.venv/lib/python3.8/site-packages/torch/nn/modules/module.py:889, in Module._call_impl(self, *input, **kwargs)
887 result = self._slow_forward(*input, **kwargs)
888 else:
--> 889 result = self.forward(*input, **kwargs)
890 for hook in itertools.chain(
891 _global_forward_hooks.values(),
892 self._forward_hooks.values()):
893 hook_result = hook(self, input, result)

File /electra/ner_tagging/pytorch-bert-crf-ner/model/net.py:41, in KobertCRF.forward(self, input_ids, token_type_ids, tags)
38 attention_mask = input_ids.ne(self.vocab.token_to_idx[self.vocab.padding_token]).float()
40 # outputs: (last_encoder_layer, pooled_output, attention_weight)
---> 41 outputs = self.bert(input_ids=input_ids,
42 token_type_ids=token_type_ids,
43 attention_mask=attention_mask)
44 last_encoder_layer = outputs[0]
45 last_encoder_layer = self.dropout(last_encoder_layer)

File /electra/ner_tagging/.venv/lib/python3.8/site-packages/torch/nn/modules/module.py:889, in Module._call_impl(self, *input, **kwargs)
887 result = self._slow_forward(*input, **kwargs)
888 else:
--> 889 result = self.forward(*input, **kwargs)
890 for hook in itertools.chain(
891 _global_forward_hooks.values(),
892 self._forward_hooks.values()):
893 hook_result = hook(self, input, result)

File /electra/ner_tagging/.venv/lib/python3.8/site-packages/pytorch_pretrained_bert/modeling.py:730, in BertModel.forward(self, input_ids, token_type_ids, attention_mask, output_all_encoded_layers)
727 extended_attention_mask = extended_attention_mask.to(dtype=next(self.parameters()).dtype) # fp16 compatibility
728 extended_attention_mask = (1.0 - extended_attention_mask) * -10000.0
--> 730 embedding_output = self.embeddings(input_ids, token_type_ids)
731 encoded_layers = self.encoder(embedding_output,
732 extended_attention_mask,
733 output_all_encoded_layers=output_all_encoded_layers)
734 sequence_output = encoded_layers[-1]

File /electra/ner_tagging/.venv/lib/python3.8/site-packages/torch/nn/modules/module.py:889, in Module._call_impl(self, *input, **kwargs)
887 result = self._slow_forward(*input, **kwargs)
888 else:
--> 889 result = self.forward(*input, **kwargs)
890 for hook in itertools.chain(
891 _global_forward_hooks.values(),
892 self._forward_hooks.values()):
893 hook_result = hook(self, input, result)

File /electra/ner_tagging/.venv/lib/python3.8/site-packages/pytorch_pretrained_bert/modeling.py:267, in BertEmbeddings.forward(self, input_ids, token_type_ids)
264 if token_type_ids is None:
265 token_type_ids = torch.zeros_like(input_ids)
--> 267 words_embeddings = self.word_embeddings(input_ids)
268 position_embeddings = self.position_embeddings(position_ids)
269 token_type_embeddings = self.token_type_embeddings(token_type_ids)

File /electra/ner_tagging/.venv/lib/python3.8/site-packages/torch/nn/modules/module.py:889, in Module._call_impl(self, *input, **kwargs)
887 result = self._slow_forward(*input, **kwargs)
888 else:
--> 889 result = self.forward(*input, **kwargs)
890 for hook in itertools.chain(
891 _global_forward_hooks.values(),
892 self._forward_hooks.values()):
893 hook_result = hook(self, input, result)

File /electra/ner_tagging/.venv/lib/python3.8/site-packages/torch/nn/modules/sparse.py:156, in Embedding.forward(self, input)
155 def forward(self, input: Tensor) -> Tensor:
--> 156 return F.embedding(
157 input, self.weight, self.padding_idx, self.max_norm,
158 self.norm_type, self.scale_grad_by_freq, self.sparse)

File /electra/ner_tagging/.venv/lib/python3.8/site-packages/torch/nn/functional.py:1916, in embedding(input, weight, padding_idx, max_norm, norm_type, scale_grad_by_freq, sparse)
1910 # Note [embedding_renorm set_grad_enabled]
1911 # XXX: equivalent to
1912 # with torch.no_grad():
1913 # torch.embedding_renorm_
1914 # remove once script supports set_grad_enabled
1915 no_grad_embedding_renorm(weight, input, max_norm, norm_type)
-> 1916 return torch.embedding(weight, input, padding_idx, scale_grad_by_freq, sparse)

RuntimeError: Input, output and indices must be on the current device`

가중치 다운로드 서버 문제

현재 코드를 돌려보면 kobert와 vocab 가중치를 받아오는 서버에 문제가 있는 것으로 확인 됩니다.

SKT-AI/KoBART#17

해당 이슈는 다음 파일에서 일어납니다

.../pytorch-bert-crf-ner/kobert/pytorch_kobert.py

에러 메세지 입니다.

File ".../miniconda3/envs/ner_test/lib/python3.8/site-packages/urllib3/connection.py", line 181, in _new_conn
raise NewConnectionError(
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPSConnection object at 0x7f02c9fe2c70>: Failed to establish
a new connection: [Errno -2] Name or service not known

수정이 필요한지 검토 부탁드립니다.
감사합니다.

Interactive_shell_NER.ipynb에서 list_of_ner_word 오류

DecoderFromNamedEntitySequence class에서 list_of_ner_word list를 append하기 위한 아래 조건문이 문제가 있는 것 같습니다.

if prev_entity_tag != entity_tag and prev_entity_tag != "":

prev_entity_tag != entity_tag 조건으로 연속되는 같은 개체명에서 앞의 개체명을 인식하지 못하는데
예) B-LOC, B-LOC
예) B-NOH, I-NOH, B-NOH

해당 조건을 넣으신 이유가 있을까요?

학습 모델 로드시 질문

안녕하세요

좋은 자료 공유해주셔서 감사의 말씀을 우선 정합니다.

Inference.py 에서

    convert_keys = {}
    for k, v in checkpoint['model_state_dict'].items():
        new_key_name = k.replace("module.", '')
        if new_key_name not in model_dict:
            print("{} is not int model_dict".format(new_key_name))
            continue
        convert_keys[new_key_name] = v

다음과 같이 convert_keys 를 정의하고 model.load_state_dict(convert_keys)를 하셨는데,
왜 바로 model.load_state_dict(checkpoint['model_state_dict']) 하시지 않았는지 아니면 하면 안되는지 궁금하여 질문을 드립니다

감사합니다

pip install -r requirements.txt 실행 시 에러

다음과 같이 에러가 납니다.

ERROR: Cannot install -r requirements.txt (line 64) and tensorflow-estimator==2.4.0 because these package versions have conflicting dependencies.

The conflict is caused by:
The user requested tensorflow-estimator==2.4.0
tensorflow 2.5.0 depends on tensorflow-estimator<2.6.0 and >=2.5.0rc0

레거시, 디펜던시 제거 및 Huggingface 코드 기반으로 리팩토링

🚀 Feature

  • 기존의 mxnet등의 레거시를 제거합니다
  • HF BERT로 기존의 모델을 교체합니다
  • 기존에 학습한 ckpt를 새로운 모델 name에 맞게 convert합니다

Motivation

  • Repo를 공개한 이후 HF가 표준으로 자리잡음에 따라 레거시코드를 개선할 필요가 생겼음
  • 이슈대응 필요

Pitch

  • 새로운 feat branch에서 작업 진행

Additional context

  • 2023년 안에 진행 예정

Dataset maxlen 문의

안녕하세요. 코드 리뷰중 질문이 있어서 문의드립니다.

Dataset만들때 maxlen이 30으로 설정되어 있던데 train dataset은 대부분 길이가 30이 넘는것 같습니다.

특별한 이유가 있을까요?

같은 문장을 추론하는데도 다른 결과가 나오는 경우가 간혹 생깁니다

학습 데이터를 변경해서 다른 태그로 개체명 인식 테스트를 하고 있습니다.

모델 구조나 vocab, tokenizer 같은건 그대로 사용하고 있는 상태고 태그만 다른 것으로 변경하여 학습 후 추론을 하는데 같은 문장을 넣었는데도 불구하고 결과가 다르게 나오는 경우가 생깁니다.

예시로 "북한산전망대" 같은 경우 원래 단어를 그대로 개체로 잘 태깅하기도 하지만 "북", "한산정망대" 이런 식으로 2개로 분리되어 태깅하는 경우도 간혹 발생합니다.

해당 모델이 결과가 이렇게 약간의 무작위성이 있게 추론이 되는게 맞는 모델인지 알고 싶습니다. CRF 레이어가 이런 역할을 하려나요??

Add new entity does not work

Hi there,

I am interested in your code and I tried to added new entity into training dataset. After that, I change few things to ensure that the code can be run on the new list of entities. Nevertheless, it does not work. After 18 epoch, the trained model can not recognize the new entity. My entity is EMAIL, PHONE_NUMBER.

So, is there any special thing that I should change before train the model with the new list of entities?

model state_dict key missing 문제

구글 드라이브에 있는
./experiments/base_model_with_crf/best-epoch-16-step-1500-acc-0.993.bin
./experiments/base_model_with_crf_val/best-epoch-12-step-1000-acc-0.960.bin
파일을 가지고 model load 하여 python inference.py를 실행하였을때

둘다 아래 에러가 발생합니다.
해결방법이 어떻게 될까요??

image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.