728x90
๋ฐ์ํ
ํ๋ก๊ทธ๋๋ฐ ์ธ๊ณ๋ฅผ ํ๊ตฌํฉ์๋ค.
1 ,2, 3ํธ์ ์ด์ ๊ฒ์๊ธ ์ฐธ๊ณ ๋ฐ๋๋๋ค.
2023.12.08 - [IT/Python] - [Python] 1. Daum ๋ค์ ์ํ ์ฌ์ดํธ ๋ฐ์ดํฐ ์์ง ์นํฌ๋กค๋ง
< Daum ๋ค์ ์ํ ์ฌ์ดํธ ๋ฐ์ดํฐ ์์ง ์นํฌ๋กค๋ง (๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๋ฐ ์๊ฐํ) >
์์ง๋ฐ์ดํฐ
์ํ์ ๋ชฉ, ํ์ , ๋๊ธ
์์ฑํ ๋ฐ์ดํฐ
๊ธ์ /๋ถ์
URL
< ์๋ํด๋ผ์ฐ๋ ์๊ฐํ >
"""
<ํ๊ธ ํํ์ ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ : KoNLPY>
- Java ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก JDK ์ค์น ๋ฐ ํ๊ฒฝ ์ค์ ํ์
- ํ๊ฒฝ๋ณ์ ๋ฑ๋ก (์์คํ
> ๊ณ ๊ธ ์์คํ
์ค์ > ๊ณ ๊ธ > ํ๊ฒฝ ๋ณ์)
* JAVA_HOME : JDK ์ค์น ํด๋๊น์ง
* Path ์์ ํ ๋ ๊ฐ ์ถ๊ฐ : %JAVA_HOME%, %JAVA_HOME%\bin
- PC ์ฌ๋ถํ
ํ ์ค์ ํ์ธ : command ์ฐฝ open -> java, javac ์
๋ ฅ ํ help ๋ด์ฉ ๋์ค๋ฉด ์ฑ๊ณต
<๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น>
- nltk ์ค์น : ์์ด ํํ์ ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (KoNLPY์ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)
* pip install nltk
- nltk ํ๋ฌ๊ทธ์ธ ์ถ๊ฐ ์ค์น(๋ค์ด๋ก๋ ์ค์น ๋ฐฉ์)
->> ํ๋ฌ๊ทธ์ธ์ ์ต์ด ํ ๋ฒ ์ค์นํ๋ฉด ์ถํ ๋ค๋ฅธ ๊ฐ์ํ๊ฒฝ์๋ ์ ์ฉ๋จ
->> ๋ค๋ฅธ ๊ฐ์ํ๊ฒฝ์์๋ pip install nltk ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ์ค์นํ๋ฉด ๋จ
> python
> import nltk
> nltk.download()
> NLTK ์ฐฝ์ด open๋จ
> All packages ํญ ์ ํ > punkt ๋๋ธํด๋ฆญ, stopwords ๋๋ธํด๋ฆญ
> exit()
- ์๋ํด๋ผ์ฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
> pip install wordcloud
- Konlpy ์ค์น ์ ์ ํ์ด์ฌ์์ JAVA ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ธ์์ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
> pip install JPype1 (๋์๋ ์ซ์ 1์
๋๋ค.)
> pip install konlpy
- jvm.py ํ์ผ ๋ด์ ๋ณํ์(*) ์ญ์ ํ๊ธฐ
* ์์น : C:\Users\user\anaconda3\envs\gj_env_01\Lib\site-packages\konlpy
* ๋ฉ๋ชจ์ฅ์ผ๋ก jvm.py์ด๊ธฐ
* folder_suffix[] ๋ฆฌ์คํธ ๋ด์ ๋ณ(*) ํ์ ์ฐพ์์ ์ญ์ > ์ ์ฅ > ๋ซ๊ธฐ
"""
cmd - javac
NLTK Downloader
konlpy ํ ์คํธ
from konlpy.tag import Okt
okt = Okt()
okt
okt.nouns("์๋
ํ์ธ์~ ํ์ด์ฌ์
๋๋ค. ์๋
")
< ์ํ ๊ธ์ /๋ถ์ ๋ฆฌ๋ทฐ๋ฐ์ดํฐ ๋น๋๋ถ์ ๋ฐ ์๋ํด๋ผ์ฐ๋ ์๊ฐํ >
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ํ๊ธฐ
### ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ํ๊ธฐ
import pandas as pd
๋ฐ์ดํฐ์ ์ฝ์ด๋ค์ด๊ธฐ
### ๋ฐ์ดํฐ์
์ฝ์ด๋ค์ด๊ธฐ
# ๋ฐ์ดํฐํ๋ ์ ๋ณ์๋ช
: df_org
df_org = pd.read_csv("./data/df_new.csv")
df_org
< ๊ธ์ ๋ฐ ๋ถ์ ์ ๋ํด์๋ง ๊ฐ๊ฐ ๋ฐ์ดํฐ ํํฐ๋งํ๊ธฐ >
๊ธ์ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ ํํฐ๋ง
### ๊ธ์ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ ํํฐ๋ง
# - ๋ฐ์ดํฐํ๋ ์ ๋ณ์๋ช
: pos_reviews
pos_reviews = df_org[df_org["label"] == 1]
pos_reviews
๋ถ์ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ ํํฐ๋ง
### ๋ถ์ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ ํํฐ๋ง
# - ๋ฐ์ดํฐํ๋ ์ ๋ณ์๋ช
: nag_reviews
neg_reviews = df_org[df_org["label"] == 0]
neg_reviews
< ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ >
๊ธ์ ๋ฐ ๋ถ์ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ์์ ํ๊ธ ์ด์ธ ๋ชจ๋ ์ ๊ฑฐํ๊ธฐ
### ์ ๊ทํํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ฉ
import re
๊ธ์ ๋ฆฌ๋ทฐ์์ ํ๊ธ ์ด์ธ ๋ชจ๋ ์ ๊ฑฐํ๊ธฐ
### ๊ธ์ ๋ฆฌ๋ทฐ์์ ํ๊ธ ์ด์ธ ๋ชจ๋ ์ ๊ฑฐ ์ฒ๋ฆฌํ๊ธฐ
pos_reviews.loc[ : , "comment"] = [re.sub(r"[^ใฑ-ใ
ฃ๊ฐ-ํฃ+]",
" ",
data) for data in pos_reviews["comment"]]
pos_reviews
๋ถ์ ๋ฆฌ๋ทฐ์์ ํ๊ธ ์ด์ธ ๋ชจ๋ ์ ๊ฑฐํ๊ธฐ
### ๋ถ์ ๋ฆฌ๋ทฐ์์ ํ๊ธ ์ด์ธ ๋ชจ๋ ์ ๊ฑฐ ์ฒ๋ฆฌํ๊ธฐ
neg_reviews.loc[ : , "comment"] = [re.sub(r"[^ใฑ-ใ
ฃ๊ฐ-ํฃ+]",
" ",
data) for data in neg_reviews["comment"]]
neg_reviews
< ๊ธ์ ๋ฐ ๋ถ์ ๋ฆฌ๋ทฐ ํํ์ ์ถ์ถํ๊ธฐ >
### ํํ์ ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
# jpype : java ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ python์์ ์ฌ์ฉํ ์ ์๋๋ก ๋์์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
# - konlpy๋ java๋ก ๋ง๋ค์ด์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ
import jpype
# Okt : ํ๊ตญ์ด ํํ์ ๋ถ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
# - Okt(Open Korean Text) : ๋ํ์ ํ๊ธ ํํ์ ๋ถ์๊ธฐ
from konlpy.tag import Okt
ํํ์ ๋ถ์๊ธฐ ๊ฐ์ฒด ์์ฑํ๊ธฐ
### ํํ์ ๋ถ์๊ธฐ ๊ฐ์ฒด ์์ฑํ๊ธฐ
okt = Okt()
okt
๊ธ์ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ์์ -- > ๋ช ์ฌ ์ถ์ถํ๊ธฐ
### ๊ธ์ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ์์ -- > ๋ช
์ฌ ์ถ์ถํ๊ธฐ
# - ๋ช
์ฌ๋ง ๋ด์ ๋์ ๋ฆฌ์คํธ ๋ณ์ ์ ์ธ
pos_comment_nouns = []
for cmt in pos_reviews["comment"] :
# print(okt.nouns(cmt))
### extend() : ๋ฆฌ์คํธ์ ๊ฐ๋ง ์ถ์ถํ์ฌ ํ์ฅํด์ ์ถ๊ฐํ๋ ๋ฐฉ์
# - append() : ๋ฆฌ์คํธ์ ํํ(type) ์์ฒด๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ์
pos_comment_nouns.extend(okt.nouns(cmt))
print(pos_comment_nouns)
๋ถ์ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ์์ -- > ๋ช ์ฌ ์ถ์ถํ๊ธฐ
### ๋ถ์ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ์์ -- > ๋ช
์ฌ ์ถ์ถํ๊ธฐ
# - ๋ช
์ฌ๋ง ๋ด์ ๋์ ๋ฆฌ์คํธ ๋ณ์ ์ ์ธ
neg_comment_nouns = []
for cmt in neg_reviews["comment"] :
# print(okt.nouns(cmt))
### extend() : ๋ฆฌ์คํธ์ ๊ฐ๋ง ์ถ์ถํ์ฌ ํ์ฅํด์ ์ถ๊ฐํ๋ ๋ฐฉ์
# - append() : ๋ฆฌ์คํธ์ ํํ(type) ์์ฒด๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ์
neg_comment_nouns.extend(okt.nouns(cmt))
print(neg_comment_nouns)
< ๊ธ์ ๋ฐ ๋ถ์ ๋ฆฌ๋ทฐ ๋ฐ์ดํฐ์์ 1๊ธ์๋ ๋ชจ๋ ์ ์ธ ์ํค๊ธฐ >
### ๊ธ์ ๋ฆฌ๋ทฐ ๋ช
์ฌ ๋ฐ์ดํฐ์์ 1๊ธ์ ๋ชจ๋ ์ ์ธํ๊ธฐ
pos_comment_nouns2 = [w for w in pos_comment_nouns if len(w) > 1]
print(pos_comment_nouns2)
### ๋ถ์ ๋ฆฌ๋ทฐ ๋ช
์ฌ ๋ฐ์ดํฐ์์ 1๊ธ์ ๋ชจ๋ ์ ์ธํ๊ธฐ
neg_comment_nouns2 = [w for w in neg_comment_nouns if len(w) > 1]
print(neg_comment_nouns2)
< ๊ธ์ ๋ฐ ๋ถ์ ๋ช ์ฌ๋ค์ ๋น๋ ๋ถ์ >
### ๊ธ์ ๋ฆฌ๋ทฐ ๋ช
์ฌ๋ค์ ๋ํ ์๋์นด์ดํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
from collections import Counter
๊ธ์ ๋ช ์ฌ ์๋์นด์ดํธ ์ฒ๋ฆฌ
### ๊ธ์ ๋ช
์ฌ ์๋์นด์ดํธ ์ฒ๋ฆฌ
pos_word_count = Counter(pos_comment_nouns2)
print(pos_word_count)
๋ถ์ ๋ช ์ฌ ์๋์นด์ดํธ ์ฒ๋ฆฌ
### ๋ถ์ ๋ช
์ฌ ์๋์นด์ดํธ ์ฒ๋ฆฌ
neg_word_count = Counter(neg_comment_nouns2)
print(neg_word_count)
< ๊ธ์ ๋ฐ ๋ถ์ ์๋์นด์ดํธ ์์ 20๊ฐ ๋จ์ด๋ง ์ถ์ถ >
๊ธ์ -> ์๋์นด์ดํธ ์์ 20๊ฐ ๋จ์ด ์ถ์ถ
### ๊ธ์ -> ์๋์นด์ดํธ ์์ 20๊ฐ ๋จ์ด ์ถ์ถ
# - Count() -> ์ง์gksms gkatn ํจ์ ์ค์ ๋ด๋ฆผ์ฐจ์ ํจ์ : most_common(20)
# --> ๋ด๋ฆผ์ฐจ์ ํ์ ์์ 20๊ฐ ์ถ์ถํ๋ ํจ์์
pos_top_20 = {}
for k, v in pos_word_count.most_common(20):
pos_top_20[k] = v
pos_top_20 = {k:v for k, v in pos_word_count.most_common(20)}
pos_top_20
๋ถ์ -> ์๋์นด์ดํธ ์์ 20๊ฐ ๋จ์ด ์ถ์ถ
### ๋ถ์ -> ์๋์นด์ดํธ ์์ 20๊ฐ ๋จ์ด ์ถ์ถ
# - Count() -> ์ง์gksms gkatn ํจ์ ์ค์ ๋ด๋ฆผ์ฐจ์ ํจ์ : most_common(20)
# --> ๋ด๋ฆผ์ฐจ์ ํ์ ์์ 20๊ฐ ์ถ์ถํ๋ ํจ์์
neg_top_20 = {}
for k, v in neg_word_count.most_common(20):
neg_top_20[k] = v
neg_top_20 = {k:v for k, v in neg_word_count.most_common(20)}
neg_top_20
< ๊ธ์ ๋ฐ ๋ถ์ ์์ 20๊ฐ ๋ช ์ฌ์ ๋ํ ๋น๋ ์๊ฐํ >
### ์๊ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
import matplotlib.pyplot as plt
### ํฐํธ ์ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
from matplotlib import font_manager, rc
### ํฐํธ ์ค์
plt.rc("font", family="Malgun Gothic")
### ๋ง์ด๋์ค๊ธฐํธ ์ค์
plt.rcParams["axes.unicode_minus"] = False
๊ธ์ ์์ 20๊ฐ ๋ช ์ฌ์ ๋ํ ๋น๋ ์๊ฐํ ๋ง๋๊ทธ๋ํ
### ๋ง๋ ๊ทธ๋ํ๋ฅผ ์ด์ฉํ ๋น๋ ์๊ฐํ
plt.figure(figsize=(10, 5))
### ์ ๋ชฉ ๋ฃ๊ธฐ
plt.title("๊ธ์ ๋ฆฌ๋ทฐ์ ๋จ์ด ์์ (20๊ฐ) ๋น๋ ์๊ฐํ", fontsize=17)
### ๋ง๋๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
for key, value in pos_top_20.items() :
### ์ํ ๋ผ๋ ๋จ์ด๋ ์๋ฏธ๊ฐ ์์ ๊ฒ์ผ๋ก ์ฌ๊ฒจ์ง
# - ์ ์ธ ์ํค๊ธฐ
if key == "์ํ" :
continue
plt.bar(key, value, color="lightgrey")
### x์ถ๊ณผ y์ถ ์ ๋ชฉ ๋ฃ๊ธฐ
plt.xlabel("๋ฆฌ๋ทฐ ๋ช
์ฌ")
plt.ylabel("๋น๋(count)")
### x์ถ ๊ฐ๋ ์กฐ์
plt.xticks(rotation=70)
### ๊ทธ๋ํ ๋ณด์ฌ์ค~~
plt.show()
๋ถ์ ์์ 20๊ฐ ๋ช ์ฌ์ ๋ํ ๋น๋ ์๊ฐํ ๋ง๋๊ทธ๋ํ
### ๋ง๋ ๊ทธ๋ํ๋ฅผ ์ด์ฉํ ๋น๋ ์๊ฐํ
plt.figure(figsize=(10, 5))
### ์ ๋ชฉ ๋ฃ๊ธฐ
plt.title("๋ถ์ ๋ฆฌ๋ทฐ์ ๋จ์ด ์์ (20๊ฐ) ๋น๋ ์๊ฐํ", fontsize=17)
### ๋ง๋๊ทธ๋ํ ๊ทธ๋ฆฌ๊ธฐ
for key, value in neg_top_20.items() :
### ์ํ ๋ผ๋ ๋จ์ด๋ ์๋ฏธ๊ฐ ์์ ๊ฒ์ผ๋ก ์ฌ๊ฒจ์ง
# - ์ ์ธ ์ํค๊ธฐ
if key == "์ํ" :
continue
plt.bar(key, value, color="lightgrey")
### x์ถ๊ณผ y์ถ ์ ๋ชฉ ๋ฃ๊ธฐ
plt.xlabel("๋ฆฌ๋ทฐ ๋ช
์ฌ")
plt.ylabel("๋น๋(count)")
### x์ถ ๊ฐ๋ ์กฐ์
plt.xticks(rotation=70)
### ๊ทธ๋ํ ๋ณด์ฌ์ค~~
plt.show()
< ๊ธ์ ๋ฐ ๋ถ์ ๋ฆฌ๋ทฐ ๋จ์ด ์๋ํด๋ผ์ฐ๋(wordcloud) ์๊ฐํ >
### ์๋ํด๋ผ์ฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
from wordcloud import WordCloud
๊ธ์ ๋ฆฌ๋ทฐ ๋จ์ด ์๋ํด๋ผ์ฐ๋ ์๊ฐํ
### ๊ธ์ ๋ฆฌ๋ทฐ ๋จ์ด ์๋ํด๋ผ์ฐ๋ ์๊ฐํ
plt.figure(figsize=(8, 8))
### ๊ทธ๋ํ ์ ๋ชฉ
plt.title("[๊ธ์ ] ๋ฆฌ๋ทฐ ๋จ์ด ์๋ํด๋ผ์ฐ๋ ์๊ฐํ")
### ์ฌ์ฉํ ํฐํธ ํ์ผ ์ง์ ํ๊ธฐ
font_path = "C:/Windows/Fonts/malgunsl.ttf"
### ์๋ํด๋ผ์ฐ๋ ๊ทธ๋ํ ์์ฑ ์ค์
wc = WordCloud(
### ํฐํธ ์ง์
font_path=font_path,
### ๋ฐฐ๊ฒฝ์ ์ง์
background_color="ivory",
### ๊ทธ๋ํ ๋๋น
width=800,
### ๊ทธ๋ํ ๋์ด
height=600
)
### ์๋ํด๋ผ์ฐ๋ ๊ทธ๋ํ์ ๋ฐ์ดํฐ ๋ฃ๊ธฐ
# - generate_from_frequencies() : ์๋ํด๋ผ์ฐ๋ ์ด๋ฏธ์ง๋ก ๋ฐํํด์ค
# cloud = wc.generate_from_frequencies(pos_top_20)
### ๊ธ์ ์ ์ฒด ๋จ์ด ๋ฃ์ด๋ณด๊ธฐ
cloud = wc.generate_from_frequencies(pos_word_count)
### ์๋ํด๋ผ์ฐ๋ ์ด๋ฏธ์ง ๋ณด์ฌ์ฃผ๊ธฐ
plt.imshow(cloud)
### x y ์ขํ์ถ ์ ์ธ์ํค๊ธฐ
plt.axis("off")
### ์ ์ฅํ๊ธฐ
plt.savefig("./img/๊ธ์ _๋ฆฌ๋ทฐ_๋จ์ด_์๋ํด๋ผ์ฐ๋_์๊ฐํ.png")
### ๋ณด์ฌ์ค~
plt.show()
๋ถ์ ๋ฆฌ๋ทฐ ๋จ์ด ์๋ํด๋ผ์ฐ๋ ์๊ฐํ
### ๋ถ์ ๋ฆฌ๋ทฐ ๋จ์ด ์๋ํด๋ผ์ฐ๋ ์๊ฐํ
plt.figure(figsize=(8, 8))
### ๊ทธ๋ํ ์ ๋ชฉ
plt.title("[๋ถ์ ] ๋ฆฌ๋ทฐ ๋จ์ด ์๋ํด๋ผ์ฐ๋ ์๊ฐํ")
### ์ฌ์ฉํ ํฐํธ ํ์ผ ์ง์ ํ๊ธฐ
font_path = "C:/Windows/Fonts/malgunsl.ttf"
### ์๋ํด๋ผ์ฐ๋ ๊ทธ๋ํ ์์ฑ ์ค์
wc = WordCloud(
### ํฐํธ ์ง์
font_path=font_path,
### ๋ฐฐ๊ฒฝ์ ์ง์
background_color="black",
### ๊ทธ๋ํ ๋๋น
width=800,
### ๊ทธ๋ํ ๋์ด
height=600
)
### ์๋ํด๋ผ์ฐ๋ ๊ทธ๋ํ์ ๋ฐ์ดํฐ ๋ฃ๊ธฐ
# - generate_from_frequencies() : ์๋ํด๋ผ์ฐ๋ ์ด๋ฏธ์ง๋ก ๋ฐํํด์ค
# cloud = wc.generate_from_frequencies(pos_top_20)
### ๊ธ์ ์ ์ฒด ๋จ์ด ๋ฃ์ด๋ณด๊ธฐ
cloud = wc.generate_from_frequencies(neg_word_count)
### ์๋ํด๋ผ์ฐ๋ ์ด๋ฏธ์ง ๋ณด์ฌ์ฃผ๊ธฐ
plt.imshow(cloud)
### x y ์ขํ์ถ ์ ์ธ์ํค๊ธฐ
plt.axis("off")
### ์ ์ฅํ๊ธฐ
plt.savefig("./img/๋ถ์ _๋ฆฌ๋ทฐ_๋จ์ด_์๋ํด๋ผ์ฐ๋_์๊ฐํ.png")
### ๋ณด์ฌ์ค~
plt.show()
728x90
๋ฐ์ํ