Giter VIP home page Giter VIP logo

parkjisu6239 / 2019_nims Goto Github PK

View Code? Open in Web Editor NEW
0.0 1.0 0.0 3.55 MB

[ProjectπŸ—‚] κ΅­κ°€μˆ˜λ¦¬κ³Όν•™ μ—°κ΅¬μ†Œ μ£Όκ΄€ 2019 μ‚°μ—…μˆ˜ν•™ μ„Έλ―Έλ‚˜, μžμ—°μ–΄ 처리λ₯Ό μ΄μš©ν•œ ML 및 μ‹œκ°ν™”

HTML 65.34% Jupyter Notebook 34.66%
big-data python nature-language-processing emotion-analysis wordcloud machine-learning

2019_nims's Introduction

μžμ—°μ–΄ 처리 및 감정 뢄석

2019.08 / 2019 κ΅­κ°€ μˆ˜λ¦¬κ³Όν•™ μ—°κ΅¬μ†Œ μ‚°μ—…μˆ˜ν•™ μ„Έλ―Έλ‚˜

뢄석 λͺ¨λΈ : https://bit.ly/3wFVACJ

μ‹œκ°ν™” : https://bit.ly/3vArvDf

λͺ©μ 

  • 넀이버 μ˜ν™” λŒ“κΈ€ 데이터λ₯Ό ν™œμš©ν•˜μ—¬ ν…μŠ€νŠΈ 긍정 λΆ€μ • 예츑 λͺ¨λΈ 개발
  • 긍정, λΆ€μ •μ–΄λ₯Ό 톡해 μ˜ν™” μ œμž‘ 및 λ§ˆμΌ€νŒ…μ—μ„œ ν™œμš©ν•œ μ°Έκ³  μžλ£Œλ‘œμ„œ ν™œμš© κ°€λŠ₯

κ°œμš”

  1. ML
    • step1. 넀이버 μ˜ν™” 메인 νŽ˜μ΄μ§€(ν˜„μž¬ μƒμ˜μž‘) μ—μ„œ 1~10μœ„ μ˜ν™”μ˜ μƒμ„ΈνŽ˜μ΄μ§€ μ£Όμ†Œ 크둀링
    • step2. μƒμ„ΈνŽ˜μ΄μ§€μ—μ„œ ν‰μ μ˜ 더보기λ₯Ό ν΄λ¦­ν–ˆμ„ λ•Œ λ³΄μ—¬μ§€λŠ” νŽ˜μ΄μ§€ μ£Όμ†Œ 크둀링
    • step3. 140자 평을 1νŽ˜μ΄μ§€~끝 νŽ˜μ΄μ§€ μˆœνšŒν•˜λ©΄μ„œ 평점과 리뷰λ₯Ό 크둀링
    • step4. ν•™μŠ΅μ„ μœ„ν•œ 데이터 μ „μ²˜λ¦¬
    • step5. ν•™μŠ΅. ν•™μŠ΅λœ λͺ¨λΈμ„ 파일둜 μ €μž₯
    • step6. μ €μž₯된 λͺ¨λΈμ„ λΆˆλŸ¬μ™€ μ‚¬μš©
  2. μ‹œκ°ν™”
    • step1. 데이터λ₯Ό κ°€μ Έμ™€μ„œ μŠ€μ½”μ–΄λ₯Ό κΈ°μ€€μœΌλ‘œ 긍정,λΆ€μ • 리뷰λ₯Ό λ‚˜λˆ”
    • step2. λ‚˜λˆ„μ–΄μ§„ 리뷰데이터λ₯Ό ν˜•νƒœμ„œ λΆ„μ„ν•˜μ—¬ λͺ…사λ₯Ό ν† ν°ν™”ν•œλ‹€.
    • step3. 토큰화 된 λͺ…μ‚¬μ€‘μ—μ„œ 자주 λ‚˜μ˜€λŠ” 50개의 단어λ₯Ό 확인
    • step4. ν•΄λ‹Ή λ‹¨μ–΄μ˜ λΉˆλ„μˆ˜λ₯Ό ν‘œν˜„ν•˜λŠ” 차트 생성
    • step5. 자주 λ‚˜μ˜€λŠ” 500개의 λ‹¨μ–΄λ‘œ μ›Œλ“œ ν΄λΌμš°λ“œ 생성

