[NLP] 정수 인코딩(Integer Encoding) [한국어 자연어처리]

2021. 6. 28. 08:36자연어처리 (Natural Language Process)

반응형

[ 자연어 처리 ]

 

해당 자료를 참고하여 재작성하였습니다

wikidocs.net/31766

 

이번 포스팅은 단어에 정수 인덱스를 부여해주는 [정수 인코딩] 작업을 에 대해 포스팅을 하도록 하겠습니다

단어에 정수를 부여하는 경우는 아래 등과 같은 경우가 있습니다

- 단어의 빈도수를 확인할때

- 단어의 빈도수 순으로 차례로 낮은 숫자부터 부여할때

 


정제 & 토큰화 

우선 작업전 토큰화와 불용어들을 제거를 통해 불필요한 텍스트를 제거 해줍니다.

[불용어 리스트는 https://mr-doosun.tistory.com/24 링크에 리스트를 사용하였습니다]

from eunjeon import Mecab
from nltk.tokenize import word_tokenize

mecab = Mecab() # 형태소 분석기

text = '자연어 처리 또는 자연 언어 처리는 인간의 언어 현상을 컴퓨터와 같은 기계를 이용해서 묘사할 수 있도록 연구하고 이를 구현하는 인공지능의 주요 분야 중 하나다. 자연 언어 처리는 연구 대상이 언어 이기 때문에 당연하게도 언어 자체를 연구하는 언어학과 언어 현상의 내적 기재를 탐구하는 언어 인지 과학과 연관이 깊다. 구현을 위해 수학적 통계적 도구를 많이 활용하며 특히 기계학습 도구를 많이 사용하는 대표적인 분야이다. 정보검색, QA 시스템, 문서 자동 분류, 신문기사 클러스터링, 대화형 Agent 등 다양한 응용이 이루어지고 있다.'

text = mecab.nouns(text)

vocab={} # 파이썬의 dictionary 자료형
sentences = []
stop_words = STOP_WORD # https://mr-doosun.tistory.com/24

# 정제와 단어 토큰화
for i in text:
    sentence=word_tokenize(i) # 단어 토큰화를 수행합니다.
    result = []

    for word in sentence: 
        word=word.lower() # 모든 단어를 소문자화하여 단어의 개수를 줄입니다.
        if word not in stop_words: # 단어 토큰화 된 결과에 대해서 불용어를 제거합니다.
            if len(word) > 1: # 단어 길이가 2이하인 경우에 대하여 추가로 단어를 제거합니다.
                result.append(word)
                if word not in vocab:
                    vocab[word] = 0 
                vocab[word] += 1
    sentences.append(result)

print(sentences)
[['자연어'], ['처리'], ['자연'], ['언어'], ['처리'], ['인간'], ['언어'], ['현상'], ['컴퓨터'], ['기계'], [], ['묘사'], [], ['연구'], [], ['구현'], ['인공지능'], ['주요'], ['분야'], [], [], ['자연'], ['언어'], ['처리'], ['연구'], ['대상'], ['언어'], [], ['언어'], ['자체'], ['연구'], ['언어학'], ['언어'], ['현상'], [], ['기재'], ['탐구'], ['언어'], ['과학'], [], ['구현'], ['수학'], ['통계'], ['도구'], ['활용'], ['기계'], ['학습'], ['도구'], ['사용'], ['대표'], ['분야'], ['정보'], ['검색'], ['시스템'], ['문서'], ['자동'], ['분류'], ['신문'], ['기사'], ['클러스터'], ['대화'], [], ['다양'], ['응용']]

 

빈도수 순으로 낮은 정수 인덱스 부여

vocab을 출력하시면 단어들의 빈도수를 정수로 부여되어있습니다

print(vocab)
{'자연어': 1, '처리': 3, '자연': 2, '언어': 7, '인간': 1, '현상': 2, '컴퓨터': 1, '기계': 2, '묘사': 1, '연구': 3, '구현': 2, '인공지능': 1, '주요': 1, '분야': 2, '대상': 1, '자체': 1, '언어학': 1, '기재': 1, '탐구': 1, '과학': 1, '수학': 1, '통계': 1, '도구': 2, '활용': 1, '학습': 1, '사용': 1, '대표': 1, '정보': 1, '검색': 1, '시스템': 1, '문서': 1, '자동': 1, '분류': 1, '신문': 1, '기사': 1, '클러스터': 1, '대화': 1, '다양': 1, '응용': 1}

 

아래 코드를 입력하시면 빈도수가 높은 순서대로 정렬이 됩니다.

vocab_sorted = sorted(vocab.items(), key = lambda x:x[1], reverse = True)
print(vocab_sorted)
[('언어', 7), ('처리', 3), ('연구', 3), ('자연', 2), ('현상', 2), ('기계', 2), ('구현', 2), ('분야', 2), ('도구', 2), ('자연어', 1), ('인간', 1), ('컴퓨터', 1), ('묘사', 1), ('인공지능', 1), ('주요', 1), ('대상', 1), ('자체', 1), ('언어학', 1), ('기재', 1), ('탐구', 1), ('과학', 1), ('수학', 1), ('통계', 1), ('활용', 1), ('학습', 1), ('사용', 1), ('대표', 1), ('정보', 1), ('검색', 1), ('시스템', 1), ('문서', 1), ('자동', 1), ('분류', 1), ('신문', 1), ('기사', 1), ('클러스터', 1), ('대화', 1), ('다양', 1), ('응용', 1)]

 

아래 코드를 입력하시면 빈도수가 적은 단어는 제외한 후,

높은 빈도수를 가진 단어에 낮은 정수 인덱스를 부여합니다.

word_to_index = {}
i=0
for (word, frequency) in vocab_sorted :
    if frequency > 1 : # 빈도수가 적은 단어는 제외한다.
        i=i+1
        word_to_index[word] = i
print(word_to_index)
{'언어': 1, '처리': 2, '연구': 3, '자연': 4, '현상': 5, '기계': 6, '구현': 7, '분야': 8, '도구': 9}

 

반응형