header-img
Info :
728x90

4.1 ์ž„๋ฒ ๋”ฉ์ด๋ž€?

์ž„๋ฒ ๋”ฉ embedding

- ์ปดํ“จํ„ฐ๋Š” ์ˆ˜์น˜ ์—ฐ์‚ฐ๋งŒ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž์—ฐ์–ด๋ฅผ ์ˆซ์ž๋‚˜ ๋ฒกํ„ฐ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ผ๋ จ์˜ ๊ณผ์ •.

- ๋‹จ์–ด๋‚˜ ๋ฌธ์žฅ์„ ์ˆ˜์น˜ํ™”ํ•ด ๋ฒกํ„ฐ ๊ณต๊ฐ„์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ณผ์ •

- ๋ง๋ญ‰์น˜์˜ ์˜๋ฏธ์— ๋”ฐ๋ผ ๋ฒกํ„ฐํ™”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ๋ฒ•์ ์ธ ์ •๋ณด๊ฐ€ ํฌํ•จ

 

์ž„๋ฒ ๋”ฉ์˜ ๊ธฐ๋ฒ•

- ๋ฌธ์žฅ ์ž„๋ฒ ๋”ฉ

   ๋ฌธ์žฅ ์ „์ฒด๋ฅผ ๋ฒกํ„ฐ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

    1. ์žฅ์ : ์ „์ฒด ๋ฌธ์žฅ์˜ ํ๋ฆ„์„ ํŒŒ์•…ํ•ด ๋ฒกํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ๋งฅ์  ์˜๋ฏธ๋ฅผ ์ง€๋‹˜

        - ๋‹จ์–ด ์ž„๋ฒ ๋”ฉ์— ๋น„ํ•ด ํ’ˆ์งˆ์ด ์ข‹๊ณ , ์ƒ์šฉ ์‹œ์Šคํ…œ์— ๋งŽ์ด ์‚ฌ์šฉ๋จ

    2. ๋‹จ์ : ์ž„๋ฒ ๋”ฉํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ๋ฌธ์žฅ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ํ•™์Šตํ•˜๋Š” ๋ฐ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค์–ด๊ฐ

- ๋‹จ์–ด ์ž„๋ฒ ๋”ฉ

   ๊ฐœ๋ณ„ ๋‹จ์–ด๋ฅผ ๋ฒกํ„ฐ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•

    1. ์žฅ์ : ํ•™์Šต ๋ฐฉ๋ฒ•์ด ๊ฐ„๋‹จํ•˜์—ฌ ์‹ค๋ฌด์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋จ

    2. ๋‹จ์ : ๋™์Œ์ด์˜์–ด์— ๋Œ€ํ•œ ๊ตฌ๋ถ„์„ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์˜๋ฏธ๊ฐ€ ๋‹ค๋ฅด๋”๋ผ๋„ ๋‹จ์–ด์˜ ํ˜•ํƒœ๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๋™์ผํ•œ ๋ฒกํ„ฐ๊ฐ’์œผ๋กœ ํ‘œํ˜„

 

4.2 ๋‹จ์–ด ์ž„๋ฒ ๋”ฉ

- ๋ง๋ญ‰์น˜์—์„œ ๊ฐ๊ฐ์˜ ๋‹จ์–ด๋ฅผ ๋ฒกํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ๋ฒ•

- ์˜๋ฏธ์™€ ๋ฌธ๋ฒ•์  ์ •๋ณด๋ฅผ ์ง€๋‹ˆ๊ณ  ์žˆ์œผ๋ฉฐ, ๋‹จ์–ด๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ๋ชจ๋ธ ์กด์žฌ

" ํ† ํฌ๋‚˜์ด์ง•์„ ํ†ตํ•ด ์ถ”์ถœ๋œ ํ† ํฐ๋“ค์„ ์–ด๋–ป๊ฒŒ ๋‹จ์–ด ์ž„๋ฒ ๋”ฉํ• ์ง€.."

4.2.1 ์›-ํ•ซ ์ธ์ฝ”๋”ฉ one-hot encoding

