top of page

​최종 데모 영상 

Term_Project

Term_Project

시청하기

[Theme] 일기 오피니언 마이닝을 통한 ​맞춤 영화 추천 

 최종 데모 Source Code

 ​일기 표본 맞춤 감정 추출, 추출한 감정을 바탕으로 영화 추천 (R code 미게시)

Intro

 A Proposal for 'Term_project'

Midterm report

   중간 데모 ppt

중간 데모 Source Code

from bs4 import BeautifulSoup
import xml
from urllib.request import urlopen

url = input("Input URL: ")
webpage = urlopen(url)

soup = BeautifulSoup(webpage, 'html5lib')


#dictionary(장르, 국가, 개봉일)

movie_info = soup.find('div', {'class':'article'})

title = movie_info.find("h3",{'class':'h_movie'}).a.text


locals()[title]=dict()
title_a=locals()[title]


genre = movie_info.find('dl',{'class':'info_spec'})
genres = genre.find_all('span')

for u in genres:
    for p in u.find_all('a'):
        inf_text=p.text.strip()
        if 'genre' in str(p):
            if '장르' in title_a:
                orig_inf=title_a.get('장르')
                title_a['장르']= [orig_inf,inf_text]      
            else:
                title_a['장르']= inf_text

        elif 'nation' in str(p):
            if '국가' in title_a:
                orig_inf=title_a.get('국가')
                title_a['국가']= [orig_inf,inf_text]
            else:
                title_a['국가']= inf_text
        elif 'open' in str(p):
            if '개봉일' in title_a:
                orig_inf =title_a.get('개봉일')
                rel_day=orig_inf+inf_text
                title_a['개봉일']=rel_day
            else:
                title_a['개봉일']=inf_text

print(title_a)

#개봉전평점

star=soup.find('div',{'class':"sc_area b_star"})
stars = star.find('div',{'class':"star_score"})
star_score = stars.find_all('em')

bef_score = ''

for score in star_score:
    bef_score +=score.get_text()

title_a['개봉전평점']=float(bef_score)
print(title_a)

#네티즌평점

netz=soup.find('div',{'class':"score score_left"})
netzs=netz.find('div',{'class':"star_score"})
netz_starscore = netzs.find_all('em')

netz_score=''
for score in netz_starscore:
    netz_score +=score.get_text()

title_a['네티즌평점']=float(netz_score)
print(title_a)


#기자평론가평점

jou_star = soup.find('div',{'class':'spc_score_area'})
jou_stars = jou_star.find('div',{'class':"star_score"})
jou_starscore = jou_stars.find_all('em')

jou_score=''
for score in jou_starscore:
    jou_score +=score.get_text()

title_a['기자평론가평점']=float(jou_score)

print('-'*30)
print(title)

Read Excel                                   web Crawling(오류  수정 전)

Final report

최종 데모 ppt

[주제 변경]
영화 관객수 예측 -> 일기 오피니언 마이닝을 통한 맞춤 영화 추천

import pandas as pd
import xlrd
from bs4 import BeautifulSoup
import xml
from urllib.request import urlopen
import html5lib
from selenium import webdriver
import itertools
import csv
from konlpy.tag import Kkma
from konlpy.utils import pprint
import pickle
kkma = Kkma()

f = open('live.csv', 'r', encoding='utf-8')
a = []
rdr = csv.reader(f)
for line in rdr:
    if line[0] == '':
        continue
    else:
        b = line[0]
        c= kkma.pos(b)
        a.append(c)
f.close()

NNG = []
VV = []
VA = []
for ones in a:
    for subones in ones:
        if subones[1] == 'NNG':
            NNG.append(subones[0])
        elif subones[1] == 'VV':
            VV.append(subones[0])
        elif subones[1] == 'VA':
            VA.append(subones[0])

joy = ['좋', '재밌', '신나', '기쁘', '짱짱이', '설레']
anger = ['화나', '과제', '핵폭발', '자퇴', '짜증나', '그지']
love = ['설레']
sadness = ['슬프', '인생', '아프', '어지럽', '우울증', '우울']
lethargy = ['지치', '힘들', '아프', '어지럽', '우울증', '우울']

num1 = 0
num2 = 0
num3 = 0
num4 = 0
num5 = 0

for word in NNG:
    if word in joy:
        num1 += 1
    elif word in anger:
        num2 += 1
    elif word in love:
        num3 += 1
    elif word in sadness:
        num4 += 1
    elif word in lethargy:
        num5 += 1

for word in VV:
    if word in joy:
        num1 += 1
    elif word in anger:
        num2 += 1
    elif word in love:
        num3 += 1
    elif word in sadness:
        num4 += 1
    elif word in lethargy:
        num5 += 1

