저번시간에 임베딩에 대해 간략하게 설명했고 오늘은 우리 데이터셋에 적용해보았다.
첫번째 고려한 것은 우리가 우리 뉴스데이터로만 모델을 만들 것인지 아니면 pre-traine모델과 우리 모델을 결합하여 사용할 것인지 였다. pre-trained 모델은 말그대로 이미 사전 훈련된 모델이다. 더 방대한 데이터셋을 통해서 이미 훈련된 모델을 이용하는 것이었다. 모델을 구현하기 위해 고민을 많이 했었는데, 아래 글을 읽어보고 우리 데이터로만 모델을 구축해보기로 결정했다.
우선 위 글에서 pre_trained모델과 customized 모델에 대한 설명만 요약하면 내가 이해하기 딱 쉬운 예시가 있었다.
예를 들어 ['뉴턴','트럼프'.'사과'] 이러한 텍스트를 구분할 때 사전 훈련 모델은 특정 주제를 가진것이 아니라 방대한 데이터로부터 모델을 만든 것이므로 저 셋중 어울리지 않는 것을 빼라고하면 사과를 뺄 것이다. 트럼프와 뉴턴 모두 사람이므로. 하지만 과학기술을 통해 훈련된 customized모델이 있다고 하면 뉴턴의 만류인력->사과로 연결되어 트럼프를 어울리지 않다고 뺄 것이다. 이렇게 특정주제를 가지는 문제에 대해서는 customized model이 정확성이 더 높다고 한다. 더 많은 내용은 윗글을 읽어보면 좋을 것 같다.
[구현]
우선 gensim이라는 자연어처리 패키지에서 word2vec을 import해주고, 우리가 임베딩하고자 하는 단어들을 읽어준다.
from gensim.models import Word2Vec
sentences = list([i for i in data['text_token']])
다음으로 모델을 생성해준다.
model = Word2Vec(sentences, size=100, window=5, min_count=100, workers=1)
우리는 저번시간에 설명한 cbow방법을 사용했다. 함수안의 인자의 설명은 아래와 같다,
workers : 실행할 병렬 프로세스의 수, 코어수, 주로 4-6사이 지정
size : 각 단어에 대한 임베딩 된 벡터차원 정의, size=2라면 한 문장의 벡터는 [-0.1248574, 0.255778]와 같은 형태를 가지게 된다.
min_count : 단어에 대한 최소 빈도수.
window :양쪽으로 몇 개의 단어까지 고려해서 의미를 파악할 것인지 지정하는 것
sample : 빠른 학습을 위해 정답 단어 라벨에 대한 다운샘플링 비율을 지정하는 것, 보통 0.001이 좋은 성능을 낸다고 한다.
sg : 1이면 skip-gram 방법을 사용하고, 0이면 CBOW 방법을 사용한다.(default==0)
iter : epoch와 같은 뜻으로 학습 반복 횟수를 지정한다.
이렇게 하고 나면 우리가 저번글에서 불용어를 제거하고 저장해놓은 "text-token"에 저장해 놓은 단어들을 임베딩한 모델이 만들어진다. 이러한 모델 생성과정을 매번 거치지 않으려면 모델을 저장해놓고 나중에 불러오면 된다,
#모델저장하기
model.save('/content/drive/MyDrive/Personal Project/Classify_fake-news/test.model')
#모델 불러오기
model=Doc2Vec.load('/content/drive/MyDrive/Personal Project/Classify_fake-news/fake_test.model')
우리가 만든 모델이 잘 만들어졌는지 확인하는 코드를 작성해보자.
# 비슷한 단어들 불러오기
model.wv.most_similar("facebook")
[('instagram', 0.6455816030502319),
('huffington', 0.5368248224258423),
('reddit', 0.5310718417167664),
('google', 0.5275131464004517),
('shared', 0.513275682926178),
('online', 0.5040249824523926),
('blog', 0.4823458790779114),
('page', 0.48091596364974976),
('deleted', 0.45882201194763184),
('website', 0.44746923446655273)]
우선 유사도가 높은 것들을 출력하는 함수를 사용해봐는데 결과를 보면 알 수 있듯이 잘 된 것 같다.
#postive하면 유사한것들을 나열 / negative하면 유사하지 않은 것들을 나열
model.wv.most_similar(positive=["trump","obama", "clinton"])
[('elect', 0.521462082862854),
('incoming', 0.47403275966644287),
('amateur', 0.47135597467422485),
('crooked', 0.4601602554321289),
('bush', 0.4409095346927643),
('reagan', 0.40974289178848267),
('candidacy', 0.4068627953529358),
('trail', 0.38788264989852905),
('campaigning', 0.3872838020324707),
('giuliani', 0.38666313886642456)]
이번에는 한개가 아닌 3개와 유사한 것들을 뽑아봤는데 역시나 잘 나온 것 같다.
이번시간에는 이렇게 word2vec을 이용해 임베딩을 해봤고 다음에는 이제 이 임베딩한 값들을 이용하여 본격적인 분류모델 설명과, 구현을 해보겠다.
'프로젝트 > 가짜 뉴스 분류' 카테고리의 다른 글
[가짜뉴스구별]-Final (0) | 2022.06.28 |
---|---|
[가짜뉴스구별]-Day 3(모델적용) (0) | 2022.05.03 |
[가짜뉴스구별]-Day 1(임베딩 설명) (0) | 2022.04.02 |
[가짜뉴스구별]-Day 0 (0) | 2022.03.28 |