상세 λ‚΄μš©_긍/λΆ€μ •μ–΄ λΆ„λ₯˜ λͺ¨λΈ(ML)

전체 μ½”λ“œ λ‚΄μš©μ€ html 파일, pdf둜 확인 κ°€λŠ₯

1. μ£Όμ†Œ, λŒ“κΈ€, 별점 크둀링

def step1_get_detail_url() :
    # 접속할 νŽ˜μ΄μ§€μ˜ μ£Όμ†Œ 넀이버 μ˜ν™” 메인 νŽ˜μ΄μ§€
    site = 'https://movie.naver.com/movie/running/current.nhn?order=reserve'

    # requestsλ₯Ό μ΄μš©ν•΄ ν•΄λ‹Ή URL에 μ ‘μ†ν•œλ‹€
    response = requests.get(site)   

    # μ˜ν™” νŽ˜μ΄μ§€λ₯Ό ν¬λ‘€λ§ν•œλ‹€
    bs = BeautifulSoup(response.content, 'html.parser')

    # a νƒœκ·Έλ“€μ„ κ°€μ Έμ˜¨λ‹€.
    a_list = bs.select('.top_thumb_lst a')

    # href 속성을 κ°€μ Έμ˜¨λ‹€.
    df = pd.DataFrame()
    for idx in range(10) :       # μƒμœ„ 10개만 κ°€μ Έμ˜€κΈ°
        href = a_list[idx].get('href')
        
        # κ°€μ Έμ˜¨ href μ†μ„±μ˜ μ£Όμ†Œλ₯Ό λΆ„μ„ν•œ 객체λ₯Ό μƒμ„±ν•œλ‹€.
        a1 = parse.urlparse(href)
        
        # μ£Όμ†Œλ₯Ό λΆ„μ„ν•œ κ°μ²΄μ„œ 쿼리 μŠ€νŠΈλ§μ„ κ°€μ Έμ˜¨λ‹€(? 이후)
        query_str = parse.parse_qs(a1.query)
        
        # μΆ”μΆœν•œ 쿼리슀트링 λ°μ΄ν„°μ—μ„œ μ›ν•˜λŠ” νŒŒλΌλ―Έν„° 데이터λ₯Ό μΆ”μΆœν•œλ‹€.
        code = query_str['code'][0]
        print(code)

        df = df.append([[code]], ignore_index=True)

    df.columns = ['code'] #μΆ”μΆœν•œ 10개 μ˜ν™” μ½”λ“œλ₯Ό μ €μž₯ν•œλ‹€.
    df.to_csv('movie_code_list.csv', index=False, encoding='utf-8-sig') #μ½”λ“œλ₯Ό CSV둜 μ €μž₯
    print('μ£Όμ†Œ μ €μž₯ μ™„λ£Œ')
step1_get_detail_url()

2. 평점 μ „μ²˜λ¦¬

  • λŒ€λΆ€λΆ„ 평점을 ν›„ν•˜κ²Œ μ£ΌλŠ” κ²½ν–₯있고, 평점 평균이 μš°μΈ‘μ— 편ν–₯λ˜μ–΄ μžˆμ–΄μ„œ 7점을 κΈ°μ€€μœΌλ‘œ 뢀정적 리뷰, 긍정적 리뷰둜 νŒλ‹¨
# 140μžν‰ 데이터 μ „μ²˜λ¦¬ ν•¨μˆ˜
def text_preprocessing(text) :
    if text.startswith('κ΄€λžŒκ°') :
        return text[3:]
    else :
        return text
    
# 평점 μ „μ²˜λ¦¬ ν•¨μˆ˜
def star_preprocessing(text) :
    value = int(text)

    if value <= 7 :
        return '0'
    else :
        return '1'

3. λͺ¨λΈ ν•™μŠ΅

  • 70%λŠ” ν•™μŠ΅, 30%λŠ” test data둜 λ‚˜λˆˆλ‹€.
