ABOUT ME

초보 개발자의 코딩 노트( 코딩탕탕)

Today
Yesterday
Total
  • TensorFlow 기초 36 - 네이버 영화 리뷰 데이터로 word2vec 객체 생성 후 특정 단에 대한 유사도 확인
    TensorFlow 2022. 12. 13. 15:07

     

    # 네이버 영화 리뷰 데이터로 word2vec 객체 생성 후 특정 단에 대한 유사도 확인
    import pandas as pd
    import matplotlib.pyplot as plt
    import urllib.request
    from gensim.models.word2vec import Word2Vec
    from konlpy.tag import Okt
    
    urllib.request.urlretrieve("https://raw.githubusercontent.com/pykwon/python/master/testdata_utf8/ratings.txt", filename='rating.txt')
    # print(pd.read_table('rating.txt'))
    train_data = pd.read_table('rating.txt')
    print(train_data[:3])
    print(len(train_data)) # 10295
    print(train_data[train_data['label'].isnull()])
    print(train_data.isnull().values.any())
    train_data = train_data.dropna(how='any')
    print(train_data.isnull().values.any())
    print(len(train_data))
    
    # 한글 외 문자 제거
    train_data['document'] = train_data['document'].str.replace('[^가-힣 ]', '')
    print(train_data[:5])
    
    # 불용어 제거
    stopwords = ['을', '으로', '은', '는', '들', '와', '에', '게', '해서'] # 매우 주관적이다
    
    # Okt로 토큰 처리
    okt = Okt()
    token_data = []
    for sent in train_data['document']:
        temp = okt.morphs(sent, stem=True)
        temp = [word for word in temp if not word in stopwords] # 불용어 제거
        token_data.append(temp)
    
    
    import time
    time.sleep(5) # 작업이 끝나고 출력될 수 있도록 time.sleep을 주는 것이 좋다.
    
    
    print(token_data)
    
    print('리뷰의 최대 길이 :', max(len(i) for i in token_data))
    print('리뷰의 평균 길이 :', sum(map(len, token_data))/ len(token_data))
    
    plt.hist([len(s) for s in token_data])
    plt.xlabel('length of samples')
    plt.xlabel('number of samples')
    plt.show()
    
    word_model = Word2Vec(sentences=token_data, size = 100, window = 5, min_count=5, sg=0)
    print(word_model.wv.vectors.shape) # (2696, 100)
    print(word_model.wv.most_similar('주인공'))
    print(word_model.wv.most_similar('드라마')) # 드라마와 유사성 있는 단어
    
    # 사전 훈련된 Word2Vec 객체를 사용할 수 있다.
    import gensim
    
    model = gensim.models.Word2Vec.load('ko.bin')
    result = model.wv.most_similar("프로그램")
    print(result)
    result = model.wv.most_similar("자바")
    print(result)
    result = model.wv.most_similar("축구")
    print(result)
    
    
    <console>
            id                                           document  label
    0  8112052                                어릴때보고 지금다시봐도 재밌어요ㅋㅋ    1.0
    1  8132799  디자인을 배우는 학생으로, 외국디자이너와 그들이 일군 전통을 통해 발전해가는 문화산...    1.0
    2  4655635               폴리스스토리 시리즈는 1부터 뉴까지 버릴께 하나도 없음.. 최고.    1.0
    10295
               id                                         document  label
    3624  2078364                        좋다. 잔잔하고 깊이있게 파고드는 내용.  1    NaN
    3632  4166145  영화음악도 나름 괜찮았었죠. 테잎으로 사기까지 했는데...이젠 구하기가...--; 1    NaN
    True
    False
    10293
    
             id                                           document  label
    0   8112052                                  어릴때보고 지금다시봐도 재밌어요    1.0
    1   8132799  디자인을 배우는 학생으로 외국디자이너와 그들이 일군 전통을 통해 발전해가는 문화산업...    1.0
    2   4655635                   폴리스스토리 시리즈는 부터 뉴까지 버릴께 하나도 없음 최고    1.0
    3   9251303   와 연기가 진짜 개쩔구나 지루할거라고 생각했는데 몰입해서 봤다 그래 이런게 진짜 영화지    1.0
    4  10067386                         안개 자욱한 밤하늘에 떠 있는 초승달 같은 영화    1.0
    <ipython-input-11-3ceeb5958b23>:2: FutureWarning: The default value of regex will change from True to False in a future version.
      train_data['document'] = train_data['document'].str.replace('[^가-힣 ]', '')
      
      
    리뷰의 최대 길이 : 68
    리뷰의 평균 길이 : 11.994948022928204
    
    (2696, 100)
    [('그리고', 0.9998807907104492), ('모든', 0.9998741149902344), ('남자', 0.9998416900634766), ('남', 0.9998341202735901), ('대한', 0.9998313188552856), ('여', 0.9998266100883484), ('여자', 0.9998222589492798), ('훌륭하다', 0.9998208284378052), ('차다', 0.9998202323913574), ('수준', 0.999819815158844)]
    [('걸작', 0.9996998310089111), ('명작', 0.9996989965438843), ('한국', 0.9996887445449829), ('년대', 0.999679446220398), ('정말', 0.9996774196624756), ('임', 0.9996671676635742), ('막장', 0.9996431469917297), ('멋지다', 0.9996140003204346), ('팬', 0.9996113181114197), ('급', 0.9996106624603271)]
    [('망하다', 0.9995930194854736), ('버리다', 0.9995826482772827), ('전', 0.9995824098587036), ('받다', 0.9995762705802917), ('쓰다', 0.9995754957199097), ('놓다', 0.9995753169059753), ('존나', 0.9995747804641724), ('없이', 0.9995696544647217), ('서', 0.9995642304420471), ('빠지다', 0.9995630979537964)]
    
    [('애플리케이션', 0.6408973932266235), ('시스템', 0.6084378957748413), ('플러그인', 0.6059278249740601), ('자막', 0.5899795889854431), ('포맷', 0.5888468623161316), ('플랫폼', 0.5867334008216858), ('소프트웨어', 0.5808665752410889), ('텔레비전', 0.5772788524627686), ('세션', 0.5750851035118103), ('솔루션', 0.5719414353370667)]
    [('스크립트', 0.7378242015838623), ('컴파일러', 0.6451905965805054), ('리눅스', 0.6398512721061707), ('라이브러리', 0.6347814798355103), ('유닉스', 0.6131169199943542), ('리스프', 0.6066397428512573), ('도스', 0.6017436385154724), ('미디', 0.5987685918807983), ('프로그래밍', 0.5934149622917175), ('인터프리터', 0.5905465483665466)]
    [('아이스하키', 0.7354738116264343), ('배구', 0.7272718548774719), ('권투', 0.7065301537513733), ('축구팀', 0.6947455406188965), ('농구', 0.6805489659309387), ('야구', 0.6605638265609741), ('럭비', 0.653668224811554), ('미식축구', 0.644683837890625), ('테니스', 0.6392970681190491), ('골프', 0.6258326768875122)]

     

    리뷰의 길이 평균 시각화

    댓글

Designed by Tistory.