본문 바로가기
과학/딥러닝

자연어 처리1 - 문장의 토큰화

by 루민즈 2023. 10. 29.

안녕하세요 

작년에 챗 GPT가 정식으로 서비스하였습니다. 챗 GPT는 어떠한 원리로 작동하는지 챗 GPT에 물어보면 답변은 

 

다음과 같이 자연어 처리로 작동한다고 답변을 합니다. 

자연어 처리에 대해 알아봅시다. 

 

자연어 처리

자연어란 사람들이 일상적으로 의사소통하고 정보를 교환하기 위해 사용되는 언어를 가리킵니다. 사람들이 평소에 쓰는 텍스트나 음성을 뜻하는데 챗 GPT를 비롯하여 애플의 시리, 구글의 어시스턴트, 네이버의 클로바 또한 이 자연어 처리를 통해 답변을 해줍니다. 하지만 사람들이 평소에 쓰는 말은 패턴 즉 규칙이 없습니다. 따라서 학습을 시키기가 굉장히 어려웠는데 딥러닝이 나오면서 자연어 처리 연구가 굉장히 활발해졌습니다. 그럼 자연어 처리가 어떠한 과정으로 처리 되는지 같이 알아봅시다. 

 

텍스트의 토큰화

먼저 텍스트를 토큰화 해줘야 됩니다. 다시말해 텍스트를 작게 나누어줘야됩니다. 문장은 단어별, 또다른 문장별, 형태소별로 나눌수 있는데 이렇게 나누어진 단위를 토큰이라고 합니다. 

예를 들어 다음과 같은 문장이 있다고 가정해 봅시다. 

 

"해보지 않으면 해낼 수 없다."

이걸 케라스에서 제공하는 text모듈의 text_to_word_sequence()함수를 사용하면 문장을 단어 단위로 쉽게 나눌수 있습니다.  코드는 다음과 같습니다. 

from tensorflow.keras.preprocessing.text import text_to_word_sequence 

text = '해보지 않으면 해낼 수 없다.'

result = text_to_word_sequence(text)
print("\n원문:\n",text)
print("\n토큰화:\n",result);

실행을 해보면 

원문: 해보지 않으면 해낼 수 없다.

토큰화: ['해보지', '않으면', '해낼', '수', '없다']

 

이렇게 출력이 되는걸 확인할수있습니다. 이게 텍스트의 토큰화 다른 말로는 텍스트의 전처리 과정입니다. 참고로 단어단위가 제일 많이 쓰입니다. Bag-of-word 라는 방법이 이러한 전처리를 일컫는 말인데, 같은 단어끼리 따로따로 가방에 담은후각 가방에 몇개의 단어가 들어 있는지 세는 기법입니다. 

 

예를들어 

"먼저 텍스트의 각 단어를 나누어 토큰화 합니다."

"텍스트의 단어로 토큰화해야 딥러닝에서 인식됩니다."

"토큰화한 결과는 딥러닝에서 사용할 수 있습니다."

 

토큰화를 하고 각 단어가 얼마나 쓰이는지 알려면 Tokenizer()함수를 불러옵니다. 코드는 

 

from tensorflow.keras.preprocessing.text import Tokenizer 

docs = ["먼저 텍스트의 각 단어를 나누어 토큰화 합니다.",

"텍스트의 단어로 토큰화해야 딥러닝에서 인식됩니다.",

"토큰화한 결과는 딥러닝에서 사용할 수 있습니다."
]

token = Tokenizer()
token.fit_on_texts(docs)

print("\n단어 카운트:\n",token.word_counts)

결과를 보면

 

단어 카운트:
 OrderedDict([('먼저', 1), ('텍스트의', 2), ('각', 1), 
 ('단어를', 1), ('나누어', 1), ('토큰화', 1), ('합니다', 1), 
 ('단어로', 1), ('토큰화해야', 1), ('딥러닝에서', 2), ('인식됩니다', 1), 
 ('토큰화한', 1), ('결과는', 1),
 ('사용할', 1), ('수', 1), ('있습니다', 1)])

 

 이렇게 나오는걸 확인할수 있습니다. 결과를 보면 각 단어별로 몇번쓰였는지 확인할수 있습니다. document_count()함수를 사용하면 총 몇개의 문장이 들어 있는지도 셀수 있습니다. 

print("\n문장 카운트: ",token.document_count)

문장 카운트: 3 이뜨시는걸 확인할수 있습니다.

또한 word_docs() 함수를 통해 각 단어들이 몇 개의 문장에 나오는지 세어서 출력할수도 있습니다. 

print("\n각 단어가 몇개의 문장에 포함되어 있는가:\n",token.word_docs)

 

각 단어가 몇개의 문장에 포함되어 있는가:
 defaultdict(<class 'int'>, {'나누어': 1, '토큰화': 1, '먼저': 1, '합니다': 1, '각': 1, 
 '텍스트의': 2, '단어를': 1, '단어로': 1, '토큰화해야': 1, '인식됩니다': 1, 
 '딥러닝에서': 2, '수': 1, '결과는': 1, '있습니다': 1, '사용할': 1, '토큰화한': 1})

각 단어의 배치된 인덱스 값을 출력할려면 word_index()함수를 사용하면 됩니다. 

print("\n각 단어에 매겨진 인덱스 값:\n",token.word_index)
각 단어에 매겨진 인덱스 값:
 {'텍스트의': 1, '딥러닝에서': 2, '먼저': 3, '각': 4, '단어를': 5, '나누어': 6, '토큰화': 7, '합니다': 8, '단어로': 9, '토큰화해야': 10, '인식됩니다': 11, '토큰화한': 12, '결과는': 13, '사용할': 14, '수': 15, '있습니다': 16}

 

다음엔 단어의 원핫 인코딩 및 단어 임베딩에 대해 알아봅시다.

728x90
반응형