CRF 실습 진행했다 (2) CRFSUITE 설치, CRF 개체명 인식 실습(ESP)

코드는 여기 : https://github.com/dhaldhd/crf_ner

CRFSUITE 설치는 원래 할거 벌로 없는데
그곳의 보안규정때문에 여러가지로 번거로워졌드랬다

https://python-crfsuite.readthedocs.io/en/latest/

여기 들어가면 받을 수 있따
pip install python-crfsuite 인가 치면 걍 됨 칸단데슈

참고로 실습은 python 3.5 써서함.

초-칸-단 한 실습

먼저 스페인어 개체명인식 부터 할꺼임
왜 한국어 안하고 스페인어?
응 crfsuite 예시코드가 스페인어임 헤헤
이거부터하고 한국어로 바꿔서 해볼거임
그럼 성능이 또 곤두박질치는걸 볼 수 있을거임 한국어 ㅈ같아요💗


Sample code :   practice_ner_esp.py
받아서 열어라 코드 올려두겠음 커찮


Data Format

우리가 쓸 데이터는 아래와 같읍니다
열어보면 알겠지만 저 까만사진 같은 텍스트 파일임
원래 ;랑 $옆에는 형태소분석안된 원문장이 들어가는데 스페인어버젼에선 그런거 없음 걍 비워뒀다
read_file 메서드에서 텍스트파일을 읽어와서 아래 하얀 그림처럼 리스트에 착착 넣어줌

Ex) “Melbourne(Australia), 25 may (EFE).”



자질 추출


샘플코드에 #자질 추출 표시된 부분 찾아서 따라치기를 해봅시다
빨간 점선 네모쳐둔 부분이 샘플코드에선 없을 거임
한컴 타자연습하는 마음으로 따라치기를 해봅시다

뭘치고 있는건지 설명을 대충 쓰자면
웅앵웅
word2features 에서는 하나의 형태소(argument 로 들어온 sent(문장)의 i 번째 형태소)에대한 자질들의 list를 만들어서 리턴해줌 아래 사진 처럼...



  • bias 일단 하나 모든 형태소에대해 동일하게 들어가주규
  • word.lower : 알파벳들을 전부 소문자로 바꿔줌
  • word[-숫자:] : word의 뒤에서 부터 몇글자
  • word.issuper : 전부 대문자면 true
  • word.istitle : 맨 앞 알파벳이 대문자면 true
  • word.isdigit : 숫자면 true
  • postag : 응 POS 태그 아 POS 태그가 뭔지 설명해야되나 한국어면 일반명사/고유명사/조사/... 이런거 영어면 동사/명사/ 머시기 그런거 있잖오 그거 언어마다 학자마다 다르게 정의할 수 있음 보통 NNP(고유명사) NNG(일반명사) 이렇게 알파벳 대문자로 씀... 대문자들의 앞쪽 글자가 보통 더 큰 분류임 NN(명사) 그래서 postag[:2] (앞에서 부터 두글자)도 따로 한번 더 피쳐로 쓴거임

주변정보도 넣어주면 좋기 때무네
하나 앞에 있는 형태소에대한 자질, 하나 뒤에 있는 형태소에 대한 자질도 추가를 해줌
(빨간 점선 박스 2번째 거랑 3번째거)

데이터에서 자질추출

샘플코드에 #data에서추출 표시된 부분 찾아서 따라치기를 해봅시다


중간출력
샘플코드에 #중간출력 표시된 부분 찾아서 따라치기를 해봅시다
중간실행

python practice_ner_esp.py

하면 이제 밑에처럼 자질들이 나올겨

아 갑자기 현타오네
LSTM 쓰세요
포스팅을 마칩니다.

모델학습

샘플코드에 #모델학습 표시된 부분 찾아서 따라치기를 해봅시다

초 칸단 요즘은 진짜 툴들이 잘돼있어가지구 걍 불러서 돌리면됨
trainer 선언하규
문장단위로 feature들 seq랑 label seq 를 trainer에 append해줌
그다음에 hyper parameter들 정의해줌
지금 실습에서 쓰는 parameter들은 빨리 돌라고 저렇게 해둔것 특히 한국어일때는 max_iteration 훨씬 크케 해줘야 할것(한 300??? 몰라 해보세요) L1 L2 penalty도 넘 큰듯
CRF도 딥러닝이랑 비슷하게 gradient descent로 학습하기 때문에
early stopping 이니 regularization term(L1, L2) 이니 쓸수 있는거
early stopping L1 penalty L2 penalty가 궁금하면 구글신에게 물어보세요
걍 over fitting 막으려구 쓴다 정도로 생각하고 여기선 넘어감
모델을 train 하고 저어기 써진 경로에 저어런 이름으로 모델을 저장함

모델로드

응 따라쳐

tagger 불러오고 모델 불러옴

모델평가

응 따라칩니다

tagger.tag 에 한문장에 대한 피쳐들의 시퀀스 보주면 prediction 찍어줌
저어기 경로 저어기 이름으로 prediction 파일 써줌
TP는 앞전 포스팅에서 설명한 True positive이고...
pred_num은 아아아 모델이 예측한 개체명 갯수
answer_num은 실제 정답 개체명 갯수

중간실행2

여기까지 짜고 돌렸을때 이러케 나오면 잘하고 있는것

Precision, Recall, F1score

#Precision, Recall, F1score 자리에 알아서 짜쇼
앞전 포스팅에 있는 표랑 식 보고 짜보셈 쉬움

이라고 하려고 했지만 실습 시간이 부족할 것 같아서 걍 정답코드 띄웠음 이러하다

실행

스페인어 부분 끄읏

댓글

가장 많이 본 글