2019.08 / 2019 ๊ตญ๊ฐ ์๋ฆฌ๊ณผํ ์ฐ๊ตฌ์ ์ฐ์ ์ํ ์ธ๋ฏธ๋
๋ถ์ ๋ชจ๋ธ : https://bit.ly/3wFVACJ
์๊ฐํ : https://bit.ly/3vArvDf
- ๋ค์ด๋ฒ ์ํ ๋๊ธ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ์ฌ ํ ์คํธ ๊ธ์ ๋ถ์ ์์ธก ๋ชจ๋ธ ๊ฐ๋ฐ
- ๊ธ์ , ๋ถ์ ์ด๋ฅผ ํตํด ์ํ ์ ์ ๋ฐ ๋ง์ผํ ์์ ํ์ฉํ ์ฐธ๊ณ ์๋ฃ๋ก์ ํ์ฉ ๊ฐ๋ฅ
- ML
- step1. ๋ค์ด๋ฒ ์ํ ๋ฉ์ธ ํ์ด์ง(ํ์ฌ ์์์) ์์ 1~10์ ์ํ์ ์์ธํ์ด์ง ์ฃผ์ ํฌ๋กค๋ง
- step2. ์์ธํ์ด์ง์์ ํ์ ์ ๋๋ณด๊ธฐ๋ฅผ ํด๋ฆญํ์ ๋ ๋ณด์ฌ์ง๋ ํ์ด์ง ์ฃผ์ ํฌ๋กค๋ง
- step3. 140์ ํ์ 1ํ์ด์ง~๋ ํ์ด์ง ์ํํ๋ฉด์ ํ์ ๊ณผ ๋ฆฌ๋ทฐ๋ฅผ ํฌ๋กค๋ง
- step4. ํ์ต์ ์ํ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
- step5. ํ์ต. ํ์ต๋ ๋ชจ๋ธ์ ํ์ผ๋ก ์ ์ฅ
- step6. ์ ์ฅ๋ ๋ชจ๋ธ์ ๋ถ๋ฌ์ ์ฌ์ฉ
- ์๊ฐํ
- step1. ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ์ค์ฝ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ธ์ ,๋ถ์ ๋ฆฌ๋ทฐ๋ฅผ ๋๋
- step2. ๋๋์ด์ง ๋ฆฌ๋ทฐ๋ฐ์ดํฐ๋ฅผ ํํ์ ๋ถ์ํ์ฌ ๋ช ์ฌ๋ฅผ ํ ํฐํํ๋ค.
- step3. ํ ํฐํ ๋ ๋ช ์ฌ์ค์์ ์์ฃผ ๋์ค๋ 50๊ฐ์ ๋จ์ด๋ฅผ ํ์ธ
- step4. ํด๋น ๋จ์ด์ ๋น๋์๋ฅผ ํํํ๋ ์ฐจํธ ์์ฑ
- step5. ์์ฃผ ๋์ค๋ 500๊ฐ์ ๋จ์ด๋ก ์๋ ํด๋ผ์ฐ๋ ์์ฑ
์ ์ฒด ์ฝ๋ ๋ด์ฉ์ html ํ์ผ, pdf๋ก ํ์ธ ๊ฐ๋ฅ
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()
- ๋๋ถ๋ถ ํ์ ์ ํํ๊ฒ ์ฃผ๋ ๊ฒฝํฅ์๊ณ , ํ์ ํ๊ท ์ด ์ฐ์ธก์ ํธํฅ๋์ด ์์ด์ 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'
- 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
# ํํ์ ๋ถ์์ ์ํ ํจ์
def tokenizer(text) :
okt = Okt() # ํ๊ตญ์ด ์์ฐ์ด ์ฒ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
return okt.morphs(text)
- 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('์ ์ฅ์๋ฃ')
- ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ํ ์คํธ๊ฐ ๊ธ์ ์ธ์ง ๋ถ์ ์ธ์ง ๋ถ๋ฅํ๊ณ , ๋ถ์ ์ ํ๋๋ฅผ ์ถ๋ ฅํ๋ค.
- ์ฅ์ : '๋ ธ์ผ' ๊ณผ ๊ฐ์ด ์์ด, ์ค์๋ง, ์ ํ์ด๋ ๋ฌด๋ฆฌ ์์ด ๋ถ์์ด ๊ฐ๋ฅํ๋ค
- ๋จ์ : '๊ณต์ง๋ก ๋ณผ์ ์์ด์ ๋ด~~' ๋๊ธ ๊ฐ์ ๊ฒฝ์ฐ ๋ช ๋ฐฑํ ๋ถ์ ์ด๊ฐ ์์ด '์ฌ๋ฏธ' ๋ผ๋ ๊ธ์ ์ด๊ฐ ํฌํจ๋์ด ์์ด์ ๋ถ์ ๋ฆฌ๋ทฐ์์๋ ๊ธ์ ์ผ๋ก ํ๋จ๋์๋ค. ๋ฌธ๋งฅ์ ์๋ฏธ๋ฅผ ํ์ ํ๋ ๊ฒ์ ์๋์๊ธฐ์ ๋ถ์ ํํ ๊ฒฐ๊ณผ๊ฐ ๋์๋ค.
์ ์ฒด ์ฝ๋ ๋ด์ฉ์ html ํ์ผ, pdf๋ก ํ์ธ ๊ฐ๋ฅ
- ๋ณด๋ค ์ ํํ ๊ฒฐ๊ณผ๋ฅผ ํตํด ์ ๋งคํ ์ ์๋ ๋ถ๋ฅ ๋์์์ ์ ์ธ
df1=df[df.score<5] #0~4์ ์ ๋ถ์
df2=df[df.score>7] #8~10์ ์ ๊ธ์
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() #๊ธ์ ๋ฆฌ๋ทฐ์์ ๋ง์ด ๋์ค๋ ๋จ์ด
- ์ํ๋ ์ด๋ฏธ์ง์ ๋ชจ์๋๋ก ์๋ ํด๋ผ์ฐ๋ ์์ฑ ๊ฐ๋ฅ
- ํฐํธ ๋ฐ ์์๋ ์ปค์คํ ๊ฐ๋ฅ
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() #๊ธ์ ์๋ํด๋ผ์ฐ๋
- ๊ธ์ ์ด ์๋ ํด๋ผ์ฐ๋ ๊ฒฐ๊ณผ
- ๋ถ์ ์ด ์๋ ํด๋ผ์ฐ๋ ๊ฒฐ๊ณผ
- ์ํ ๋๊ธ ๋ฐ์ดํฐ๋ก ๋ถ์์ ํด์, ์ํ ๋๊ธ์ด ์๋ ๋ค๋ฅธ ๋ฐ์ดํฐ์ ๊ฐ์ ๋ถ์์๋ ๋ถ์กฑํ ํ๊ณ์ ์ด ์๋ค.
- ํ์ง๋ง ์ํ ๋ฐ์ดํฐ ์ฒ๋ผ ํน์ ๊ธฐ์ค์ ์ํด ๊ธ๋ถ์ ์ ๋ช ํํ ๋๋์ ์๋ค๋ฉด ๋ชจ๋ธ ํ์ต์ ํ์ฉ์ด ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ์๊ฐ๋๋ค.(์ํ์์๋ ๋ณ์ )
- ๋ํ ๊ธ์ , ๋ถ์ ์ด์ ์์ฃผ ๋ฑ์ฅํ๋ ๋จ์ด๋ฅผ ํตํด ํฅํ ์ํ๋ฅผ ์ ์ํ ๋ ์ฐธ๊ณ ํ๊ฑฐ๋ ๋ง์ผํ ๋ฐ ํ๋ก๋ชจ์ ์ ์ฐธ๊ณ ํ ๋ ์๊ตฌ ํฌ์ธํธ๋ก ์ฌ์ฉํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค. ๋ฐ๋ฉด์ ๋ถ์ ์ด๋ก ์์ฃผ ๋ฑ์ฅํ๋ ๋จ์ด๋ค์ ๊ทธ ์์๋ค์ ์ง์ํ๋ฉฐ ์ํ๋ฅผ ์ ์ํ๋ ๊ฒ๋ ๋์์ด ๋ ๊ฒ ๊ฐ๋ค.
- ํฌ๋กค๋ง, ์ ํํ๊ท ๋ถ์, ์์ฐ์ด ์ฒ๋ฆฌ, ํํ์ ๋ถ์์ ๋ํ ์ ๋ฐ์ ์ธ ์ดํด๋ฅผ ๊ฐ์ง๊ฒ ๋์๋ค.
- ๋๊ธ ๋ถ์์์ ๋ช ์ฌ๋ฅผ ์ถ์ถํ๋๊ฒ์ด ์ ํํ ๊ฒ์ด๋ผ๊ณ ํ๋จํ์์ง๋ง, ์ค์ ๋๊ธ์ ์ดํด๋ณด๋ ์ฌ์ฉ์์ ์ค์ ๊ฐ์ ๊ณผ ๊ด๋ จ๋ ํํ์๋ ๋์ฌ๋, ํ์ฉ์ฌ๋ผ๋ ๊ฒ์ ์๊ฒ ๋์๋ค.
- ๋ค์ ๊ฐ์ฑ๋ถ์์์๋ ๋์ฌ, ํ์ฉ์ฌ ์์ฃผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ๋ค.
- ํ๊ณ์ ์ผ๋ก๋, ์ผ๋ฐ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ๋ค๋ณด๋ ์คํ๋ ์ถ์ฝ์ด๋ ํํ์ ๋ถ์์ด ๋ถ๊ฐ ํ๋ค๋ ๊ฒ์ด๋ค. ML์ผ๋ก ๊ธ์ ๋ถ์ ์ด ๋ถ๋ฅ๋ ๊ฐ๋ฅํ์ง๋ง ํํ์ ๋ถ์์ ๊ฑธ๋ฆฌ์ง ์์ ๋๋ฝ๋๋ ๋ฐ์ดํฐ๊ฐ ์๊ธด๋ค.
- ํ๊ตญ์ด ๊ธ๋ถ์ ๋จ์ด ์ฌ์ ์ด ์๋ค๋ฉด ์ ํ๋๊ฐ ๋์ ๊ฒ ๊ฐ๋ค.