- ๋‹จ์–ด๋ฅผ ์ˆซ์ž ๋ฒกํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•

- ์š”์†Œ๋“ค ์ค‘ ๋‹จ ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ 1์ด๊ณ  ๋‚˜๋จธ์ง€ ์š”์†Ÿ๊ฐ’์€ 0์ธ ์ธ์ฝ”๋”ฉ์„ ์˜๋ฏธ

- ์›-ํ•ซ ์ธ์ฝ”๋”ฉ์œผ๋กœ ๋‚˜์˜จ ๊ฒฐ๊ณผ๋ฅผ ์›-ํ•ซ ๋ฒกํ„ฐ๋ผ๊ณ  ํ•˜๋ฉฐ, ์ „์ฒด ์š”์†Œ ์ค‘ ๋‹จ ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ 1์ด๊ธฐ ๋•Œ๋ฌธ์— ํฌ์†Œsparse ๋ฒกํ„ฐ๋ผ๊ณ  ํ•จ

- ์›-ํ•ซ ์ธ์ฝ”๋”ฉ

from konlpy.tag import Komoran
import numpy as np

komoran = Komeran()
text = "์˜ค๋Š˜ ๋‚ ์”จ๋Š” ๊ตฌ๋ฆ„์ด ๋งŽ์•„์š”."

# ๋ช…์‚ฌ๋งŒ ์ถ”์ถœ
nouns = komoran.nouns(text)
print(nouns)

# ๋‹จ์–ด ์‚ฌ์ „ ๊ตฌ์ถ• ๋ฐ ๋‹จ์–ด๋ณ„ ์ธ๋ฑ์Šค ๋ถ€์—ฌ
dics = {}
for word in nouns:
	if word not in dics.keys():
    	dics[word] = len(dics)
print(dics)

# ์›-ํ•ซ ์ธ์ฝ”๋”ฉ
nb_classes = len(dics)
targets = list(dics.values())
one_hot_targets = np.eyes(nb.classes)[targets]
print(one_hot_targets)

- ์›-ํ•ซ ์ธ์ฝ”๋”ฉ ์˜ˆ์ œ ๊ฒฐ๊ณผ

['์˜ค๋Š˜', '๋‚ ์”จ', '๊ตฌ๋ฆ„']
{'์˜ค๋Š˜':0, '๋‚ ์”จ':1, '๊ตฌ๋ฆ„':2}
[[1.0.0.]
 [0.1.0.]
 [0.0.1.]]

- ์›-ํ•ซ ์ธ์ฝ”๋”ฉ ํŠน์ง•

   1. ๊ฐ„๋‹จํ•œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์— ๋น„ํ•ด ์ข‹์€ ์„ฑ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ๋งŽ์€ ์‚ฌ๋žŒ์ด ์‚ฌ์šฉ์ค‘

   2. ๋‹จ์ˆœํžˆ ๋‹จ์–ด์˜ ์ˆœ์„œ์— ์˜ํ•œ ์ธ๋ฑ์Šค๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธ์ฝ”๋”ฉ๋œ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์–ด์˜ ์˜๋ฏธ๋‚˜ ์œ ์‚ฌํ•œ ๋‹จ์–ด์™€์˜ ๊ด€๊ณ„๋ฅผ ๋‹ด๊ณ  ์žˆ์ง€ ์•Š์Œ

   3. ๋‹จ์–ด ์‚ฌ์ „์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ์›-ํ•ซ ๋ฒกํ„ฐ์˜ ์ฐจ์›๋„ ์ปค์ง€๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋•Œ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋‚˜ ๊ณ„์‚ฐ์˜ ๋ณต์žก๋„๊ฐ€ ์ปค์ง

      : ๋Œ€๋ถ€๋ถ„ ์š”์†Œ๊ฐ€ 0์˜ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋น„ํšจ์œจ์ 

4.2.2 ํฌ์†Œ ํ‘œํ˜„๊ณผ ๋ถ„์‚ฐ ํ‘œํ˜„

