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μΌλ‘ κΈμ λΆμ μ΄ λΆλ₯λ κ°λ₯νμ§λ§ ννμ λΆμμ κ±Έλ¦¬μ§ μμ λλ½λλ λ°μ΄ν°κ° μκΈ΄λ€.
- νκ΅μ΄ κΈλΆμ λ¨μ΄ μ¬μ μ΄ μλ€λ©΄ μ νλκ° λμ κ² κ°λ€.