for word in VA:
    if word in joy:
        num1 += 1
    elif word in anger:
        num2 += 1
    elif word in love:
        num3 += 1
    elif word in sadness:
        num4 += 1
    elif word in lethargy:
        num5 += 1

feeling = {}
feeling['joy'] = num1
feeling['anger'] = num2
feeling['love'] = num3
feeling['sadness'] = num4
feeling['lethargy'] = num5
maximum = max(feeling, key=feeling.get)
print(maximum)

filename = '/Users/lydiachung/Desktop/Term_Project/movie_excel.xlsx'

workbook = xlrd.open_workbook(filename)
sheet_names = workbook.sheet_names()
sheet = workbook.sheet_by_name(sheet_names[0])
sheet = workbook.sheet_by_index(0)
row = sheet.row(0)

movie = []

from xlrd.sheet import ctype_text

for idx, cell_obj in enumerate(row) :
    num_cols = sheet.ncols
    for row_idx in range(3, sheet.nrows) :
        xxtitle = sheet.cell(row_idx, 1)
        if str(xxtitle)[0] == 'e' :
                break
        xtitle = str(xxtitle)[6:-1]
        a = xtitle.split()
        title = ''
        for i in range(0, len(a)) :
            title = title + a[i]
        locals()[title] = dict()
        b = locals()[title]
        
        for col_idx in range(3, num_cols) :
            genre = sheet.cell(2, 15).value
            b[genre] = sheet.cell(row_idx, 15).value
            view = sheet.cell(2, 12).value
            b[view] = sheet.cell(row_idx, 12).value
            rating = sheet.cell(2, 16).value
            ratenum = sheet.cell(row_idx, 16).value
            if ratenum == '12세이상관람가':
                ratenum = 12
            elif ratenum == '15세이상관람가':
                ratenum = 15
            elif ratenum == '전체관람가':
                ratenum = 0
            elif ratenum == '청소년관람불가':
                ratenum = 19
            b[rating] = ratenum
        movie.append(b)

        

likes = input("Input movie names: ")
likeslist = likes.split()
age = int(input('Input your international age: '))

suggenres = {}
avg = 0

chrome_path = r'/Users/lydiachung/Desktop/Term_Project/chromedriver'
driver = webdriver.Chrome(chrome_path)
website = 'http://www.google.com/?#q='

for moviename in likeslist: 
    driver.get(website+'네이버 영화'+moviename)
    driver.find_element_by_xpath('''//*[@id="rso"]/div/div/div[1]/div/div/h3/a''').click()
    target_url = driver.current_url
    webpage = urlopen(target_url)

    soup = BeautifulSoup(webpage, 'html5lib')

    movie_info = soup.find('div', {'class':'article'})

    title_bf = movie_info.find("h3",{'class':'h_movie'}).a.text
    bf= title_bf.split()
    title=''
    for i in range(0,len(bf)):
        title = title + bf[i]

    locals()[title]=dict()

    title_a=locals()[title]

    genre = movie_info.find('dl',{'class':'info_spec'})
    genres = genre.find_all('span')

    for u in genres:
        for p in u.find_all('a'):
            inf_text=p.text.strip()
            if 'genre' in str(p):
                if '장르' in title_a:
                    orig_inf=title_a.get('장르')
                    emp=[]
                    for s in orig_inf:
                            emp.append(s)
                    emp.append(inf_text)
                    title_a['장르']=emp
                else:
                    title_a['장르']= [inf_text]

    for name in title_a['장르'] :
        if name in suggenres:
            suggenres[name] += 1
            avg += 1
        else :
            suggenres[name] = 1

driver.close()

print(suggenres)

feel = maximum

def feel_like(feel, file):
    joy= {'액션':1, '어드벤쳐':1, '사극':1, '스릴러':1, '애니메이션':1, '드라마':1,'범죄':1,'공포':1,'코미디':1,'멜로/로맨스':1,'판타지':1, 'SF':1, '전쟁':1, '미스터리':1}
    anger= {'액션':3, '어드벤쳐':2, '사극':-1, '스릴러':3, '애니메이션':-2, '드라마':1,'범죄':2,'공포':3,'코미디':2,'멜로/로맨스':0,'판타지':0, 'SF':-1, '전쟁':1, '미스터리':-1}
    love= {'액션':2, '어드벤쳐':1, '사극':1, '스릴러':1, '애니메이션':1, '드라마':2,'범죄':1,'공포':2, '코미디':2,'멜로/로맨스':3, '판타지':1,  'SF':1, '전쟁':1, '미스터리':1}
    sadness= {'액션':1, '어드벤쳐':1, '사극':1, '스릴러':-1, '애니메이션':1, '드라마': 2, '범죄':-1, '공포':-2, '코미디':3, '멜로/로맨스':1, '판타지':1, 'SF':0, '전쟁':-1, '미스터리':-2}
    lethargy= {'액션':2, '어드벤쳐':2, '사극':0, '스릴러':2, '애니메이션':0, '드라마': -1, '범죄':0, '공포':-2, '코미디':3, '멜로/로맨스':2, '판타지':3, 'SF':0, '전쟁':-1, '미스터리':-2}
    locals()[feel] = dict()
    feeldict = locals()[feel]
    for key in file:
        for key2 in feeldict:
            if key == key2:
                file[key] += feeldict[key]
                
    return file