- ํฌ์†Œ ํ‘œํ˜„์˜ ๊ฒฝ์šฐ ๊ฐ๊ฐ์˜ ์ฐจ์›์ด ๋…๋ฆฝ์ ์ธ ์ •๋ณด๋ฅผ ์ง€๋‹ˆ๊ณ  ์žˆ์–ด ์‚ฌ๋žŒ์ด ์ดํ•ดํ•˜๊ธฐ์— ์ง๊ด€์ ์ธ ์žฅ์  ↔ ๋‹จ์–ด ์‚ฌ์ „์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„์™€ ๊ณ„์‚ฐ ๋ณต์žก๋„๊ฐ€ ์ปค์ง€๋Š” ๋‹จ์  + ๋‹จ์–ด ๊ฐ„์˜ ์—ฐ๊ด€์„ฑ์ด ์ „ํ˜€ ์—†์–ด ์˜๋ฏธ๋ฅผ ๋‹ด์„ ์ˆ˜ ์—†์Œ

- ์ž์—ฐ์–ด ์ฒ˜๋ฆฌ๋ฅผ ์ž˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”? ๊ธฐ๋ณธ ํ† ํฐ์ด ๋˜๋Š” ๋‹จ์–ด์˜ ์˜๋ฏธ์™€ ์ฃผ๋ณ€ ๋‹จ์–ด ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ๋‹จ์–ด ์ž„๋ฒ ๋”ฉ์— ํ‘œํ˜„๋˜์–ด์•ผ ํ•จ

   → ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ๋‹จ์–ด ๊ฐ„์˜ ์œ ์‚ฌ์„ฑ์„ ์ž˜ ํ‘œํ˜„ํ•˜๋ฉด์„œ๋„ ๋ฒกํ„ฐ ๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๊ณ ์•ˆ : ๋ถ„์‚ฐ ํ‘œํ˜„ distributed representation

- ๋ถ„์‚ฐํ‘œํ˜„

   ํ•˜๋‚˜์˜ ์ฐจ์›์— ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ.

   ๋ฐ์ดํ„ฐ ์†์‹ค์„ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ ๋ฒกํ„ฐ ์ฐจ์›์ด ์••์ถ•๋˜๋Š” ํšจ๊ณผ

   ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์ฐจ์›์— ๋ฐ์ดํ„ฐ๋ฅผ ์ตœ๋Œ€ํ•œ ๋ฐ€์ง‘์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด ๋ฐ€์ง‘ ํ‘œํ˜„ dense representation ์ด๋ผ ๋ถ€๋ฅด๊ธฐ๋„ ํ•จ.

   (๋ฐ€์ง‘ ํ‘œํ˜„์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๋ฒกํ„ฐ๋ฅผ ๋ฐ€์ง‘ ๋ฒกํ„ฐ dense vector ๋ผ๊ณ  ํ•จ)

- ๋ถ„์‚ฐ ํ‘œํ˜„์˜ ์žฅ์ 

  1. ์ž„๋ฒ ๋”ฉ ๋ฒกํ„ฐ์˜ ์ฐจ์›์„ ๋ฐ์ดํ„ฐ ์†์‹ค์„ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ ์••์ถ•ํ•  ์ˆ˜ ์žˆ์Œ. : ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ์ฐจ์›์ด ๋„ˆ๋ฌด ๋†’์•„์ง€๋ฉด ์‹ ๊ฒฝ๋ง ๋ชจ๋ธ์˜ ํ•™์Šต์ด ์–ด๋ ค์›Œ์ง€๋Š” ์ฐจ์›์˜ ์ €์ฃผ curse of dimensionality ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•จ

  2. ์ž„๋ฒ ๋”ฉ ๋ฒกํ„ฐ์—๋Š” ๋‹จ์–ด์˜ ์˜๋ฏธ, ์ฃผ๋ณ€ ๋‹จ์–ด ๊ฐ„์˜ ๊ด€๊ณ„ ๋“ฑ ๋งŽ์€ ์ •๋ณด๊ฐ€ ๋‚ดํฌ๋˜์–ด ์žˆ์–ด ์ผ๋ฐ˜ํ™” ๋Šฅ๋ ฅ์ด ๋›ฐ์–ด๋‚จ.

