개체명 인식이란?
- 이름을 가진 개체를 인식하는 것을 뜻하며 어떤 이름을 의미하는 단어를 보고 그 단어가 어떤 유형인지를 인식하는 것을 뜻함
- 즉, 개체명 인식을 사용하면 코퍼스로부터 어떤 단어가 사람, 장소, 조직 등을 의미하는 단어인지 찾을 수 있음
- 개체명 인식은 챗봇 등에서 필요한 주요 전처리 작업
- 예) '유정이는 2018년에 골드만삭스에 입사했다.'
유정 : 사람, 2018 : 시간, 골드만삭스 : 조직
NLTK를 이용한 개체명 인식
- NLTK에서는 개체명 인식기인 NER chunker를 지원하고 있으므로
별도 개체명 인식기를 구현할 필요없이 NLTK를 사용해서 개체명 인식을 수행할 수 있음 - 개체명 인식기를 통해 개체명을 태깅하기 위해서는 품사 태깅이 수행되어야 함
BIO 표현
- 개체명 인식에서 코퍼스로부터 개체명을 인식하기 위한 방법 중 하나
- BIO의 B는 Begin으로 개체명이 시작되는 부분, I는 Inside로 개체명의 내부 부분, O는 Outside로 개체명이 아닌 부분을 의미함
- 예) 영화에 대한 코퍼스 중에서 영화 제목에 대한 개체명을 뽑아내고 싶을 경우
해 | B | 영화 제목이 시작되는 글자 |
리 | I | 영화 제목이 끝나는 순간까지 |
포 | I | 영화 제목이 끝나는 순간까지 |
터 | I | 영화 제목이 끝나는 순간까지 |
보 | O | 영화 제목이 아니므로 개체명이 아님 |
러 | O | 영화 제목이 아니므로 개체명이 아님 |
가 | O | 영화 제목이 아니므로 개체명이 아님 |
자 | O | 영화 제목이 아니므로 개체명이 아님 |
- 개체명 인식이라는 것은 보통 한 종류의 개체에 대해서만 언급하는 것이 아니라 여러 종류의 개체가 있을 수 있음
- 예) 영화에 대한 코퍼스 중에서 영화 제목에 대한 개체명과 극장에 대한 개체명
각 개체가 어떤 종류인지도 함께 태깅되게 됨
해 | B-movie |
리 | I-movie |
포 | I-movie |
터 | I-movie |
보 | O |
러 | O |
메 | B-theater |
가 | I-theater |
박 | I-theater |
스 | I-theater |
가 | O |
자 | O |
개체명 인식 데이터 이해하기
- CONLL2003은 개체명 인식을 위한 전통적인 영어 데이터셋
- 데이터의 형식은 [단어] [품사 태깅] [청크 태깅] [개체명 태깅]의 형식으로 되어있음
- 품사 태깅에서 NNP는 고유 명사 단수형을 의미하며, VBZ는 3인칭 단수 동사 현재형을 의미함
- 개체명 태깅의 경우 LOC는 location, ORG는 organization, PER은 person, MISC는 miscellaneous를 의미함
- 개체명의 시작 부분이면서 Organization을 의미하는 EU에는 B-ORG가 붙게 됨
- 예) EU NNP B-NP B-ORG
- 개체명이 하나의 단어가 끝나지 않고 다음 단어로 개체명 인식이 이어질 경우에는 I 태깅이 붙게 됨
- 예) Perter NNP B-NP B-PER
Blackburn NNP I-NP I-PER
데이터 전처리하기
- 1) 개체명 인식 데이터를 읽어 전처리를 수행
2) 전체 샘플 개수를 확인
3) 첫 번째 샘플만 출력
4) zip() 함수를 이용해서 단어 부분과 개체명 태깅 정보 부분을 분리시켜 sentences와 ner_tags에 저장
5) 첫 번째 샘플(0번 인덱스)과 12번 인덱스 샘플을 출력
6) 전체 데이터의 길이 분포 확인
7) 케라스 토크나이저를 통해 문장 데이터와 레이블에 해당되는 개체명 태깅 정보에 대해 정수 인코딩 진행
문장 데이터에 있는 모든 단어를 사용하지 않고 높은 빈도수를 가진 상위 약 4000개의 단어만을 사용
8) 단어 집합과 개체명 태깅 정보 집합의 크기 확인
9) 정수 인코딩을 수행하여 문장 데이터는 X_train에, 개체명 태깅 데이터는 y_train에 저장
10) 첫 번째 샘플을 출력하면 문장 데이터에 대해서 일부 단어가 'OOV'로 대체된 상황임을 알 수 있고
이를 확인하기 위해 정수로부터 단어를 변환하는 index_to_word를 만들어 디코딩하도록 함
11) 정수 인코딩 된 첫 번째 문장을 다시 디코딩하면 일부 단어가 'OOV'로 대체된 것을 볼 수 있음
12) 대부분의 샘플은 길이가 70 이내이므로 X_train과 y_train의 모든 길이를 임의로 70으로 맞추기
13) 훈련 데이터와 테스트 데이터를 8:2 비율로 분리
14) 레이블에 해당하는 태깅 정보에 대해서 원-핫 인코딩을 수행
양방향 LSTM으로 개체명 인식기 만들기
- 1) 임베딩 벡터의 차원과 LSTM의 은닉 상태의 차원을 128로 지정
2) 다 대 다 문제이므로 LSTM의 return_squences의 값은 True로 지정하고 양방향 사용을 위해 Bidirectional() 사용
3) 각 데이터의 길이가 달라 패딩을 하느라 숫자 0이 많아질 경우 숫자 0은 연산에서 제외시키도록 mask_zero=True 설정
4) LSTM을 다 대 다 구조로 사용하여 LSTM의 모든 시점에 대해서 출력층을 사용해야 하므로 출력층에 TimeDistributed() 사용
5) 모든 시점에 대해서 개체명 레이블의 개수만큼의 선택지 중 하나를 예측하는 다중 클래스 분류 문제를 수행하는 모델이므로
출력층에 소프트맥스 회귀, 활성화 함수로 소프트맥스 함수, 손실 함수로 크로스 엔트로피 함수를 사용
6) 배치 크기는 128로 하여 8번의 에포크를 수행
7) validation_data로 테스트 데이터를 기재하여 학습 중간에 테스트 데이터의 정확도를 확인
8) 테스트 데이터에 대한 정확도를 측정
9) 정수로부터 단어와 개체명 태깅 정보를 리턴하는 index_to_word와 index_to_ner 생성
10) 10번 인덱스 테스트 샘플로부터 실제값과 예측값을 출력 - 대부분의 단어가 개체명이 아니라는 'O'가 태깅된 상황에서 정확도가 수많은 'O'로 인해 결정되고 있기 때문에
위의 정확도 측정 방법은 적절하지 않으므로 F1-score를 도입하여 정확도를 측정해야 함
양방향 LSTM을 이용한 개체명 인식
- 또다른 개체명 인식 데이터에 대한 이해와 전처리
1) Annotated Corpus 데이터 다운로드
2) 샘플 5개 출력
t번째 문장을 단어 토큰화 후 각 행으로 나눠놓은 데이터이기 때문에
Sentence: t부터 Null 값이 나오다가 Sentence: t+1이 나오기 전까지의 모든 행은 기존에 하나의 문장임
3) 데이터의 행의 개수를 확인
이는 문장 1개를 다수의 행들로 나누어 놓은 것이므로 다시 1개의 행으로 병합하는 작업을 하면 최종 샘플의 수는 이보다 적음
4) 결측값 유무 출력
5) 전체 데이터에서 중복을 허용하지 않고 유일한 값의 개수를 확인
6) 17개의 개체명 태깅이 전체 데이터에서 몇 개가 있는지, 개체명 태깅 개수의 분포를 확인
아무런 태깅도 의미하지 않는 O가 가장 많은 개수를 차지함
7) Null을 제거하도록 함
t번째 문장에 속하면서 Null 값을 가진 샘플들은 전부 첫 번째 열에 Sentence: t의 값이 들어가게 됨
8) 모든 단어를 소문자화하여 단어의 개수를 줄이기
9) 하나의 문장에 등장한 단어와 개체명 태깅 정보끼리 쌍으로 묶기
10) zip() 함수를 이용해서 단어 부분과 개체명 태깅 정보 부분을 분리시켜 sentences와 ner_tags에 저장
11) 전체 데이터의 길이 분포 확인
12) 케라스 토크나이저를 통해 문장 데이터와 레이블에 해당되는 개체명 태깅 정보에 대해 정수 인코딩 진행
src_tokenizer를 만들 때 인자로 oov_token='OOV'를 선택했으므로 인덱스1에 단어 'OOV'가 할당됨
13) 정수 인코딩을 수행하여 문장 데이터는 X_data에, 개체명 태깅 데이터는 y_data에 저장
14) 인덱스로부터 단어를 리턴하는 index_to_word와 인덱스로부터 개체명 태깅 정보를 리턴하는 index_to_ner을 생성
15) index_to_word를 통해 정수 인코딩 된 첫 번째 샘플을 다시 디코딩하여 변환해보기
16) 대부분의 샘플은 길이가 40~60에 분포하므로 X_train과 y_train의 모든 길이를 임의로 70으로 맞추기
17) 훈련 데이터와 테스트 데이터를 8:2 비율로 분리
18) 레이블에 해당하는 태깅 정보에 대해서 원-핫 인코딩을 수행 - 양방향 LSTM을 이용한 개체명 인식기 만들기
1) 임베딩 벡터의 차원은 128, LSTM의 은닉 상태의 크기는 256으로 지정
2) 다 대 다 문제이므로 LSTM의 return_squences의 값은 True로 지정하고 양방향 사용을 위해 Bidirectional() 사용
3) 각 데이터의 길이가 달라 패딩을 하느라 숫자 0이 많아질 경우 숫자 0은 연산에서 제외시키도록 mask_zero=True 설정
4) LSTM을 다 대 다 구조로 사용하여 LSTM의 모든 시점에 대해서 출력층을 사용해야 하므로 출력층에 TimeDistributed() 사용
5) 모든 시점에 대해서 개체명 레이블의 개수만큼의 선택지 중 하나를 예측하는 다중 클래스 분류 문제를 수행하는 모델이므로
출력층에 소프트맥스 회귀, 활성화 함수로 소프트맥스 함수, 손실 함수로 크로스 엔트로피 함수를 사용
6) validation_split=0.1을 사용하여 훈련 데이터의 10%를 검증 데이터로 분리하여 사용해 훈련이 적절히 되고 있는지 확인
7) 배치 크기는 128로 하여 6번의 에포크를 수행
8) 검증 데이터에 대한 정확도를 확인
9) 테스트 데이터의 임의의 인덱스 13번 샘플에 대해서 실제값과 예측값을 비교 - F1-score
개체명 인식에서는 어떤 개체도 아니라는 의미의 'O'라는 태깅이 존재하고 보통 대다수의 레이블을 차지하기 때문에
기존에 사용했던 정확도를 평가하는 방법으로 사용하는 것이 적절하지 않을 수 있음
예) 5개의 개체가 존재함에도 불구하고 나머지가 전부 'O'로만 채워져 있을 경우
그 어떤 개체를 찾지 못하더라고 정확도가 뻥튀기 되어 74%의 정확도를 얻게 되므로 모델의 성능을 오해할 수 있음
이를 위해 파이썬 패키지 seqeval의 f1-score를 이용하며, f1-score는 정밀도와 재현률로부터 조화 평균을 구한 것을 뜻하므로
예) MISC는 4개, PER는 3개이고 나머지는 전부 'O'로만 채워져있을 경우
특정 개체로 예측한 경우에 대해서는 모두 제대로 예측을 하였으므로 정밀도는 1이 나오지만
재현률에서 MISC는 2개만 맞추었으므로 0.5, PER도 2개만 맞추었으므로 0.67이 나오게 되어 정확도가 낮아지게 됨
- F1-score로 성능 측정하기
1) F1-score를 계산하기 위해서 개체명 태깅의 확률 벡터 또는 원-핫 벡터로부터 태깅 정보 시퀀스를 변환하는 함수 생성
해당 함수를 통해 모델의 예측값인 y_predicted와 실제값에 해당하는 y_test를 태깅 정보 시퀀스로 변환하게 됨
2) y_predicted와 y_text를 비교하여 f1-score를 계산
양방향 LSTM과 CRF를 이용한 개체명 인식
- CRF(Conditional Random Field)
양방향 LSTM 모델 위에 하나의 층을 추가하여 양방향 LSTM + CRF 모델이 생성됨
태깅을 수행하는 기존의 양방향 LSTM 개체명 인식 모델의 경우 각 단어를 벡터로 입력받고,
모델의 출력층에서 활성화 함수를 통해 개체명을 인식하게 되므로
입력 단어들과 실제 개체명이 무엇인지 모르는 상황이기 때문에 모델이 정확하게 개체명을 예측했는지 알 수 없음
또한 I는 B 뒤에만 등장할 수 있는데 첫 번째 단어의 레이블에서 I가 등장하므로 BIO 표현 방법의 제약사항이 모두 위반될 수 있음
이를 위하여 양방향 LSTM 위에 CRF층을 추가하면 모델은 예측 개체명(레이블 사이의 의존성)을 고려할 수 있음
기존에 CRF 층이 존재하지 않았던 양방향 LSTM 모델은 활성화 함수를 지난 시점에서 개체명을 결정했지만,
CRF층을 추가한 모델에서는 활성화 함수의 결과들이 CRF층의 입력으로 전달되고
CRF층은 전달받은 레이블 시퀀스에 대해서 가장 높은 점수를 가지는 시퀀스를 예측하게 됨
이러한 구조에서 CRF층은 점차적으로 훈련 데이터로부터 BIO 표현 방법의 제약사항을 학습하게 되므로
양방향 LSTM은 입력 단어에 대한 양방향 문맥을 반영하고, CRF는 출력 레이블에 대한 양방향 문맥을 반영할 수 있게 됨
- CRF 층 설치하기
1) CRF 층을 손쉽게 사용하기 위한 keras-crf를 설치 - 또다른 개체명 인식 데이터에 대한 이해와 전처리
1) 위와 동일 - BiLSTM-CRF를 이용한 개체명 인식
1) 마지막 층에 CRF층을 추가하기 위하여 함수형 API를 사용
2) 임베딩 벡터의 차원은 128, LSTM의 은닉 상태의 크기는 64로 지정
3) 다 대 다 문제이므로 LSTM의 return_squences의 값은 True로 지정하고 양방향 사용을 위해 Bidirectional() 사용
4) LSTM을 다 대 다 구조로 사용하여 LSTM의 모든 시점에 대해서 출력층을 사용해야 하므로 출력층에 TimeDistributed() 사용
5) 모든 시점에 대해서 개체명 레이블의 개수만큼의 선택지 중 하나를 예측하는 다중 클래스 분류 문제를 수행하는 모델이므로
최종 출력층을 CRF층으로 하여 CRF층에 분류해야 하는 선택지 개수를 의미하는 tag_size를 전달
6) EarlyStopping을 사용해 검증 데이터 손실이 증가하면 과적합 징후이므로 4회 증가하면 학습을 조기 종료하도록 함
7) ModelCheckpoint를 사용해 검증 데이터의 정확도가 이전보다 좋아질 경우에만 모델을 저장함
8) validation_split=0.1을 사용하여 훈련 데이터의 10%를 검증 데이터로 분리하여 사용해 훈련이 적절히 되고 있는지 확인
9) 배치 크기는 128로 하여 15번의 에포크를 수행
10) 검증 데이터에 대해서 정확도가 가장 높았을 당시를 저장해둔 가중치를 불러오기
11) 테스트 데이터의 임의의 인덱스 13번 샘플에 대해서 실제값과 예측값을 비교
12) 테스트 데이터에 대해서 성능을 측정하기 위해 테스트 데이터에 대한 예측 시퀀스인 y_predicted를 얻기
13) 확률 벡터가 아닌 정수 시퀀스를 입력으로 받아서 태깅 정보 시퀀스를 리턴하는 sequences_to_tag_for_crf 함수 생성
14) sequences_to_tag_for_crf를 사용해 예측값과 레이블에 해당하는 y_test를 태깅 정보 시퀀스로 변환하여 f1-score 계산
개체명 인식기 성능을 위한 문자 임베딩 활용
- CRF 층 설치하기
1) CRF 층을 손쉽게 사용하기 위한 keras-crf를 설치 - 또다른 개체명 인식 데이터에 대한 이해와 전처리
1) 위와 동일 - 문자 임베딩을 위한 전처리
개체명 인식기의 성능을 올리기 위해 문자 임베딩을 워드 임베딩에 연결하여 함께 입력으로 사용하는 방법이 존재
1) 전체 데이터의 모든 단어들을 문자 레벨로 분해하여 문자 집합 생성
2) 문자 집합으로부터 문자를 정수로 변환할 수 있는 char_to_index와 반대로 정수로부터 문자를 얻는 index_to_char 생성
3) 단어를 표현하는 문자 시퀀스의 최대 길이를 15로 제한 후 패딩
4) 동일한 문장에 대해서 단어 단위 정수 인코딩과 문자 단위 정수 인코딩의 차이를 확인
5) X_data는 뒤에 0으로 패딩되어 길이가 70인 것에 비해 X_char_data는 현재 0번 단어는 무시되어 길이가 70이 아니므로
길이 70으로 맞춰주기 위해서 문장 길이 방향으로도 패딩을 해줌
6) 단어 단위 정수 인코딩 결과는 X_train, y_train, X_text, y_text로 훈련 데이터와 테스트 데이터가 분리된 상태이므로
문자 단위 정수 인코딩 결과에 대해서도 X_char_train, X_char_test로 분리해줌
7) 첫 번째 훈련 샘플의 첫 번째 단어인 150번이 어떤 단어였는지 확인하고
첫 번째 훈련 샘플의 첫 번째 단어의 문자 정수 인코딩 결과로부터 같은 단어로 일치하는지 확인 - BiLSTM-CNN을 이용한 개체명 인식
(단어 벡터를 얻기 위한 1D 합성곱 층 + 개체명 인식기를 위한 양방향 LSTM)
1) 하나의 단어는 문자 단위로 토큰화되었고, 토큰화된 각 문자는 전처리를 통해 정수로 맵핑된 상태이므로
정수로 맵핑된 각 문자는 임베딩 층을 통과하면 64차원의 벡터가 되게 됨
2) 이후 커널의 크기가 3이고 해당 커널은 총 30개 사용하는 1D 합성곱 층의 입력으로 사용되어
하나의 단어에 대한 단어 벡터를 결과로 얻게 됨
3) 해당 단어 벡터는 워드 임베딩 과정을 통해 얻은 단어의 임베딩 벡터와 연결되게 되어 양방향 LSTM의 입력으로 사용됨
4) 임베딩 벡터의 차원은 128, LSTM의 은닉 상태의 크기는 64로 지정
5) 다 대 다 문제이므로 LSTM의 return_squences의 값은 True로 지정하고 양방향 사용을 위해 Bidirectional() 사용
6) LSTM을 다 대 다 구조로 사용하여 LSTM의 모든 시점에 대해서 출력층을 사용해야 하므로 출력층에 TimeDistributed() 사용
7) 모든 시점에 대해서 개체명 레이블의 개수만큼의 선택지 중 하나를 예측하는 다중 클래스 분류 문제를 수행하는 모델이므로
출력층에 소프트맥스 회귀, 활성화 함수로 소프트맥스 함수, 손실 함수로 크로스 엔트로피 함수를 사용
8) EarlyStopping을 사용해 검증 데이터 손실이 증가하면 과적합 징후이므로 4회 증가하면 학습을 조기 종료하도록 함
9) ModelCheckpoint를 사용해 검증 데이터의 정확도가 이전보다 좋아질 경우에만 모델을 저장함
10) validation_split=0.1을 사용하여 훈련 데이터의 10%를 검증 데이터로 분리하여 사용해 훈련이 적절히 되고 있는지 확인
11) 배치 크기는 128로 하여 15번의 에포크를 수행
12) 검증 데이터에 대해서 정확도가 가장 높았을 당시를 저장해둔 가중치를 불러오기
13) 테스트 데이터의 임의의 인덱스 13번 샘플에 대해서 실제값과 예측값을 비교
14) 테스트 데이터에 대해서 성능을 측정하기 위해 테스트 데이터에 대한 예측 시퀀스인 y_predicted를 얻기
15) 예측값과 실제값에 대한 태깅 정보 시퀀스를 얻은 후 f1-score를 계산 - BiLSTM-CNN-CRF를 이용한 개체명 인식
(단어 벡터를 얻기 위한 1D 합성곱 층 + 개체명 인식기를 위한 양방향 LSTM + CRF층)
'양방향 LSTM에 CRF층을 추가적으로 사용한 모델'과 '양방향 LSTM에 문자 임베딩을 사용한 모델'이
'양방향 LSTM만을 사용한 모델'보다 성능이 좋으므로 두 가지 모두를 활용하기 위해 문자 임베딩을 사용한 모델에 CRF층 추가
1) 하나의 단어는 문자 단위로 토큰화되었고, 토큰화된 각 문자는 전처리를 통해 정수로 맵핑된 상태이므로
정수로 맵핑된 각 문자는 임베딩 층을 통과하면 64차원의 벡터가 되게 됨
2) 이후 커널의 크기가 3이고 해당 커널은 총 30개 사용하는 1D 합성곱 층의 입력으로 사용되어
하나의 단어에 대한 단어 벡터를 결과로 얻게 됨
3) 해당 단어 벡터는 워드 임베딩 과정을 통해 얻은 단어의 임베딩 벡터와 연결되게 되어 양방향 LSTM의 입력으로 사용됨
4) 임베딩 벡터의 차원은 128, LSTM의 은닉 상태의 크기는 64로 지정
5) 다 대 다 문제이므로 LSTM의 return_squences의 값은 True로 지정하고 양방향 사용을 위해 Bidirectional() 사용
6) LSTM을 다 대 다 구조로 사용하여 LSTM의 모든 시점에 대해서 출력층을 사용해야 하므로 출력층에 TimeDistributed() 사용
7) 모든 시점에 대해서 개체명 레이블의 개수만큼의 선택지 중 하나를 예측하는 다중 클래스 분류 문제를 수행하는 모델이므로
최종 출력층을 CRF층으로 하여 CRF층에 분류해야 하는 선택지 개수를 의미하는 tag_size를 전달
8) EarlyStopping을 사용해 검증 데이터 손실이 증가하면 과적합 징후이므로 4회 증가하면 학습을 조기 종료하도록 함
9) ModelCheckpoint를 사용해 검증 데이터의 정확도가 이전보다 좋아질 경우에만 모델을 저장함
10) validation_split=0.1을 사용하여 훈련 데이터의 10%를 검증 데이터로 분리하여 사용해 훈련이 적절히 되고 있는지 확인
11) 배치 크기는 128로 하여 15번의 에포크를 수행
이때 CRF층은 원-핫 인코딩된 레이블을 지원하지 않으므로 y_train이 아니라 y_train_int를 사용
12) 검증 데이터에 대해서 정확도가 가장 높았을 당시를 저장해둔 가중치를 불러오기
13) 테스트 데이터의 임의의 인덱스 13번 샘플에 대해서 실제값과 예측값을 비교
14) 테스트 데이터에 대해서 성능을 측정하기 위해 테스트 데이터에 대한 예측 시퀀스인 y_predicted를 얻기
15) 예측값과 실제값에 대한 태깅 정보 시퀀스를 얻은 후 f1-score를 계산 - BiLSTM-BiLSTM-CRF를 이용한 개체명 인식
(단어 벡터를 얻기 위한 양방향 LSTM + 개체명 인식기를 위한 양방향 LSTM + CRF)
1) 하나의 단어는 문자 단위로 토큰화되었고, 토큰화된 각 문자는 전처리를 통해 정수로 맵핑된 상태이므로
정수로 맵핑된 각 문자는 임베딩 층을 통과하면 64차원의 벡터가 되게 됨
2) 이후 양방향 LSTM의 입력으로 사용되고 이때 임베딩 벡터의 차원은 128, LSTM의 은닉 상태의 크기는 64로 지정
3) 해당 LSTM은 다 대 일 구조로 순방향 LSTM의 은닉 상태와 역방향 LSTM의 은닉 상태가 연결된 값이
양방향 LSTM의 출력이 되고 해당 출력을 하나의 단어에 대한 단어 벡터로 간주되게 됨
4) 해당 단어 벡터는 워드 임베딩 과정을 통해 얻은 단어의 임베딩 벡터와 연결되게 되어
개체명 인식을 위한 양방향 LSTM의 입력으로 사용
5) 다 대 다 문제이므로 LSTM의 return_squences의 값은 True로 지정하고 양방향 사용을 위해 Bidirectional() 사용
6) LSTM을 다 대 다 구조로 사용하여 LSTM의 모든 시점에 대해서 출력층을 사용해야 하므로 출력층에 TimeDistributed() 사용
7) 모든 시점에 대해서 개체명 레이블의 개수만큼의 선택지 중 하나를 예측하는 다중 클래스 분류 문제를 수행하는 모델이므로
최종 출력층을 CRF층으로 하여 CRF층에 분류해야 하는 선택지 개수를 의미하는 tag_size를 전달
8) EarlyStopping을 사용해 검증 데이터 손실이 증가하면 과적합 징후이므로 4회 증가하면 학습을 조기 종료하도록 함
9) ModelCheckpoint를 사용해 검증 데이터의 정확도가 이전보다 좋아질 경우에만 모델을 저장함
10) validation_split=0.1을 사용하여 훈련 데이터의 10%를 검증 데이터로 분리하여 사용해 훈련이 적절히 되고 있는지 확인
11) 배치 크기는 128로 하여 15번의 에포크를 수행
이때 CRF층은 원-핫 인코딩된 레이블을 지원하지 않으므로 y_train이 아니라 y_train_int를 사용
12) 검증 데이터에 대해서 정확도가 가장 높았을 당시를 저장해둔 가중치를 불러오기
13) 테스트 데이터의 임의의 인덱스 13번 샘플에 대해서 실제값과 예측값을 비교
14) 테스트 데이터에 대해서 성능을 측정하기 위해 테스트 데이터에 대한 예측 시퀀스인 y_predicted를 얻기
15) 예측값과 실제값에 대한 태깅 정보 시퀀스를 얻은 후 f1-score를 계산
코드
'ML > 딥 러닝을 이용한 자연어 처리' 카테고리의 다른 글
[딥 러닝을 이용한 자연어 처리 입문] 12. 태깅 작업 - 케라스를 이용한 태깅 작업 (0) | 2022.12.30 |
---|---|
[딥 러닝을 이용한 자연어 처리 입문] 11. NLP를 위한 합성곱 신경망 - 문자 임베딩 (0) | 2022.12.29 |
[딥 러닝을 이용한 자연어 처리 입문] 11. NLP를 위한 합성곱 신경망 - 사전 훈련된 워드 임베딩을 이용한 의도 분류 (0) | 2022.12.29 |
[딥 러닝을 이용한 자연어 처리 입문] 11. NLP를 위한 합성곱 신경망 - 자연어 처리를 위한 1D CNN (0) | 2022.12.29 |
[딥 러닝을 이용한 자연어 처리 입문] 11. NLP를 위한 합성곱 신경망 - 합성곱 신경망 (0) | 2022.12.28 |