오늘은 저번시간에 전처리한 데이터를 가지고 벡터화/임베딩을 해보았다. 우선 임베딩에 대해서 간략하게 설명해보겠다.
임베딩이란 위와 같이 사람이 쓰는 자연어를 기계가 이해할 수 있는 숫자의 나열인 벡터로 바꾼 결과 혹은 그 과정 전체를 의미한다. 임베딩 전에 우선 가장 기본적인 벡터화 방법인 one-hot-encoding에 대해서 설명하겠다.
- One-hot Encoding
- 필요한 정보를 담은 하나의 값만 1로 두고, 나머지 값은 0으로 설정하는 방법->희소행렬
- 단어가 많을수록 벡터 공간만 커지는 비효율적인 방법
- 원-핫 인코딩은 단어가 무엇인지만을 알려줄 뿐 어떤 특징을 가지고 있는지 설명하지 못한다
원핫인코딩을 사용하여 여자와 남자를 분류한다고 하면 여자는 [0,1] 남자는 [1,0] 이런식으로 표현할 수 있다.
원핫인코딩은 차원이 커질수록 비효율적이고, 특징을 설명할 수 없으므로 밀집행렬을 사용하는데 이러한 방식을 임베딩이라고한다.
임베딩의 가장 큰 특징은 세가지가 있다.
1. 단어/문장간의 관련도를 계산하는데 사용
2. 의미적 문법적 정보 함축이 가능하다. 여기서 의미적 문법적 정보함축이란 예를 들어 임베딩이 제대로 진행됐을 때, "아들"-"딸"+"소년"을 계산하면 "소년"이 나오도록 하는 것이다. 성별이 같으므로 성별에 해당하는것이 제거되고 소년에 해당되는 수치만 남는 것이다.
3.전이 학습.임베딩을 다른 딥러닝 모델의 입력값으로 써서 임베딩을 잘 할수록 모델의 성능이 좋아지게 만드는 것이다.
- 임베딩 벡터
- 밀집행렬로 임베딩된 벡터는 각 요소에서 단어의 서로 다른 특성을 나타낸다.
- 각 요소에는 단어가 관련 특성을 대표하는 정도를 나타내는 0~1 사이의 값이 포함된다.
- 즉, 이런 임베딩을 통해 텍스트를 단순히 '구분' 하는것이 아닌 의미적으로 '정의'하는 것이라고 볼 수 있다.
임베딩을 하여 여자와 남자를 표현하면 여자를 [0.2,0.5] [0.1,0.4]의 실수 형태 벡터로 표현할 수 있다.
파이썬의 임베딩 방법에는 여러가지 패키지가 있는데, 대표적으로 CountVectorizer, TfidfVectorizer, Word2Vec가 있다.
[CountVectorizer]
텍스트에서 횟수를 기준으로 특징을 분류하는 방법이다. "나는 매일매일 일기를 쓴다"를 벡터화하면 ['나는','매일','일기','쓴다'] 이런식의 vocab이 만들어지고, 벡터화 결과는 [1,2,1,1]이 된다. 그러나 단순히 횟수로만 특징을 구별하기 떄문에 조사나 어미등의 자주나오는 단어들이 높은 값을 갖는 불필요한 특징이 있다.
[TfidfVectorizer]
TF-IDF를 이용하여 특징을 추출해내는데, TF(Term Frequency)는 글에서 특정단어가 나오는 빈도수, IDF(Inverse Document Frequency)로 특정단어가 여러 글에 얼마나 나오는지 알려주는 지표의 반대를 의미한다. 이를 통해 아까 countvectorizer에서 말한 조사나 대명사등의 단어들이 걸러지게 된다. 따라서 TF-IDF는 다른글에는 자주 나오지않고 해당 글에 자주나오는 단어들이 높은 벡터값을 갖게된다.
[Word2Vec]
임베딩에서 가장 많이 쓰이는 word2vec이다. 우선 word2vec에서는 위 두개의 방법과 다르게 단어사이의 유사도를 측정할 수 있는데, 크게 Cbow와 Skip-gram 두가지 방법이 있다.Cbow는 모르는 단어를 문맥의 주변단어를 통해 예측하는 방법이다. 예를 들어 나는 오늘 -----를 먹었다. 라는 문장에서 ----를 주변단어들을 통해서 예측하는 것이다. 학습원리는 다음과 같다.
1. 주변 단어들을 one-hot 벡터로 만들어 입력값으로 사용한다.(input layer)
2. 가중치 행렬을 one-hot벡터에 곱해서 n-차원 벡터를 만든다.(hidden layer)
3. 만들어진 n-차원 벡터를 모두 더해 더한 개수로 나눠 평균 n-차원 벡터를 만든다.(output layer)
4. n-차원 벡터에 다시 가중치 행렬을 곱해서 one-hot 벡터와 같은 차원의 벡터로 만들고 실제 예측하려고 하는 단어의 one-hot 벡터와 비교해서 학습한다.(optimize)
Ski-gram 방법은 반대로 특정단어를 이용하여 주변 단어들을 예측하는 것이다.
이런 과정을 거쳐 나온 단어벡터는 단어 간의 유사도를 나타내준다.
더 자세한 word2vec의 원리에 대해서는 링크를 남겨두겠다.
다음글에서는 가짜,진짜 뉴스에서 word2vec을 이용한 임베딩을 구현해보겠다.
'프로젝트 > 가짜 뉴스 분류' 카테고리의 다른 글
[가짜뉴스구별]-Final (0) | 2022.06.28 |
---|---|
[가짜뉴스구별]-Day 3(모델적용) (0) | 2022.05.03 |
[가짜뉴스구별]-Day 2(임베딩구현) (0) | 2022.04.02 |
[가짜뉴스구별]-Day 0 (0) | 2022.03.28 |