4.2.3 Word2Vec

" ์›-ํ•ซ ์ธ์ฝ”๋”ฉ์˜ ๊ฒฝ์šฐ ๊ตฌํ˜„์€ ๊ฐ„๋‹จํ•˜์ง€๋งŒ, ์ฑ—๋ด‡์˜ ๊ฒฝ์šฐ ๋งŽ์€ ๋‹จ์–ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฉด์„œ ๋‹จ์–ด ๊ฐ„ ์œ ์‚ฌ๋„๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์–ด์•ผ ์ข‹์€ ์„ฑ๋Šฅ์ด ๋‚˜์˜ค๋Š”๋ฐ.. ์›-ํ•ซ ์ธ์ฝ”๋”ฉ์€ ์ด๊ฑธ ๋ชป ํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค."

" ๋”ฐ๋ผ์„œ ๋ถ„์‚ฐ ํ‘œํ˜„ ํ˜•ํƒœ ๋‹จ์–ด ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•  ๊ฑด๋ฐ.. ์‹ ๊ฒฝ๋ง ๊ธฐ๋ฐ˜ ๋‹จ์–ด ์ž„๋ฒ ๋”ฉ์˜ ๋Œ€ํ‘œ์ ์ธ ๋ฐฉ๋ฒ•์ธ Word2Vec ๋ชจ๋ธ์„ ์•Œ์•„๋ณด์ž"

 

Word2Vec

- 2013๋…„ ๊ตฌ๊ธ€์—์„œ ๋ฐœํ‘œํ–ˆ์œผ๋ฉฐ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋‹จ์–ด ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ

- ๊ธฐ์กด ์‹ ๊ฒฝ๋ง ๊ธฐ๋ฐ˜์˜ ๋‹จ์–ด ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ์— ๋น„ํ•ด ๊ตฌ์กฐ์ƒ ์ฐจ์ด๋Š” ํฌ๊ฒŒ ์—†์ง€๋งŒ ๊ณ„์‚ฐ๋Ÿ‰์„ ํš๊ธฐ์ ์œผ๋กœ ์ค„์—ฌ ๋น ๋ฅธ ํ•™์Šต์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ–ˆ๋‹ค!

- CBOW continuous bag-of-words ์™€ skip-gram ๋‘ ๊ฐ€์ง€ ๋ชจ๋ธ๋กœ ์ œ์•ˆ

   CBOW ๋ชจ๋ธ

   - ๋งฅ๋ฝ์ด๋ผ ํ‘œํ˜„๋˜๋Š” ์ฃผ๋ณ€ ๋‹จ์–ด๋“ค์„ ์ด์šฉํ•ด ํƒ€๊นƒ ๋‹จ์–ด๋ฅผ ์˜ˆ์ธกํ•˜๋Š” ์‹ ๊ฒฝ๋ง ๋ชจ๋ธ

   - ์‹ ๊ฒฝ๋ง์˜ ์ž…๋ ฅ์„ ์ฃผ๋ณ€ ๋‹จ์–ด๋“ค๋กœ ๊ตฌ์„ฑํ•˜๊ณ  ์ถœ๋ ฅ์„ ํƒ€๊นƒ ๋‹จ์–ด๋กœ ์„ค์ •ํ•ด ํ•™์Šต๋œ ๊ฐ€์ค‘์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž„๋ฒ ๋”ฉ ๋ฒกํ„ฐ๋กœ ํ™œ์šฉ

   - ํƒ€๊นƒ ๋‹จ์–ด์˜ ์†์‹ค๋งŒ ๊ณ„์‚ฐํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•™์Šต ์†๋„๊ฐ€ ๋น ๋ฅธ ์žฅ์ 

   skip-gram ๋ชจ๋ธ

   - CBOW ๋ชจ๋ธ๊ณผ ๋ฐ˜๋Œ€๋กœ ํ•˜๋‚˜์˜ ํƒ€๊นƒ ๋‹จ์–ด๋ฅผ ์ด์šฉํ•ด ์ฃผ๋ณ€ ๋‹จ์–ด๋“ค์„ ์˜ˆ์ธกํ•˜๋Š” ์‹ ๊ฒฝ๋ง ๋ชจ๋ธ

   - ์ž…์ถœ๋ ฅ์ด CBOW ๋ชจ๋ธ๊ณผ ๋ฐ˜๋Œ€์—ฌ์„œ ์˜ˆ์ธกํ•ด์•ผํ•˜๋Š” ๋งฅ๋ฝ์ด ๋” ๋งŽ์•„์ง : ๋‹จ์–ด ๋ถ„์‚ฐ ํ‘œํ˜„๋ ฅ์ด ์šฐ์ˆ˜ํ•ด CBOW ๋ชจ๋ธ์— ๋น„ํ•ด ์ž„๋ฒ ๋”ฉ ํ’ˆ์งˆ์ด ์šฐ์ˆ˜

