ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 한국어 전처리 패키지
    Natural Language Processing/딥 러닝을 이용한 자연어 처리 입문 2021. 5. 18. 16:32
    반응형

    https://wikidocs.net/92961 참고하여 공부한 내용 정리

    10) 한국어 전처리 패키지

    1. PyKoSpacing


    PyKoSpacing은 한국어 띄어쓰기 패키지, 띄어쓰기 딥러닝 모델

    new_sent="김철수는극중두인격의사나이이광수역을맡았다.철수는한국유일의태권도전승자를가리는결전의날을앞두고10년간함께훈련한사형인유연재(김광수분)를찾으러속세로내려온인물이다."
    from pykospacing import spacing
    
    kospacing_sent=spacing(new_sent)
    print(kospacing_sent)
    김철수는 극중 두 인격의 사나이 이광수 역을 맡았다. 철수는 한국 유일의 태권도 전승자를 가리는 결전의 날을 앞두고 10년간 함께 훈련한 사형인 유연재(김광수 분)를 찾으러 속세로 내려온 인물이다.

    2. Py-Hanspell


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

    from hanspell import spell_checker
    
    sent="맞춤법 틀리면 외 않되? 쓰고싶은대로쓰면돼지 "
    spelled_sent=spell_checker.check(sent)
    
    hanspell_sent=spelled_sent.checked
    print(hanspell_sent)
    맞춤법 틀리면 왜 안돼? 쓰고 싶은 대로 쓰면 되지

    이 패키지는 띄어쓰기 또한 보정함

    spelled_sent=spell_checker.check(new_sent)
    
    hanspell_sent=spelled_sent.checked
    print(hanspell_sent)
    김철수는 극 중 두 인격의 사나이 이광수 역을 맡았다. 철수는 한국 유일의 태권도 전승자를 가리는 결전의 날을 앞두고 10년간 함께 훈련한 사형인 유연제(김광수 분)를 찾으러 속세로 내려온 인물이다.

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


    soynlp는 품사 태깅, 단어 토큰화 등을 지원하는 단어 토크나이저임. soynlp 단어 토크나이저는 내부적으로 단어 점수 표로 동작함. 이 점수는 응집 확률(cohesion probability)브랜칭 엔트로피(branching entropy)를 활용함

    1) 신조어 문제

    기존 형태소 분석기는 신조어나 형태소 분석기에 등록되지 않은 단어 같은 경우 제대로 구분하지 못하는 단점이 있음

    from konlpy.tag import Okt
    tokenizer=Okt()
    print(tokenizer.morphs('에이비식스 이대휘 1월 최애돌 기부 요정'))
    ['에이', '비식스', '이대', '휘', '1월', '최애', '돌', '기부', '요정']

    '에이비식스', '이대휘', '최애돌' 은 각각 하나의 단어인데 위의 형태소 분석 결과에서는 모두 분리된 결과를 보여줌

    2) 학습하기

    soynlp는 학습에 기반한 토크나이저

    import urllib.request
    from soynlp import DoublespaceLineCorpus
    from soynlp.word import WordExtractor
    urllib.request.urlretrieve("https://raw.githubusercontent.com/lovit/soynlp/master/tutorials/2016-10-20.txt", filename="2016-10-20.txt")

    훈련 데이터를 다수의 문서로 분리함

    corpus=DoublespaceLineCorpus('2016-10-20.txt')
    len(corpus)
    30091

    상위 3개의 문서 출력

    i=0
    for document in corpus:
        if len(document)>0:
            print(i)
            print(document)
            i+=1
        if i==3:
            break
    0
    19  1990  52 1 22
    1
    오패산터널 총격전 용의자 검거 서울 연합뉴스 경찰 관계자들이 19일 오후 서울 강북구...
    2
    테헤란 연합뉴스 강훈상 특파원 이용 승객수 기준 세계 최대 공항인 아랍에미리트...

    soynlp는 학습 기반의 단어 토크나이저이므로 기존의 KoNLPy에서 제공하는 형태소 분석기와는 다르게 학습 과정을 거쳐야 함. 이는 전체 코퍼스로부터 응집 확률브랜칭 엔트로피 단어 점수표를 만드는 과정임. WordExtractor.extract()를 통해 전체 코퍼스에 대한 단어 점수표 계산함

    word_extractor=WordExtractor()
    word_extractor.train(corpus)
    word_score_table=word_extractor.extract()

    3) SOYNLP의 응집 확률 (cohesion probability)

    • 응집 확률: 내부 문자열(substring)이 얼마나 응집하여 자주 등장하는지를 판단하는 척도
    • 응집 확률은 문자열을 문자 단위로 분리하여 내부 문자열을 만드는 과정에서 왼쪽부터 순서대로 문자를 추가하면서 각 문자열이 주어졌을 때 그 다음 문자가 나올 확률을 계산하여 누적곱을 한 값
    • 이 값이 높을수록 전체 코퍼스에서 이 문자열 시퀀스는 하나의 단어로 등장할 가능성이 높음
    • 수식: img

    '반포한'의 응집 확률 계산

    print(word_score_table['반포한'].cohesion_forward)
    print(word_score_table['반포한강'].cohesion_forward)
    print(word_score_table['반포한강공'].cohesion_forward)
    print(word_score_table['반포한강공원'].cohesion_forward)
    0.08838002913645132
    0.19841268168224552
    0.2972877884078849
    0.37891487632839754

    응집도를 통해 하나의 단어로 판단하기에 가장 적합한 문자열은 '반포한강공원'이라 볼 수 있음

    4) SOYNLP의 브랜칭 엔트로피 (branching entropy)

    • 브랜칭 엔트로피: 확률 분포의 엔트로피값을 사용함, 주어진 문자열에서 얼마나 다음 문자가 등장할 수 있는지 판단하는 척도

    브랜칭 엔트로피의 값은 하나의 완성된 단어에 가까워질수록 문맥으로 인해 점점 정확히 예측할 수 있게 되면서 점점 줄어드는 양상을 보임

    print(word_score_table['디'].right_branching_entropy)
    print(word_score_table['디스'].right_branching_entropy)
    print(word_score_table['디스플'].right_branching_entropy)
    print(word_score_table['디스플레'].right_branching_entropy)
    print(word_score_table['디스플레이'].right_branching_entropy)
    2.68517802819071
    1.6371694761537934
    -0.0
    -0.0
    3.1400392861792916

    '디', '디스' 다음에는 다양한 문자가 올 수 있으니 0보다 큰 값을 가짐. 그러나 '디스플', '디스플레' 문자열 다음에는 다음 문자로 올 수 있는 문자가 명백하므로 0이란 값을 가짐. 이 때 '디스플레이' 다음에 조사나 다른 단어가 올 수 있으므로 하나의 단어가 끝나는 순간부터 다시 브랜칭 엔트로피 값이 증가함

    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를 이용한 반복되는 문자 정제


    SNS or 채팅 데이터와 같은 한국어 데이터의 경우 ㅋㅋ, ㅎㅎ 등이 불필요하게 연속되는 경우가 많음. ㅋㅋ, ㅋㅋㅋ, ㅋㅋㅋㅋ 와 같은 경우 모두 서로 다른 의미로 처리하는 것을 불필요하므로 반복되는 것을 하나로 정규화시킴

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

    5. Customized KoNLPy


    형태소 분석기 Twitter를 사용해 단어 토큰화 진행

    from ckonlpy.tag import Twitter
    twitter=Twitter()
    twitter.morphs('은경이는 사무실로 갔습니다.')
    ['은', '경이', '는', '사무실', '로', '갔습니다', '.']

    '은경이'는 사람 이름이므로 제대로 된 결과를 위해서는 위와 같이 분리되면 안되고 한 단어 토큰으로 얻어야 함. 여기서는 customized_konlpy이용하여 사용자 사전을 추가함

    twitter.add_dictionary('은경이', 'Noun')

    제대로 반영된 것을 확인

    twitter.morphs('은경이는 사무실로 갔습니다.')
    ['은경이', '는', '사무실', '로', '갔습니다', '.']

    '은경이' 단어를 하나의 토큰으로 인식하는 것을 확인

    반응형

    댓글

Designed by Tistory.