[NLP] 텍스트 전처리 - (10) 한국어 전처리 패키지 (Text Processing Tools for Korean Text)

김규리·2022년 6월 22일
0

NLP

목록 보기
10/33
post-thumbnail

1. PyKoSpacing

: 띄어쓰기가 되어있지 않은 문장을 띄어쓰기를 한 문장으로 변환해주는 패키지
: 대용량 코퍼스를 학습하여 만들어진 띄어쓰기 딥 러닝 모델

from pykospacing import Spacing
spacing = Spacing()
kospacing_sent = spacing(new_sent) 

2. Py-Hanspell

: 네이버 한글 맞춤법 검사기를 바탕으로 만들어진 패키지

from hanspell import spell_checker

sent = "맞춤법 틀리면 외 않되? 쓰고싶은대로쓰면돼지 "
spelled_sent = spell_checker.check(sent)

hanspell_sent = spelled_sent.checked
print(hanspell_sent)
맞춤법 틀리면 왜 안돼? 쓰고 싶은 대로 쓰면 되지

3. SOYNLP를 이용한 단어 토큰화

  • SOYNLP: 품사 태깅, 단어 토큰화 등을 지원하는 단어 토크나이저
    비지도 학습으로 단어 토큰화
    데이터에 자주 등장하는 단어들을 단어로 분석
  • SOYNLP 단어 토크나이저: 내부적으로 단어 점수 표로 동작
    응집 확률(cohesion probability)과 브랜칭 엔트로피(branching entropy) 활용

1) 신조어 문제

  • 기존 형태소 분석기: 신조어나 형태소 분석기에 등록되지 않은 단어는 제대로 구분 X
  • SOYNLP: 특정 문자 시퀀스가 함께 자주 등장하는 빈도가 높고, 앞 뒤로 조사 또는 완전히 다른 단어가 등장하는 것을 고려해서 해당 문자 시퀀스를 형태소라고 판단

2) 학습하기

전체 코퍼스로부터 응집 확률과 브랜칭 엔트로피 단어 점수표를 만드는 과정

  • WordExtractor.extract(): 전체 코퍼스에 대해 단어 점수표 계산
word_extractor = WordExtractor()
word_extractor.train(corpus)
word_score_table = word_extractor.extract()

3) SOYNLP의 응집 확률

  • 응집 확률: 내부 문자열이 얼마나 응집하여 자주 등장하는지를 판단하는 척도
    문자열을 문자 단위로 분리하여 내부 문자열을 만드는 과정에서 왼쪽부터 순서대로 문자를 추가하면서 각 문자열이 주어졌을 때 그 다음 문자가 나올 확률을 계산하여 누적곱을 한 값
word_score_table["반포한"].cohesion_forward
0.08838002913645132

word_score_table["반포한강공원"].cohesion_forward
0.37891487632839754

4) SOYNLP의 브랜칭 엔트로피

  • 브랜칭 엔트로피: 확률 분포의 엔트로피값, 주어진 문자열에서 얼마나 다음 문자가 등장할 수 있는지를 판단하는 척도
    하나의 완성된 단어에 가까워질수록 문맥으로 인해 점점 정확히 예측할 수 있게 되면서 점점 줄어듦
word_score_table["디스"].right_branching_entropy
1.6371694761537934

word_score_table["디스플레"].right_branching_entropy
-0.0

# 하나의 단어가 끝나면 그 경계 부분부터 다시 브랜칭 엔트로피 값이 증가 -> 단어 판단
word_score_table["디스플레이"].right_branching_entropy
3.1400392861792916

5) SOYNLP의 L tokenizer

  • 한국어: 띄어쓰기 단위로 나눈 어절 토큰은 주로 L토큰 + R토큰 형식이 많음
  • L토크나이저: L토큰 + R토큰으로 나누되, 분리 기준을 점수가 가장 높은 L토큰을 찾아내는 원리
from soynlp.tokenizer import LTokenizer

scores = {word:score.cohesion_forward for word, score in word_score_table.items()}
l_tokenizer = LTokenizer(scores=scores)
l_tokenizer.tokenize("국제사회와 우리의 노력들로 범죄를 척결하자", flatten=False)

[('국제사회', '와'), ('우리', '의'), ('노력', '들로'), ('범죄', '를'), ('척결', '하자')]

6) 최대 점수 토크나이저

: 띄어쓰기가 되지 않는 문장에서 점수가 높은 글자 시퀀스를 순차적으로 찾아내는 토크나이저

from soynlp.tokenizer import MaxScoreTokenizer

maxscore_tokenizer = MaxScoreTokenizer(scores=scores)
maxscore_tokenizer.tokenize("국제사회와우리의노력들로범죄를척결하자")

['국제사회', '와', '우리', '의', '노력', '들로', '범죄', '를', '척결', '하자']

4. SOYNLP를 이용한 반복되는 문자 정제

from soynlp.normalizer import *
print(emoticon_normalize('앜ㅋㅋㅋㅋ이영화존잼쓰ㅠㅠㅠㅠㅠ', num_repeats=2))
아ㅋㅋ영화존잼쓰ㅠㅠ

print(repeat_normalize('와하하하하하하하하하핫', num_repeats=2))
와하하핫

5. Customized KoNLPy

  • Customized Konlpy: 사용자 사전 추가가 쉬운 패키지
pip install customized_konlpy

twitter.add_dictionary('은경이', 'Noun')
twitter.morphs('은경이는 사무실로 갔습니다.')
['은경이', '는', '사무실', '로', '갔습니다', '.']
profile
connecting the dots

0개의 댓글