- Word2Vec ๋ชจ๋ธ ํ•™์Šต ์˜ˆ์ œ

from gensim.models import Word2Vec
from konlpy.tag import Komoran
import time

# ๋„ค์ด๋ฒ„ ์˜ํ™” ๋ฆฌ๋ทฐ ๋ฐ์ดํ„ฐ ์ฝ์–ด์˜ด
def read_review_data(filename):
	with open(filename, 'r') as f:
    	data = [line.split('\t') for line in f.read().splitlines()]
        data = data[1:] # ํ—ค๋” ์ œ๊ฑฐ
    return data
    
# ํ•™์Šต ์‹œ๊ฐ„ ์ธก์ • ์‹œ์ž‘
start = time.time()

# ๋ฆฌ๋ทฐ ํŒŒ์ผ ์ฝ์–ด์˜ค๊ธฐ
print('1) ๋ง๋ญ‰์น˜ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ ์‹œ์ž‘')
review_data = read_review_data('./ratings.txt')
print(len(review_data))		# ๋ฆฌ๋ทฐ ๋ฐ์ดํ„ฐ ์ „์ฒด ๊ฐœ์ˆ˜
print('1) ๋ง๋ญ‰์น˜ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ ์™„๋ฃŒ : ', time.time() - start)

# ๋ฌธ์žฅ ๋‹จ์œ„๋กœ ๋ช…์‚ฌ๋งŒ ์ถ”์ถœํ•ด ํ•™์Šต ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋กœ ๋งŒ๋“ฆ
print('2) ํ˜•ํƒœ์†Œ์—์„œ ๋ช…์‚ฌ๋งŒ ์ถ”์ถœ ์‹œ์ž‘')
komoran = Komoran()
docs = [komoran.nouns(sentence[1]) for sentense in review_data]
print('2) ํ˜•ํƒœ์†Œ์—์„œ ๋ช…์‚ฌ๋งŒ ์ถ”์ถœ ์™„๋ฃŒ : ', time.time() - start)

# Word2Vec ๋ชจ๋ธ ํ•™์Šต
print('3) Word2Vec ๋ชจ๋ธ ํ•™์Šต ์‹œ์ž‘')
komoran = Komoran()
docs = [komoran.nouns(sentence[1]) for sentense in review_data]
print('3) Word2Vec ๋ชจ๋ธ ํ•™์Šต ์™„๋ฃŒ : ', time.time() - start)

# ๋ชจ๋ธ ์ €์žฅ
print('4) ํ•™์Šต๋œ ๋ชจ๋ธ ์ €์žฅ ์‹œ์ž‘')
model.save('nvml.model')
print('4) ํ•™์Šต๋œ ๋ชจ๋ธ ์ €์žฅ ์™„๋ฃŒ : ', time.time() - start)

# ํ•™์Šต๋œ ๋ง๋ญ‰์น˜ ์ˆ˜, ์ฝ”ํผ์Šค ๋‚ด ์ „์ฒด ๋‹จ์–ด ์ˆ˜
print("corpus_count : ", model.corpus_count)
print("courpus_total_words : ", model.corpus_total_words)

 

728x90
๋”๋ณด๊ธฐ
IT ๊ธฐ์ˆ /AI