[챗봇]. Tokenzie 와 Sparse Vector(희소벡터)

jongmin-oh·2023년 5월 5일

위로 챗봇 개발기

목록 보기
3/3

오복이의 v1.0 버전은 키워드 기반 유사도 알고리즘으로 만들어졌습니다.

챗봇 알고리즘을 설명하기 앞서 중요한 몇 가지 개념을 먼저 알아보겠습니다.

Tokenize

토크나이즈는 텍스트 문장을 여러 단위로 쪼개는 것을 의미합니다.
여러 토크나이즈 기법이 있으며 대표적으로는 형태소 단위로 분리하는 방법과 "서브워드"라고 불리는 빈도 수에 따라 단어를 학습시켜 토크나이즈 하는 방법이 있습니다.

즉 토크나이즈는 간단하게 "일정 규칙에 따라 문장을 쪼갠다"고 보면 됩니다.

왜 문장을 쪼개야 할까요?

컴퓨터가 알아 들을 수 있도록 텍스트(문장)를 숫자로 바꿔야하기 때문입니다. 이를 정수 인코딩(Encoding)이라고 합니다. 숫자로 바꿔서 컴퓨터에게 알려주는 것이지요.

오복이 v1.0 에서는 mecab 기반인 nori_tokenizer를 사용합니다.
예시로는 mecab과 동일한 pecab으로 테스트 해보겠습니다.

# pip install pecab

from pecab import PeCab
tokenizer = PeCab()

tokenizer.pos("안녕하세요 저는 오복이입니다")

[('안녕', 'NNG'), ('하', 'XSV'), ('세요', 'EP+EF'),
('저', 'NP'), ('는', 'JX'), ('오복', 'NNG'), ('이', 'VCP'), ('입니다', 'EP+EF')]

이런식으로 한 문장을 8개의 토큰(token)으로 분리하였습니다.

Sparse vector

자 이제 문장을 분리했다면 앞서 말한 내용으로 숫자로 바꿔야합니다.
숫자로 바꾸는 가장 쉽고 간단한 방법은 One-hot-Encoding 입니다.

원핫 인코딩 설명

Bag-of-words 예시

원핫 인코딩에서 단어의 빈도 수에 따라 값을 변화시킨 것이 바로
TF-IDF라는 알고리즘 입니다.

TF-IDF

Tf-idf(Term Frequency-Inverse Document Frequency)는 키워드 기반 유사도 기법 중 하나로, 텍스트 문서에서 특정 단어의 중요도를 나타내는 가중치를 계산하는 방법입니다.

Tf(Term Frequency)는 특정 단어가 문서 내에서 얼마나 자주 등장하는지를 나타내는 지표입니다. 즉, 문서에서 단어가 출현한 횟수를 그 단어의 빈도수로 계산합니다. 예를 들어, "The cat in the hat"이라는 문장에서 "cat"이라는 단어의 빈도수는 1이 됩니다.

Idf(Inverse Document Frequency)는 전체 문서에서 특정 단어가 얼마나 많이 등장하는지를 나타내는 지표입니다. 이 값은 로그 함수를 이용하여 계산됩니다. 만약 특정 단어가 모든 문서에서 매우 자주 등장한다면 그 값은 작아질 것이고, 그 반대의 경우에는 값이 커집니다.

Tf-idf는 이 두 지표를 조합하여 계산합니다. 즉, 각 문서에서의 각 단어의 Tf 값과 전체 문서에서의 해당 단어의 Idf 값의 곱으로 계산됩니다. 이를 통해 문서 간 유사도를 측정할 수 있으며, 검색 엔진에서 검색어와 문서 간의 유사도를 측정하는 데에도 활용됩니다.


하지만 원핫 인코딩, TF-IDF 는 똑같은 한계가 있습니다.
바로 단어(토큰) 수가 많아지면 단어 수만큼의 최대 벡터길이를 가지게 된다는 것 입니다. 그래서 이 것을 Sparse Vector(희소 벡터)라고 합니다.

Sparse 를 번역하면 "드문드문 한"이라고 해석됩니다.
이 뜻은 벡터의 길이는 "단어의 수"로 엄청 길지만 문장이 가지고 있는 단어는 몇개 없기 때문에 해당 단어만 값을 가지고 나머지는 0 값을 가지게 되어 "드문드문 한"

Sparse Vector라고 하는 것 입니다.

다음에는 이 벡터를 가지고 챗봇 답변 알고리즘에 적용하는 방법에 대해서 알아보겠습니다.


참고 : https://wikidocs.net/book/2155

profile
Technical Problem Solver (기술로 문제를 해결하는 사람)

0개의 댓글