def step4_data_preprocessing() :
    # μˆ˜μ§‘ν•œ 데이터λ₯Ό μ½μ–΄μ˜¨λ‹€.
    df = pd.read_csv('star_score.csv')

    # μ „μ²˜λ¦¬λ₯Ό μˆ˜ν–‰ν•œλ‹€.
    df['text'] = df['text'].apply(text_preprocessing)
    df['score'] = df['score'].apply(star_preprocessing)

    # λ…λ¦½λ³€μˆ˜, μ’…μ†λ³€μˆ˜
    text_list = df['text'].tolist()
    star_list = df['score'].tolist()

    from sklearn.model_selection import train_test_split

    # 70%λŠ” ν•™μŠ΅, 30%λŠ” test
    text_train, text_test, star_train, star_test = train_test_split(text_list, star_list, test_size=0.3, random_state=0)

    return text_train, text_test, star_train, star_test

4. ν˜•νƒœμ†Œ 뢄석

# ν˜•νƒœμ†Œ 뢄석을 μœ„ν•œ ν•¨μˆ˜
def tokenizer(text) :
    okt = Okt() # ν•œκ΅­μ–΄ μžμ—°μ–΄ 처리 라이브러리
    return okt.morphs(text)

5. ML

  • tfidf : 전체 λ¬Έμ„œ λ‚΄ νŠΉμ • λ‹¨μ–΄μ˜ λΉˆλ„μˆ˜λ₯Ό κ³„μ‚°ν•˜μ—¬ 벑터화
  • logistic : μ„ ν˜• νšŒκ·€ 뢄석
def step5_learning(X_train, y_train, X_test, y_test):
    # 주어진 데이터λ₯Ό 단어 μ‚¬μ „μœΌλ‘œ λ§Œλ“€κ³  각 λ‹¨μ–΄μ˜ λΉˆλ„μˆ˜λ₯Ό κ³„μ‚°ν•œ ν›„ 벑터화 ν•˜λŠ” 객체 생성
    tfidf = TfidfVectorizer(lowercase=False, tokenizer=tokenizer) 

    # λ¬Έμž₯별 λ‚˜μ˜€λŠ” λ‹¨μ–΄μˆ˜ μ„Έμ„œ μˆ˜μΉ˜ν™”, λ²‘ν„°ν™”ν•΄μ„œ ν•™μŠ΅μ„ μ‹œν‚¨λ‹€. νšŒκ·€λΆ„μ„ 이용
    logistic = LogisticRegression(C=10.0, penalty='l2', random_state=0)

    pipe = Pipeline([('vect', tfidf), ('clf', logistic)])

    # ν•™μŠ΅ν•œλ‹€.
    pipe.fit(X_train, y_train)

    # ν•™μŠ΅ 정확도 μΈ‘μ •
    y_pred = pipe.predict(X_test)
    print(accuracy_score(y_test, y_pred))

    # ν•™μŠ΅λœ λͺ¨λΈμ„ μ €μž₯ν•œλ‹€.
    with open('pipe.dat', 'wb') as fp :
        pickle.dump(pipe, fp)
        
    print('μ €μž₯μ™„λ£Œ')

6. κ²°κ³Ό

  • μ‚¬μš©μžκ°€ μž…λ ₯ν•œ ν…μŠ€νŠΈκ°€ 긍정인지 뢀정인지 λΆ„λ₯˜ν•˜κ³ , 뢄석 정확도λ₯Ό 좜λ ₯ν•œλ‹€.
  • μž₯점 : 'λ…ΈμžΌ' κ³Ό 같이 은어, μ€„μž„λ§, μœ ν–‰μ–΄λ„ 무리 없이 뢄석이 κ°€λŠ₯ν•˜λ‹€
  • 단점 : '곡짜둜 볼수 μžˆμ–΄μ„œ λ΄„~~' λŒ“κΈ€ 같은 경우 λͺ…λ°±ν•œ λΆ€μ •μ–΄κ°€ 없이 '재미' λΌλŠ” 긍정어가 ν¬ν•¨λ˜μ–΄ μžˆμ–΄μ„œ λΆ€μ • λ¦¬λ·°μž„μ—λ„ κΈμ •μœΌλ‘œ νŒλ‹¨λ˜μ—ˆλ‹€. λ¬Έλ§₯의 의미λ₯Ό νŒŒμ•…ν•˜λŠ” 것은 μ•„λ‹ˆμ—ˆκΈ°μ— λΆ€μ •ν™•ν•œ κ²°κ³Όκ°€ λ‚˜μ™”λ‹€.

