[NLP] 말뭉치 전처리

2023. 2. 12. 20:03Natural Language Processing

우리가 사용하는 언어를 컴퓨터가 이해할 수 있는 형태로 변환하기 위한 첫걸음은 

 

말을 단어 단위로 분해한 뒤 이를 숫자로 표현하는 것이다. 

 

    text = 'I have lived a life of shame.'

위 문장을 단어로 분해하면 I / have / lived / a / life / of / shame. 이다. 

 

이 단어 하나하나를 말뭉치(corpus)로 만들어서 컴퓨터가 이해할 수 있도록 indexing한다. 

    text = text.lower()
    text = text.replace('.', ' .')
    words = text.split(' ')

먼저 text 전체를 소문자로 바꾸로 공백 단위로 split 한다. 

 

word_to_id = {}
id_to_word = {}

그리고 나서 단어를 인덱스로, 거꾸로 인덱스를 단어로 매칭시켜주는 딕셔너리를 만든다. 

for word in words:
    if word not in word_to_id:
        new_id = len(word_to_id)
        word_to_id[word] = new_id
        id_to_word[new_id] = word

단어를 순회하면서 처음 등장하는 단어 순서대로 딕셔너리에 추가하고 인덱스를 부여한다. 

 

반대의 과정(id_to_word)도 동시에 진행한다. 

 

corpus = [word_to_id[w] for w in words]
corpus = np.array(corpus)

딕셔너리에 저장된 대로 문장의 각 단어들을 인덱스로 바꾸어서 corpus로 나타낸다. 

 

text = 'I have lived a life of shame.'
corpus, word_to_id, id_to_word = preprocess(text)
print(word_to_id)

결과:
{'i': 0, 'have': 1, 'lived': 2, 'a': 3, 'life': 4, 'of': 5, 'shame': 6, '.': 7}

 

 

    print(id_to_word)
    
    결과:
    {0: 'i', 1: 'have', 2: 'lived', 3: 'a', 4: 'life', 5: 'of', 6: 'shame', 7: '.'}
    print(corpus)
    
    결과:
    [0 1 2 3 4 5 6 7]

위 문장은 중복 사용된 단어가 없어서 인덱스 차례로 출력되었다.

'Natural Language Processing' 카테고리의 다른 글

[NLP] RNN(순환 신경망)  (0) 2023.02.22
[NLP] word2vec 개선 - 임베딩, 네거티브 샘플링  (0) 2023.02.19
[NLP] word2vec  (0) 2023.02.13
[NLP] ppmi과 SVD 차원축소  (0) 2023.02.12
[NLP] 동시발생행렬  (0) 2023.02.12