ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [3월 2주차-3/11(1)]🛠 한국어 전처리 패키지
    Why Not SW CAMP 5기/수업 기록 2025. 3. 11. 10:36

    🚀 SOYNLP

    📌 품사 태깅, 단어 토큰화를 지원하는 토크나이저

    ✅ 비지도 학습으로 토큰화를 하고, 데이터에 자주 등장하는 단어를 분석.
    ✅ 내부적으로 단어 점수표로 동작하며, 이 점수는 응집 확률(Cohesion Probability)과 브랜칭 엔트로피(Branching Entropy)를 사용.

    🔹 DoublespaceLineCorpus: 텍스트 파일을 줄 단위로 불러오는 코퍼스 로더
    🔹 WordExtractor: 단어 점수표 계산. 비지도 학습 방식으로 텍스트 데이터를 보고 새로운 단어를 찾아내고 점수를 부여할 수 있음.


    📌 단어 점수표 (word_score_table)와 응집 확률, 브랜칭 엔트로피 설명

    한국어 자연어 처리는 띄어쓰기 문제가 많기 때문에 어떤 문자열이 실제 단어인지 판단하는 것이 중요.
    soynlp의 WordExtractor는 이를 해결하기 위해 비지도 학습 방식으로 단어를 점수화.
    이 점수 중에서 응집 확률(Cohesion Probability)과 브랜칭 엔트로피(Branching Entropy)가 핵심.


    🔹 1. 응집 확률 (cohesion_forward)

    🧐 "이 문자열이 하나의 단어로 쓰일 가능성이 얼마나 높은가?"

    ✅ 개념

    • 연속된 글자가 하나의 단어로 쓰일 확률을 측정하는 값
    • 해당 단어가 더 긴 문자열 속에서도 하나의 덩어리(단어)로 존재하는지를 계산함.
    • 일반적으로 문자열이 길어질수록 응집 확률이 높아지다가, 단어 경계를 지나면 떨어짐.

    📌 예제 및 해석

    word_score_table['반포한'].cohesion_forward
    # 0.08838002913645132 응집 확률이 낮음 → 단어일 가능성이 낮음.
    word_score_table['반포한강'].cohesion_forward
    # 0.19841268168224552
    word_score_table['반포한강공원'].cohesion_forward
    # 0.37891487632839754
    # "반포한강" → "반포한강공원": 응집 확률이 증가함 → 한 단어일 가능성이 커짐.
    word_score_table['반포한강공원에'].cohesion_forward
    # 0.33492963377557666  -> 감소 (즉, "반포한강공원"이 하나의 단어일 가능성이 가장 높음)
    

    📌 즉, 응집 확률이 가장 높은 지점에서 단어 경계가 결정될 가능성이 큼.
    📌 "반포한강공원"이 단어이고 "에"는 조사라서 응집 확률이 감소한 것으로 볼 수 있음.


    🔹 2. 브랜칭 엔트로피 (branching_entropy)

    🤔 "이 문자열 뒤에 다양한 단어가 붙을 가능성이 얼마나 높은가?"

    ✅ 개념

    • 특정 문자열 뒤에 어떤 글자가 다양하게 붙는지를 확률적으로 측정하는 값.
    • 값이 클수록 → 다양한 단어가 뒤에 붙을 수 있음 → 단어의 끝일 가능성이 높음.
    • 값이 작을수록 → 특정한 문자만 붙음 → 단어의 중간일 가능성이 높음.
    • left_branching_entropy(왼쪽 엔트로피)와 right_branching_entropy(오른쪽 엔트로피)로 나뉨.

    📌 예제 및 해석

    word_score_table['디스'].right_branching_entropy
    # 1.6371694761537934  (다음에 여러 단어가 붙을 가능성이 있음)
    
    word_score_table['디스플'].right_branching_entropy
    # -0.0  (다음에 반드시 '레'가 붙음, 즉 단어 중간일 가능성이 큼)
    # "디스" → "디스플": 엔트로피 감소 (특정 문자만 붙을 가능성이 큼 → 아직 단어가 아님)
    
    word_score_table['디스플레이'].right_branching_entropy
    # 3.1400392861792916 엔트로피 증가 (뒤에 다양한 단어가 붙을 수 있음 → 단어의 끝일 가능성이 큼).
    

    📌 즉, 단어가 끝나면 브랜칭 엔트로피가 다시 증가하는 패턴이 있음.


    🔹 3. L 토크나이저 (LTokenizer)

    ✂️ "앞에서부터 응집 확률이 높은 부분을 기준으로 단어를 분리하는 토크나이저"

    ✅ 개념

    • LTokenizer는 응집 확률을 기반으로 단어를 분리하는 토크나이저.
    • 입력 문장에서 가장 확률이 높은 단어를 먼저 찾고, 나머지를 재귀적으로 분석.

    📌 예제

    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)
    
    [('국제사회', '와'), ('우리', '의'), ('노력', '들로'), ('범죄', '를'), ('척결', '하자')]
    

    📌 문장 내에서 응집 확률이 높은 단어들을 먼저 토큰화하여 분리함.


    🔹 4. 최대 점수 토크나이저 (MaxScoreTokenizer)

    🎯 "띄어쓰기가 없는 문장에서 가장 점수가 높은 단어를 순차적으로 찾아내는 토크나이저"

    ✅ 개념

    • MaxScoreTokenizer는 띄어쓰기 없이 연결된 문장에서 점수가 높은 단어를 우선적으로 분리하는 방식.
    • LTokenizer와 다르게 순차적으로 최대 점수를 갖는 단어를 먼저 찾아냄.

    📌 예제

    from soynlp.tokenizer import MaxScoreTokenizer
    
    maxscore_tokenizer = MaxScoreTokenizer(scores=scores)
    
    maxscore_tokenizer.tokenize("국제사회와우리의노력들로범죄를척결하자")
    
    ['국제사회', '와', '우리', '의', '노력', '들로', '범죄', '를', '척결', '하자']
    

    📌 띄어쓰기가 없는 문장에서도 의미 있는 단어를 정확하게 찾아 분리할 수 있음.


    🔹 5. Customized KoNLPy (ckonlpy)

    🛠 "사용자가 직접 단어를 추가하여 형태소 분석을 커스터마이징할 수 있는 KoNLPy 확장 패키지"

    ✅ 개념

    • Customized KoNLPy는 기존 KoNLPy의 분석기에 사용자가 원하는 단어를 추가하여 정확도를 높일 수 있도록 제공됨.
    • 형태소 분석 결과에서 원래는 분리되던 단어를 하나의 단어로 인식하도록 학습할 수 있음.

    📌 설치 방법

    pip install customized_konlpy
    

    📌 예제

    from ckonlpy.tag import Twitter
    
    # Twitter 분석기 생성
    twitter = Twitter()
    
    # 기존 형태소 분석 결과
    twitter.morphs('은경이는 사무실로 갔습니다.')
    # ['은', '경이', '는', '사무실', '로', '갔습니다', '.']
    
    # '은경이'를 하나의 단어로 인식하도록 추가
    twitter.add_dictionary('은경이', 'Noun')
    
    # 커스터마이징 후 형태소 분석 결과
    twitter.morphs('은경이는 사무실로 갔습니다.')
    # ['은경이', '는', '사무실', '로', '갔습니다', '.']
    

    📌 기존에는 '은'과 '경이'로 분리되었지만, 사용자가 '은경이'를 명사(Noun)로 등록하여 하나의 단어로 인식됨.
    📌 add_dictionary()를 활용해 사전을 커스터마이즈하면 신조어나 도메인 특화 단어를 쉽게 반영 가능.


     

    🔹 6. 실전 활용

    📌 응집 확률과 브랜칭 엔트로피를 활용하면 한국어 NLP에서 다음과 같은 작업이 가능함.

    1️⃣ 신조어 및 도메인 특화 단어 탐색

    ✅ 기존 사전에 없는 단어도 데이터에서 자동으로 추출 가능.
    ✅ 예: "메타버스", "배민커넥트", "라이브커머스" 등의 신조어 탐색.

    2️⃣ 한국어 문장에서 적절한 단어 경계 찾기

    ✅ 띄어쓰기가 잘못된 문장에서도 올바른 단어 경계를 찾아낼 수 있음.
    ✅ 예: "서울역근처맛집" → "서울역 근처 맛집"

    3️⃣ 토큰화 성능 향상

    ✅ 형태소 분석기와 함께 사용하면 한국어 토큰화의 정확도를 향상 가능.
    ✅ 예: 기존 형태소 분석기가 "코로나19"를 "코로나 19"로 나눠버릴 경우, 응집 확률을 활용하면 하나의 단어로 인식 가능.

    4️⃣ 비지도 학습 기반 단어 사전 구축

    ✅ 새로운 데이터를 학습하며 지속적으로 단어 사전을 업데이트 가능.
    ✅ 특정 도메인(예: 의료, 금융 등)에서 많이 쓰이는 단어를 자동으로 추가할 수 있음.

    📌 이러한 기법들을 활용하면 한국어 자연어 처리에서 더욱 정교한 분석과 토큰화를 수행할 수 있음! 🚀


    🎯 최종 요약

    응집 확률 (Cohesion Probability): 연속된 글자가 하나의 단어로 쓰일 확률을 측정하여 단어 경계를 찾는 데 활용됨.
    브랜칭 엔트로피 (Branching Entropy): 특정 문자열 뒤에 다양한 단어가 붙을 가능성을 분석하여 단어의 끝을 판별함.
    LTokenizer: 응집 확률을 활용해 문장에서 가장 자연스러운 단어 단위를 찾는 토크나이저.
    MaxScoreTokenizer: 점수가 높은 단어를 우선적으로 추출하는 방식으로, 띄어쓰기 없는 문장을 효과적으로 분석함.
    Customized KoNLPy (ckonlpy): 사용자 정의 사전 추가를 통해 형태소 분석기의 성능을 향상시키는 확장 기능.

    📌 이러한 기법들을 조합하면 더 정교하고 정확한 한국어 NLP 분석이 가능함! 🚀

Designed by Tistory.