image-20210619172324547

상세 λ‚΄μš©_긍/λΆ€μ •μ–΄ μ›Œλ“œν΄λΌμš°λ“œ(μ‹œκ°ν™”)

전체 μ½”λ“œ λ‚΄μš©μ€ html 파일, pdf둜 확인 κ°€λŠ₯

1. μŠ€μ½”μ–΄ κΈ°μ€€ 긍/λΆ€μ • 라벨링

  • 보닀 μ •ν™•ν•œ κ²°κ³Όλ₯Ό 톡해 μ• λ§€ν•œ μ μˆ˜λŠ” λΆ„λ₯˜ λŒ€μƒμ—μ„œ μ œμ™Έ
df1=df[df.score<5] #0~4점은 λΆ€μ •
df2=df[df.score>7] #8~10점은 긍정

image-20210619173007630

2. ν˜•νƒœμ†Œ 뢄석, λ“±μž₯ 횟수 μƒμœ„ 50개 λͺ…사 μΆ”μΆœ

pos= ''

for each_line in df2[:4000]:
    pos = pos + each_line + '\n'
     
tokens_pos = t.nouns(pos) #ν˜•νƒœμ†Œ 뢄석 Okt
tokens_pos[0:10]

po = nltk.Text(tokens_pos, name='μ˜ν™”')
print(len(po.tokens))
print(len(set(po.tokens)))

pos_data=po.vocab().most_common(50) # 졜빈 단어
pos_data

plt.figure(figsize=(15,6))
po.plot(50)
plt.show() #긍정 λ¦¬λ·°μ—μ„œ 많이 λ‚˜μ˜€λŠ” 단어

image-20210619173343793

3. 졜빈 단어 500개둜 μ›Œλ“œν΄λΌμš°λ“œ μ‹œκ°ν™”

  • μ›ν•˜λŠ” μ΄λ―Έμ§€μ˜ λͺ¨μ–‘λŒ€λ‘œ μ›Œλ“œ ν΄λΌμš°λ“œ 생성 κ°€λŠ₯
  • 폰트 및 색상도 μ»€μŠ€ν…€ κ°€λŠ₯
mask = np.array(Image.open('popcorn.png'))
from wordcloud import ImageColorGenerator
image_colors = ImageColorGenerator(mask)

image_colors

pos_data = pos.vocab().most_common(500)
# for win : font_path='c:/Windows/Fonts/malgun.ttf'
wordcloud = WordCloud(font_path='c:/Windows/Fonts/jalnan.ttf',
               relative_scaling = 0.1, mask=mask,
               background_color = 'white',
               min_font_size=1,
               max_font_size=100).generate_from_frequencies(dict(pos_data))

default_colors = wordcloud.to_array()

plt.figure(figsize=(12,12))
plt.imshow(wordcloud.recolor(color_func=image_colors), interpolation='bilinear')
plt.axis('off')
plt.show() #긍정 μ›Œλ“œν΄λΌμš°λ“œ
  • 긍정어 μ›Œλ“œ ν΄λΌμš°λ“œ κ²°κ³Ό

image-20210619173636135

  • λΆ€μ •μ–΄ μ›Œλ“œ ν΄λΌμš°λ“œ κ²°κ³Ό

image-20210619174000174

