ex nouns wordCloud
1. text file(docs) ์ฝ๊ธฐ
2. ๋ฌธ๋จ -> ๋ฌธ์ฅ ์ถ์ถ
3. ๋ฌธ์ฅ -> ๋จ์ด ์ถ์ถ
4. ๋จ์ด ์ ์ฒ๋ฆฌ & ๋จ์ด ์นด์ดํธ
5. ๋จ์ด๊ตฌ๋ฆ์๊ฐํ
from konlpy.tag import Kkma #class - ํํ์ ๋ถ์๊ธฐ
from wordcloud import WordCloud #class - ๋จ์ด๊ตฌ๋ฆ ์๊ฐํ
1. text file(docs) ์ฝ๊ธฐ
path = r"C:\ITWILL\4_Python-2\workspace\chap10_TextMining\data"
file = open(path + '/text_data.txt', encoding='utf-8')
para = file.read() #๋ฌธ์์ด
print(para)
type(para) #str
file.close()
2. ๋ฌธ๋จ(๋ฌธ์์ด) -> ๋ฌธ์ฅ(list)
kkma = Kkma()
ex_sents = kkma.sentences(para) #list ๋ฐํ
print(ex_sents) #['ํํ์ ๋ถ์์ ์์ํฉ๋๋ค.', '๋๋ ๋ฐ์ดํฐ ๋ถ์์ ์ข์ํฉ๋๋ค.', '์ง์
์ ๋ฐ์ดํฐ ๋ถ์ ์ ๋ฌธ๊ฐ ์
๋๋ค.', 'Text mining ๊ธฐ๋ฒ์ 2000๋ ์ด๋ฐ์ ๊ฐ๋ฐ๋ ๊ธฐ์ ์ด๋ค.']
len(ex_sents) #4
๋ฌธ๋จ(๋ฌธ์์ด) -> ๋ช
์ฌ(list)
ex_nouns = kkma.nouns(para)
print(ex_nouns) #['ํํ์', '๋ถ์', '๋', '๋ฐ์ดํฐ', '์ง์
', '์ ๋ฌธ๊ฐ', '๊ธฐ๋ฒ', '2000', '2000๋', '๋', '์ด๋ฐ', '๊ฐ๋ฐ', '๊ธฐ์ ']
len(ex_nouns) #13
3. ๋ฌธ์ฅ -> ๋จ์ด(๋ช
์ฌ) ์ถ์ถ
nouns = []
#์ค๋ณต ๋ช
์ฌ ์ ์ฅ
for sent in ex_sents : #๋ฌธ๋จ -> ๋ฌธ์ฅ
for noun in kkma.nouns(sent) : #๋ฌธ์ฅ -> ๋ช
์ฌ ์ถ์ถ
nouns.append(noun)
print(nouns) #['ํํ์', '๋ถ์', '๋ฐ์ดํฐ', '๋ถ์', '์ง์
', '๋ฐ์ดํฐ', '๋ถ์', '์ ๋ฌธ๊ฐ', '๊ธฐ๋ฒ', '2000', '2000๋', '๋', '์ด๋ฐ', '๊ฐ๋ฐ', '๊ธฐ์ ']
len(nouns) #15
4. ์ ์ฒ๋ฆฌ & ๋จ์ด ์นด์ดํธ : 1์์ ์ ์ธ, ์์ ์ ์ธ
from re import match #์์ ์ ์ธ
wc = {} #๋จ์ด ์นด์ดํธ
for noun in nouns :
if len(noun) > 1 and not(match('^[0-9]', noun)): #๋จ์ด ์ ์ฒ๋ฆฌ
wc[noun] = wc.get(noun, 0) + 1 #๋จ์ด ์นด์ดํธ
print(wc) #{'ํํ์': 1, '๋ถ์': 3, '๋ฐ์ดํฐ': 2, '์ง์
': 1, '์ ๋ฌธ๊ฐ': 1, '๊ธฐ๋ฒ': 1, '์ด๋ฐ': 1, '๊ฐ๋ฐ': 1, '๊ธฐ์ ': 1}
len(wc) #9
5. ๋จ์ด๊ตฌ๋ฆ ์๊ฐํ
1) top5 word์ ์
from collections import Counter #class
counter = Counter(wc)
top5_word = counter.most_common(5)
print(top5_word) #[('๋ถ์', 3), ('๋ฐ์ดํฐ', 2), ('ํํ์', 1), ('์ง์
', 1), ('์ ๋ฌธ๊ฐ', 1)]
2) word cloud
wc = WordCloud(font_path='C:/Windows/Fonts/malgun.ttf',
width=500, height=400,
max_words=100,max_font_size=150,
background_color='white')
wc_result = wc.generate_from_frequencies(dict(top5_word))
import matplotlib.pyplot as plt
plt.imshow(wc_result)
plt.axis('off') #์ถ ๋๊ธ ๊ฐ์ถ๊ธฐ
plt.show()
news wordCloud
1. pickle file ์ฝ๊ธฐ
2. ๋ฌธ์ฅ ์ถ์ถ : Okt
3. ๋ฌธ์ฅ -> ๋ช
์ฌ(๋จ์ด) ์ถ์ถ : Okt
4. ์ ์ฒ๋ฆฌ : ๋จ์ด ๊ธธ์ด ์ ํ
5. ๋จ์ด๊ตฌ๋ฆ ์๊ฐํ
import pickle #pickle file ์ฝ๊ธฐ
from konlpy.tag import Okt #ํํ์ ๋ถ์๊ธฐ
from wordcloud import WordCloud
1. pickLe file ์ฝ๊ธฐ
path = r'C:\ITWILL\4_Python-2\workspace\chap10_TextMining\data'
fiLe Load
file = open(path + '/news_data.pkl', mode='rb')
news_data = pickle.load(file)
file.close()
news_data #([1day], [2day], ... (150day]] - ์ค์ฒฉList
news_data[0] #[1day] news_data[-1] #[150day]
type(news_data[-1]) #List len(news_data) #150 -> 150๋ฌธ๋จ(๋ฌธ์์ด)
okt = Okt() #ํํ์ ๋ถ์๊ธฐ
2. ๋ฌธ๋จ(๋ฌธ์์ด) - > ๋ฌธ์ฅ(๋ฌธ์์ด)
ex_sents = [] #๋ฌธ์ฅ ์ ์ฅ
for sent in news_data[:150] : #150day
para = sent[0] #๋ฌธ๋จ ์ถ์ถ
sents = okt.normalize(para)
ex_sents.append(sents)
len(ex_sents) #150 ex_sents
3. ๋ฌธ์ฅ -> ๋ช
์ฌ ์ถ์ถ
nouns = [] #๋ช
์ฌ ์ ์ฅ
for sent in ex_sents : #๋ฌธ๋จ -> ๋ฌธ์ฅ
for noun in okt.nouns(sent) : #๋ฌธ์ฅ -> ๋ช
์ฌ ์ถ์ถ
nouns.append(noun) #๋ช
์ฌ ์ ์ฅ
print(nouns)
len(nouns) #1129
4. ์ ์ฒ๋ฆฌ(1์์ ์ ์ธ) & ๋จ์ด ์นด์ดํธ
wc = {} #๋จ์ด ์นด์ดํธ
for noun in nouns :
if len(noun) > 1 :
wc[noun] = wc.get(noun, 0) + 1 #dict๋ ์ค๋ณตํ์ฉX
print(wc)
len(wc) #732
5. ๋จ์ด๊ตฌ๋ฆ ์๊ฐํ
1) topN word ์ ์
from collections import Counter #class
counter = Counter(wc)
top100_word = counter.most_common(100)
print(top100_word)
2) word cloud
wc = WordCloud(font_path='C:/Windows/Fonts/malgun.ttf',
width=500, height=400, max_words=100,max_font_size=150,
background_color='white')
wc_result = wc.generate_from_frequencies(dict(top100_word))
import matplotlib.pyplot as plt
plt.imshow(wc_result)
plt.axis('off') #์ถ ๋๊ธ ๊ฐ์ถ๊ธฐ
plt.show()
๋ฌธ์ ์ ์ฌ๋ (Document Similarity)
๋ฌธ์ ์ ์ฌ๋
๋ฌธ์์ ์ ์ฌ๋๋ฅผ ๊ตฌํ๋ ์ผ์ ์์ฐ์ด ์ฒ๋ฆฌ์ ์ฃผ์ ์ฃผ์ ์ค ํ๋
๋ฌธ์๋ค ๊ฐ์ ๋์ผํ ๋จ์ด ๋๋ ๋น์ทํ ๋จ์ด๋ฅผ ์ด์ฉํ์ฌ ์ ์ฌํ ๋ฌธ์ ๊ฒ์
๋ฌธ์ ์ ์ฌ๋ ์ฑ๋ฅ ๊ฒฐ์ ์์ธ
- ๊ฐ ๋ฌธ์์ ๋จ์ด๋ค์ ์์นํํ๋ ๋ฐฉ๋ฒ(DTM, Word2Vec ๋ฑ),
- ๋ฌธ์ ๊ฐ์ ๋จ์ด๋ค์ ์ ์ฌ๋ ๋ฐฉ๋ฒ(์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ, ์ฝ์ฌ์ธ ์ ์ฌ๋ ๋ฑ)
* ๋จ์ด ์๋ฒ ๋ฉ(word embedding) : ํ
์คํธ ๋ฐ์ดํฐ์์ ์๋ํ๋ ๋ชจ๋ ์๊ณ ๋ฆฌ์ฆ์๋ ์ปดํจํฐ๊ฐ ํ
์คํธ๋ฅผ ์ง์ ์ดํดํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ์ซ์ ํํ์ ๋จ์ด ํํ ๋ฐฉ์
๋ฌธ์ ์ ์ฌ๋ ์ ํ
๋ฌธ์ ๊ฐ์ ๋จ์ด๋ค์ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ
1. ์ฝ์ฌ์ธ ์ ์ฌ๋(Cosine Similarity)
- ๋ ๋ฒกํฐ ๊ฐ์ ์ฝ์ฌ์ธ ๊ฐ๋๋ฅผ ์ด์ฉํ ์ ์ฌ๋
2. ์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ(Euclidean distance) - sqrt(sum((p-q)^2))
- ํผํ๊ณ ๋ผ์ค์ ์ ๋ฆฌ์ ์ํ ๋ ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ
3. ์์นด๋ ์ ์ฌ๋(Jaccard similarity)
- ๋ ๋ฌธ์์์ ๊ณตํต์ผ๋ก ๋ค์ด๊ฐ ๋จ์ด์ ๋น์จ
- ๋ ๋ฌธ์ ํฉ์งํฉ -> ๊ต์งํฉ์ ๋น์จ ex) len(๊ต์งํฉ ๋จ์ด) / len(ํฉ์งํฉ ๋จ์ด)
์ฝ์ฌ์ธ ์ ์ฌ๋
๋ ๋ฒกํฐ ๊ฐ์ ์ฝ์ฌ์ธ ๊ฐ๋๋ฅผ ์ด์ฉํ ์ ์ฌ๋
๋ ๋ฒกํฐ์ ๋ฐฉํฅ์ด ์์ ํ ๋์ผํ ๊ฒฝ์ฐ 1์ ๊ฐ, 90๋ ๊ฐ 0, 180๋ ๊ฐ -1 ๊ฐ
๋ ๋ฒกํฐ ๊ฐ ์ฝ์ฌ์ธ ์ ์ฌ๋ ์
* ||A|| : ํ๋ ฌ A์ ๋ฒกํฐ ํฌ๊ธฐ/๊ธธ์ด(๋
ธ๋ฆ
'๋ฐ์ดํฐ๋ถ์๊ฐ ๊ณผ์ > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DAY59. Python TextMining Cosine similarity (์ฝ์ฌ์ธ ์ ์ฌ๋) (0) | 2021.12.14 |
---|---|
DAY57. Python TextMining (2)WebCrawling (์ ํ์, ๋ด์ค ํฌ๋กค๋ง) (0) | 2021.12.10 |
DAY56. Python TextMining (1)WebCrawling (url, tag, html) (0) | 2021.12.09 |
DAY55. Python Cluster&Recommand (๊ณ์ธต๊ตฐ์ง๋ถ์, KMeans, ์ถ์ฒ์์คํ ๋ชจํ) (0) | 2021.12.08 |
DAY54. Python TreeModel (2)Ensemble (0) | 2021.12.07 |