print(feel_like(feel, suggenres))

suggestion = []

groups = itertools.groupby(suggenres.values())
next(groups, None)
if next(groups, None) is None:
    for name in movie :
        for key in suggenres :
            if name['장르'] == key:
                num = movie.index(name)
                real = sheet.cell(num+3, 1).value
                rate = name['등급']
                if age >= rate :
                    if real in suggestion:
                        break
                    else:
                        suggestion.append(real)
                else:
                    continue

else:
    maximum = max(suggenres, key=suggenres.get)
    for name in movie:
        if name['장르'] == maximum:
            num = movie.index(name)
            real = sheet.cell(num+3, 1).value
            rate = name['등급']
            if age >= rate :
                if real in suggestion:
                    break
                else:
                    suggestion.append(real)
            else:
                continue
            
for like in likeslist:
    if like in suggestion:
        suggestion.remove(like)

print(suggestion)

fav = input('Input movies that interest you: ')
favlist = fav.split()
chrome_path = r'/Users/lydiachung/Desktop/Term_Project/chromedriver'
driver = webdriver.Chrome(chrome_path)
website = 'http://www.google.com/?#q='

for moviename in favlist: 
    driver.get(website+'네이버 영화 '+moviename)
    driver.find_element_by_xpath('''//*[@id="rso"]/div/div/div[1]/div/div/h3/a''').click()
    element1 = driver.find_element_by_xpath('''//*[@id="content"]/div[1]/div[2]/div[1]/h3/a''')
    element2 = driver.find_element_by_xpath('''//*[@id="content"]/div[1]/div[4]/div[1]/div/div/p''')
    title = element1.text
    summary = element2.text
    up = '-'*10+title+'-'*10
    print(up)
    print(summary)
    print('-'*len(up))

driver.close()

Term_Project​를 마치며

  전공에서의 첫 프로젝트를 통해 이 분야에서 하게 될 다양한 프로젝트들이 어떻게 진행되는가를 맛보기로 경험할 수 있었다. 또한 정말로 내가 '소프트웨어융합학과' 소속 임을 절실히 실감했다. 

 우리 팀은 초반에 머신러닝을 통한 '영화 관객수 예측'을 목표로 프로젝트를 진행하였다. 그러나 머신러닝이라는 생소한 분야를 배우고 실제 프로젝트에 적용시키기엔 시간과 숙달에 있어 어려움이 있었다. 그래서 중간 데모 이후, 아쉽지만 처음의 주제를 포기하고 다른 주제를 찾고자 하였고 중간데모까지 우리가 했던 엑셀이나 웹크롤링을 활용할 수 있는 새로운 주제를 찾아 프로젝트를 마무리하였다.

 프로젝트는 기한이 정해진 작업이기에 반드시 기한 내에 실현이 가능할 수 있는 주제를 잡는 것이 중요하다는 것을 느꼈다. 또한 접해보지 않은 언어를 이용해야할 땐, 반드시 충분한 시간을 들여 연습해야 함도 느꼈다. 제출 기한까지 한 달도 채 남지 않은 때에 그 동안 했던 프로젝트를 포기하고 새로운 주제로 진행하였기에 완벽한 결과를 내기엔 시간이 충분하지 못했다. 그러나 동기들과 며칠 밤을 새우며 함께 노력하고 각자가 맡은 부분 뿐 아니라 다른 팀원의 어려움도 도와주며 협력하였기에 만족할 만한 마무리를 할 수 있었던 것 같다. 프로젝트는 정말 쉽지 않고 많은 노력과 집중을 요하는 작업이지만 그렇게 많은 노력과 시간이 투자되기에 그 어떤 시험을 마쳤을 때보다도 보람있고 기쁜 것 같다. 분명 어렵고 힘들테지만 앞으로 경험하게 될 프로젝트들이 기대된다. 다양한 언어를 활용하여 세상에 도움이 될 수 있는 결과를 만드는 프로젝트를 해낼 수 있는 프로그래머가 되길 소망해본다. 

bottom of page