결둠 및 배운점

  • μ˜ν™” λŒ“κΈ€ λ°μ΄ν„°λ‘œ 뢄석을 ν•΄μ„œ, μ˜ν™” λŒ“κΈ€μ΄ μ•„λ‹Œ λ‹€λ₯Έ λ°μ΄ν„°μ˜ 감정 λΆ„μ„μ—λŠ” λΆ€μ‘±ν•œ ν•œκ³„μ μ΄ μžˆλ‹€.
  • ν•˜μ§€λ§Œ μ˜ν™” 데이터 처럼 νŠΉμ • 기쀀에 μ˜ν•΄ 긍뢀정을 λͺ…ν™•νžˆ λ‚˜λˆŒμˆ˜ μžˆλ‹€λ©΄ λͺ¨λΈ ν•™μŠ΅μ— ν™œμš©μ΄ κ°€λŠ₯ν•  κ²ƒμœΌλ‘œ μƒκ°λœλ‹€.(μ˜ν™”μ—μ„œλŠ” 별점)
  • λ˜ν•œ 긍정, 뢀정어에 자주 λ“±μž₯ν•˜λŠ” 단어λ₯Ό 톡해 ν–₯ν›„ μ˜ν™”λ₯Ό μ œμž‘ν•  λ•Œ μ°Έκ³ ν•˜κ±°λ‚˜ λ§ˆμΌ€νŒ… 및 ν”„λ‘œλͺ¨μ…˜μ„ μ°Έκ³ ν•  λ•Œ μ†Œκ΅¬ 포인트둜 μ‚¬μš©ν•˜λ©΄ 쒋을 것 κ°™λ‹€. λ°˜λ©΄μ— λΆ€μ •μ–΄λ‘œ 자주 λ“±μž₯ν•˜λŠ” 단어듀은 κ·Έ μš”μ†Œλ“€μ„ μ§€μ–‘ν•˜λ©° μ˜ν™”λ₯Ό μ œμž‘ν•˜λŠ” 것도 도움이 될 것 κ°™λ‹€.
  • 크둀링, μ„ ν˜•νšŒκ·€ 뢄석, μžμ—°μ–΄ 처리, ν˜•νƒœμ†Œ 뢄석에 λŒ€ν•œ μ „λ°˜μ μΈ 이해λ₯Ό κ°€μ§€κ²Œ λ˜μ—ˆλ‹€.
  • λŒ“κΈ€ λΆ„μ„μ—μ„œ λͺ…사λ₯Ό μΆ”μΆœν•˜λŠ”κ²ƒμ΄ μ •ν™•ν•  것이라고 νŒλ‹¨ν•˜μ˜€μ§€λ§Œ, μ‹€μ œ λŒ“κΈ€μ„ μ‚΄νŽ΄λ³΄λ‹ˆ μ‚¬μš©μžμ˜ μ‹€μ œ 감정과 κ΄€λ ¨λœ ν˜•νƒœμ†ŒλŠ” λ™μ‚¬λ‚˜, ν˜•μš©μ‚¬λΌλŠ” 것을 μ•Œκ²Œ λ˜μ—ˆλ‹€.
  • λ‹€μŒ κ°μ„±λΆ„μ„μ—μ„œλŠ” 동사, ν˜•μš©μ‚¬ μœ„μ£Όλ‘œ 데이터λ₯Ό μΆ”μΆœν•˜λŠ” 것이 쒋을 것 κ°™λ‹€.
  • ν•œκ³„μ μœΌλ‘œλŠ”, 일반 μ‚¬μš©μžκ°€ μž…λ ₯ν•˜λ‹€λ³΄λ‹ˆ μ˜€νƒ€λ‚˜ μΆ•μ•½μ–΄λŠ” ν˜•νƒœμ†Œ 뢄석이 λΆˆκ°€ ν•˜λ‹€λŠ” 것이닀. ML으둜 긍정뢀정어 λΆ„λ₯˜λŠ” κ°€λŠ₯ν•˜μ§€λ§Œ ν˜•νƒœμ†Œ 뢄석에 걸리지 μ•Šμ•„ λˆ„λ½λ˜λŠ” 데이터가 생긴닀.
  • ν•œκ΅­μ–΄ 긍뢀정 단어 사전이 μžˆλ‹€λ©΄ 정확도가 높을 것 κ°™λ‹€.

2019_nims's People

Contributors

parkjisu6239 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.