[ํ ์คํธ๋ง์ด๋] ์กฐ๋ฐ์ด๋ ๋ํต๋ น ์ทจ์์ ์ฐ์ค๋ฌธ ์ ์ฒ๋ฆฌ ํ ์๋ํด๋ผ์ฐ๋ ๊ทธ๋ฆฌ๊ธฐ
์กฐ ๋ฐ์ด๋ ๋ํต๋ น ์ทจ์์ ์ฐ์ค๋ฌธ ์๋ํด๋ผ์ฐ๋
Python์ ์ด์ฉํ์ฌ ์กฐ ๋ฐ์ด๋ ๋ํต๋ น ์ทจ์์ ์ฐ์ค๋ฌธ์ ํ ์คํธ ๋ถ์ํด ๋ณด์์ต๋๋ค.
์๋ ํ์ผ์ ์ ๊ฐ ์ค์ต์ ์ฌ์ฉํ ์์ด ์๋ฌธ ํ ์คํธ ์๋ฃ์ ๋๋ค.
csv ํ์ผ์ ๊ฒฝ์ฐ ์์ ์ ์ด์ฉํด ๋ง์นจํ ๊ธฐ์ค์ผ๋ก ํ ์คํธ๋ฅผ ๋๋์๊ณ , ๊ทธ ์ธ ์ ์ฒ๋ฆฌ๋ ๋ชจ๋ ํ์ด์ฌ์ ํ์ฉํ์ต๋๋ค.
1. ๋ฐ์ดํฐ ์ค๋น
- ํจํค์ง ๋ถ๋ฌ์ค๊ธฐ
import pandas as pd
import numpy as np
import sklearn # ํน์ง ์ถ์ถ
import re # ์ ๊ท์
from nltk.tokenize import word_tokenize # ๋จ์ด ํ ํฐํ
from nltk.corpus import stopwords # ๋ถ์ฉ์ด
from nltk.stem import PorterStemmer # ์ด๊ฐ์ถ์ถ
from gensim import corpora # gensim - topic modeling ๋ผ์ด๋ธ๋ฌ๋ฆฌ, corpora - corpus ๋ณต์ํ
from sklearn.feature_extraction.text import CountVectorizer # ์ซ์ํ
from wordcloud import WordCloud, STOPWORDS # ์๋ํด๋ผ์ฐ๋, ๋ถ์ฉ์ด ์ฒ๋ฆฌ
import matplotlib.pyplot as plt # ์๊ฐํ
- ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
# csv ํ์ผ
from google.colab import drive
drive.mount('/content/drive')
data = pd.read_csv('ํ์ผ๊ฒฝ๋ก', encoding='cp949').address
# ํ
์คํธ ํ์ผ
from google.colab import drive
drive.mount('/content/drive')
f = open('ํ์ผ๊ฒฝ๋ก',"r",encoding="UTF-8") # r ์ฝ๊ธฐ๋ชจ๋
text = f.read()
f.close()
2. ์ ์ฒ๋ฆฌ
csv ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ ์ ์ฒ๋ฆฌ
- ๋ถ์ฉ์ด, ์ด๊ฐ์ถ์ถ ์ฌ์ ์ ์
stopWords = set(stopwords.words("english"))
stemmer = PorterStemmer()
- for ๊ฒฐ๊ณผ ๋ด์ ๋น words ๋ฆฌ์คํธ ์์ฑ
words = []
- ์๋ฌธ์ํ, ํ ํฐํ, ๋ถ์ฉ์ด ์ ๊ฑฐ, ์ด๊ฐ์ถ์ถ
for doc in data :
tokenizedWords = word_tokenize(doc.lower()) # ์๋ฌธ์ ์ฒ๋ฆฌ
print(tokenizedWords) # ์๋ฌธ์๋ก ํต์ผ๋ ๊ฒฐ๊ณผ๋ง
stoppedWords = [ w for w in tokenizedWords if w not in stopWords] # tokenizedWords์ ์๋ ๋จ์ด ๊ณ์, ๋ง์ฝ ๊ทธ ๋จ์ด๊ฐ stopwords์ ์๋ ๋จ์ด๊ฐ ์๋๋ฉด stoppedwWords์ ๋ฃ์ด๋ผ
stemmedWords = [stemmer.stem(w) for w in stoppedWords] # ์์์ ์ฒ๋ฆฌ๋ ๋จ์ด๋ฅผ ์ด๊ฐ์ถ์ถ
words.append(stemmedWords)
data์ ์๋ ๋ฌธ์ฅ๋ค์ doc์ ํ๋์ฉ ๋ฃ์ด ์ดํด๋ด
์๋ฌธ์ ์ฒ๋ฆฌ ํ ํ ํฐํ ํ์ฌ tokenizedwords์ ๋ฃ์
tokizedwords์์ ๋จ์ด๋ฅผ stopwords์ ์๋ ๋จ์ด๊ฐ ์๋๋ฉด stoppedwords์ ๋ฃ์ด๋ผ(๋ถ์ฉ์ด ๋บ ๋๋จธ์ง)
๋ถ์ฉ์ด ์ฒ๋ฆฌ๋ ๊ฒ์ ์ด๊ฐ์ถ์ถํ์ฌ stemmedwords์ ๋ฃ์
๋ง์ง๋ง์ ์ ์ ๋ ๊ฒ์ words์ ๋ถ์ฌ ๋ฃ์ด๋ผ
- ๋ฌธ์์ด์์ ์ํ๋ฒณ๋ง ๋จ๊ธฐ๊ธฐ
alp_words = re.sub(r"[^a-zA-Z]", " ", str(words))
alp_words
re.sub(์ ๊ท ํํ์, ์นํ ๋ฌธ์, ๋์ ๋ฌธ์์ด)
^ ์๋ ๊ฒ๊ณผ ๋งค์น, [a-zA-Z] : ์ํ๋ฒณ ๋ชจ๋
+) ์ ๊ท ํํ์ ์ฐธ๊ณ
3. ๋น๋๋ถ์
- ํ ํฐํ
cv = CountVectorizer(max_features=100, stop_words='english').fit([alp_words])
CountVectorizer : ๋ฌธ์ ์งํฉ์์ ๋จ์ด ํ ํฐ์ ์์ฑํ๊ณ ๊ฐ ๋จ์ด์ ์๋ฅผ ์ธ์ด BOW ์ธ์ฝ๋ฉ ๋ฒกํฐ๋ฅผ ๋ง๋ฆ
- max_features ์ต๋ ๋ช ๊ฐ ๊ฐ์ ธ์ฌ ๊ฒ์ธ์ง (๋์ ์์ผ๋ก)
sklearn์ ์๋ stopwords, ์์์๋ nltk์ stopwords ~ ์ ๊ฒน์น๋ ๊ฑฐ ์์ผ๋ฉด ๋น ์ง๋๋ก
- DTM ํํ๋ก ๋ณํ
dtm = cv.fit_transform([alp_words])
fit_transform : ๋ฐ์ดํฐ๊ฐ ๊ฐ์ง๊ณ ์๋ ์ ๋ณด๋ ์ ์งํ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ๋ณํ
ํํ ๋ณํํ ๊ฒ์ dtm์ผ๋ก ์ ์ฅ
- feature ๋จ์ด ๋ชฉ๋ก ํ์ธ
alp_words = cv.get_feature_names()
alp_words
get_feature_names : DTM์ ์ฌ์ฉ๋ feature ๋จ์ด ๋ชฉ๋ก
- dtm ๋จ์ด ํฉ๊ณ
count_mat = dtm.sum(axis=0) # ์ธ๋ก ํฉ๊ณ
count_mat
dtm์ ์๋ฃ๋ฅผ ํฉ์ณ์ ์ธ๋ก๋ก count_mat์ ๋ฃ์
- ๋จ์ด, ๋น๋์๋ฅผ ํฉ์ณ์ ๋ฆฌ์คํธ๋ก ๋ง๋ฆ
count = np.squeeze(np.asarray(count_mat)) # arrayํํ๋ก ์ฐจ์์ ์ค์ฌ๋ผ
word_count = list(zip(alp_words, count)) # ๋จ์ด์ count ๋ฅผ list ํํ๋ก ์์ ์ด๋ฃจ๋๋ก ๋ฌถ์
word_count
squeeze : ์ฐจ์์ ์ถ์ (matrix ํ๋ ฌ -> array ๋ฐฐ์ด ํํ๋ก ๋ณํ)
zip : ๋์ผ ๊ฐ์๋ก ์ด๋ฃจ์ด์ง ์๋ฃํ ๋ฌถ์ด์ฃผ๋ ํจ์
-> zip์ผ๋ก ๋ฐํ๋จ -> list(zip(๋ฆฌ์คํธ1, ๋ฆฌ์คํธ2)) list ํํ๋ก ๋ณํ
- ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
word_count = sorted(word_count, key=lambda x:x[1], reverse=True)
์๋ํด๋ผ์ฐ๋ ์์ฑ์ํด ํฐ ๊ฒ ๋จผ์ ๋์ค๋๋ก ์ ๋ ฌํ์ฌ ์๋ก์ด ๋ฆฌ์คํธ ๋ฐํ
sorted(์ ๋ ฌํ ๋ฐ์ดํฐ, key ์ ๋ ฌ ๊ธฐ์ค, reverse ์ค๋ฆ/๋ด๋ฆผ)
- reverse=True ๋ด๋ฆผ์ฐจ์ / reverse=false,์๋ต : ์ค๋ฆ์ฐจ์
lamvda : ๋ฐ๋ก ์ ์ํ์ฌ ์ฌ์ฉํ ์ ์๋ ํจ์-
-> (key ์ธ์์ ํจ์๋ฅผ ๋๊ฒจ์ฃผ๋ฉด ํด๋น ํจ์์ ๋ฐํ๊ฐ์ ๋น๊ตํ๋ฉฐ ์์๋๋ก ์ ๋ ฌ)
4. ์๋ํด๋ผ์ฐ๋
- ์๋ํด๋ผ์ฐ๋ ์ค์
wc = WordCloud(background_color='black', width=800, height=600)
๋ฐฐ๊ฒฝ์=๋ธ๋, ๋์ด=800, ๋์ด=600
- ๋จ์ด ๋น๋ ์ฌ์
cloud = wc.generate_from_frequencies(dict(word_count)) # ๋น๋(์ฌ์ ํํ())
- ์๋ํด๋ผ์ฐ๋ ๊ทธ๋ฆฌ๊ธฐ
plt.figure(figsize=(12,9)) # plt ๊ทธ๋ฆผ ๊ทธ๋ฆฌ๊ธฐ (์ฌ์ด์ฆ)
plt.imshow(cloud) # ํด๋ผ์ฐ๋ ๊ทธ๋ฆฌ๊ธฐ
plt.axis('off') # ์ขํ๊ฐ(์ถ) ๋๊ธฐ
plt.show() # ๋ณด์ฌ์ค
ํ ์คํธ๋ฅผ ๊ฐ๋จํ๊ฒ ์ ์ฒ๋ฆฌํ ๋ค ๋จ์ด ๋น๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์๋ํด๋ผ์ฐ๋๋ฅผ ๊ทธ๋ ค๋ณด์์ต๋๋ค. ์์ฃผ ์ธ๊ธ๋๋ ์์ 100๊ฐ์ ๋จ์ด๋ค์ ๊ธฐ์ค์ผ๋ก ํ์์ผ๋ ๊ณผ์ฐ ์ด ๋จ์ด๋ค ์์ฒด๋ฅผ ํน๋ณํ๊ณ ์ค์ํ๋ค ๋ณผ ์ ์๋์ง๋ ์๋ฌธ์ ๋๋ค. ๋ํ ์ด๊ฐ ์ถ์ถ์ด ๋งค๋๋ฝ์ง ๋ชป ํ๋ฉฐ american, america์ ๊ฐ์ ์ ์ฌ์ด์ ๊ฒฝ์ฐ์๋ ์ฌ์ ์ ๋ฐ๋ก ์ ์ํ๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฐ๋ผ์ ์ฌ๋ฌ ๋จ์ด๊ฐ ํน์ ๋ฌธ์ ๋ด์์ ์ผ๋ง๋ ์ค์ํ ๊ฒ์ธ์ง๋ฅผ ๋ํ๋ด๋ TF-IDF๋ฅผ ์ด์ฉํด ๋ณด๋ ๊ฒ๋ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. ๋จ์ํ '๋จ์ด๊ฐ ํํ๊ฒ ๋ฑ์ฅํ๋ ๊ฒ'์ด ์๋ '๋ฌธ์ ๋ด์์ ๋ ํนํ๊ฒ ์ฌ์ฉ๋ ๋จ์ด'๋ค์ ํ์ ํ์ฌ ํ ์คํธ๋ฅผ ๋น ๋ฅด๊ฒ ํ์ ํ ์ ์์ง ์์๊น ๊ธฐ๋๊ฐ ๋ฉ๋๋ค.
'Ability ๐ฑ > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ ์คํธ๋ง์ด๋] LDA์ Topic Modeling ๊ฐ๋ ๋ฐ ํ์ฉ (1) | 2023.01.16 |
---|---|
[ํ ์คํธ๋ง์ด๋] ๊ฐ์ ์ ์๋ฅผ ๊ณ์ฐํ์ฌ Sentiment Analysis ํ ์๊ฐํ ํ๊ธฐ (0) | 2023.01.06 |
[Python] pandas ํจ์ (0) | 2022.04.21 |
[Python] ์๋ฃ ์ ํ, ์กฐ๊ฑด๋ฌธ(if), ๋ฐ๋ณต๋ฌธ(for/while) (0) | 2022.04.20 |
[Python] ํ์ด์ฌ ๋ค์ด๋ก๋ & ๊ฐ๋ต ์๊ฐ (0) | 2022.04.05 |