【비망록】 ③ word2vec로 변환 ~ 확산되는 뉴스 트윗을 판별하고 싶다 ~

개발 환경



Windows10
Anaconda3 (jupyter notebook)

설명과 목적



한 대학생의 졸론비망록
테마는 뉴스 트윗에서 확산되지 않는 판별기를 만드는 것입니다.
이번에는 도호쿠 대학의 학습 된 word2vec을 사용하여 문서의 벡터 평균으로 문서 벡터를 만들려고합니다.

전제 조건



・도호쿠 대학의 word2vec 인스톨 완료
※Windows에서의 해동은 Lhaplus에서 실시하는 것이 좋을까 생각합니다.

참고 URL



・도호쿠 대학 word2vec
h tp // w w. cl. 에세이. 도호쿠. 아 c. jp/~m-스즈키/쟈ぃき_ゔぇc와 r/
・사용법
htp : // bg. 하사쿠-bs. 이 m / 포 st / p t t-d를 rd2 ゔ ぇ c /

1. 필요한 라이브러리 가져오기



tohoku_word2vec.ipynb
import gensim
import pandas as pd
import numpy as np
from gensim.models import KeyedVectors

2. 모델 로드



tohoku_word2vec.ipynb
# model読み込み
model = KeyedVectors.load_word2vec_format('C:/entity_vector/entity_vector.model.bin', binary=True)

'C:/entity_vector/entity_vector.model.bin' 부분은 압축 해제된 위치의 디렉토리입니다. 조금 시간이 걸립니다.

3. 데이터 세트 만들기



마지막으로 사전 처리된 트윗을 가져옵니다. 또, 최근 3일분의 트윗과 5000RT~7000RT의 트윗은 확산과 비확산의 판별이 곤란하기 때문에, 제외하고 싶기 때문에, 그 이외의 데이터의 인덱스를 취득합니다.
그건 그렇고,
마지막으로 만든 데이터 세트는 다음과 같습니다.


색인
tweet_no
시간
텍스트
favorite_count
RT_count
Owakati
Buzz


0
00000000
yyyy-mm-dd 시간:분:초
XXXXXX
xx
xx
xx x x xx
0or1



tohoku_word2vec.ipynb
# データの読み込み
acount = "@livedoornews"
df = pd.read_csv("../data/finish_preprocessing_{}.csv".format(acount))

# 直近3日間を除外
now = datetime.datetime.now()
escape = now - datetime.timedelta(days=3)
usual_news_index = [] # 非拡散ツイートのindex格納用の空リスト
buzz_news_index = [] # 拡散ツイートのindex格納用の空リスト

for index, t in zip(df.index,df["time"]):
    if df.iloc[index,6] == 1:# 拡散だったかどうか
        buzz_news_index.append(index)
    elif escape < datetime.datetime.strptime(t, '%Y-%m-%d %H:%M:%S') or 7000 > df.iloc[index,4] > 5000:#直近3日間かor5000RT~7000RTか
        pass
    else:
        usual_news_index.append(index)

print("通常ニュース数 ; {}".format(len(usual_news_index)))
print("拡散ニュース数 ; {}".format(len(buzz_news_index)))

보통 뉴스 수; 1702
확산 뉴스 수; 144

다음으로, 취득한 index를 사용해, Buzz 판정과 분기의 데이터 세트를 작성합니다

tohoku_word2vec.ipynb
data_news_index = usual_news_index + buzz_news_index
sample_data = df.iloc[data_news_index].reset_index()
data = np.array(sample_data[['Buzz', 'Owakati']])
data.shape

Out[ ]: (1846, 2)

4. word2vec로 수치화



그러면 하나의 문장씩 word2vec을 사용하여 문장의 벡터 평균을 계산할 수 있습니다.

tohoku_word2vec.ipynb
result = [] # 文章ベクトルを格納するためのリスト
dict_word = [] # 学習済みword2vecに存在していた単語を格納するためのリスト
dict_escaped = [] # 学習済みword2vecに存在していなかった単語を格納するためのリスト
for i in range(data.shape[0]): #1文章ずつ取り出す
    print("{}回目 (残り{}回)".format(i+1,data.shape[0]-i-1))
    sentense_list = data[i][1].split(' ')
    vector = [] # 文章の中の単語のベクトルを格納するためのリスト
    for word in sentense_list:
        try:
            vector.append(model[word].tolist())
            dict_word.append(word)
        except:
            dict_escaped.append(word)
    result.append(np.mean(np.array(vector), axis=0).tolist())

data_vector = pd.concat([pd.DataFrame({"label" : data[:, 0].tolist()}), pd.DataFrame(np.array(result))], axis=1)
data_vector

1회째 (남은 1845회)
2회째(남은 1844회)
3회째(남은 1843회)
4번째 (남은 1842회)
..............
Out[ ]:


1846개의 200차원 벡터 값과 label(확산 여부)을 pandas로 저장한 data_vector를 가져옵니다.
또한 학습된 word2vec에 존재하지 않는 단어는 Error가 되므로 try~except를 사용하고 있습니다.

5. 반영할 수 있는 문서와 할 수 없는 문서



이제 word2vec에 존재했던 문서를 살펴 보겠습니다.

tohoku_word2vec.ipynb
dict_word = list(set(dict_word))
print(len(dict_word))
print(dict_word)

12145
['중간', '1969년', '대국', '우울증', '시즈', '억제', '위험', '서장', '대표자', '부당', '민사소송', ' 수면제', '더', '익사', '씹는', '동결', 'B2', '유품', '전염', '이와네', '증가'.......]
같았습니다.

다음으로 word2vec에 존재하지 않은 단어를 조사했습니다.

tohoku_word2vec.ipynb
dict_escaped = list(set(dict_escaped))
print(len(dict_escaped))
print(dict_escaped)

2273
['후견제도', '공부하고 싶다! ', '주루', '6종류', '앵무아', '일부점포', '30발', '목초지', '녹차음료', '수년전', '우승쟁쟁', '대천 난코의 여행 장미 '유리 얀', '아리키리 이시이', '공판 전 정리 절차', '지난 겨울', '브라우저 게임', '이와테현 노다무라', '미즈호 파이낸셜 그룹', '2군', '대문미치코', '고베야마구치조', '독해력', '유바리시장', '오후 8시', '양성반응', '인디챔프'.......]

개인적으로 소중한 것이 아닌가? 라고 생각되는 단어가 들어 있어 유감스러운 생각이 들었습니다. 뭐, 2,273건의 단어 밖에 뽑히지 않았던 것이 좋다고 말해도 좋은 것일까? 라는 느낌이지만 ...

이제 마지막으로 만든 데이터 세트를 저장합니다.

tohoku_word2vec.ipynb
data_vector.to_csv("../data/word2vec_result_@アカウント名.csv", index=False)

요약 및 다음 내용



이번에는 도호쿠 대학의 word2vec을 사용하여 단어의 벡터 평균으로 문서를 수치화했습니다. 다음번에는 이것을 이용하여 로지스틱 회귀를 실시하고 싶습니다.

좋은 웹페이지 즐겨찾기