[AIS7] NLP (3)

BBakHyeΒ·2022λ…„ 12μ›” 14일
0

🦁 AI SCHOOL 7기

λͺ©λ‘ 보기
46/52
post-thumbnail

1104 μ‹€μŠ΅

πŸ’‘ μ‹€μŠ΅ λͺ©μ : KoNLPy둜 ν•œκ΅­μ–΄ ν˜•νƒœμ†Œ 뢄석기λ₯Ό μ‚¬μš©ν•΄ 보기
μ •κ·œν™”: μΌκ΄€λ˜κ²Œ μ „μ²˜λ¦¬ ν•΄μ„œ λΆˆν•„μš”ν•˜κ²Œ 토큰을 μƒμ„±ν•˜μ§€ μ•Šκ³  같은 의미λ₯Ό λΆ€μ—¬ν•˜κ²Œ λ©λ‹ˆλ‹€.

πŸ“Œ KoNLPy

λŒ€ν‘œμ μΈ μžμ—°μ–΄μ²˜λ¦¬ 도ꡬ인 NLTK, SpacyλŠ” ν•œκ΅­μ–΄λ₯Ό μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ˜μ–΄λ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ 해당도ꡬλ₯Ό μ‚¬μš©ν•΄λ„ λ©λ‹ˆλ‹€. ν•˜μ§€λ§Œ ν•œκ΅­μ–΄ ν˜•νƒœμ†Œ 뢄석 λ“±μ˜ κΈ°λŠ₯을 μ œκ³΅ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— KoNLPy둜 μ‹€μŠ΅ν•©λ‹ˆλ‹€.

KoNLPyλŠ” μ„€μΉ˜κ°€ κΉŒλ‹€λ‘­μŠ΅λ‹ˆλ‹€. Java, C, C++둜 μž‘μ„±λœ 도ꡬλ₯Ό 파이썬으둜 μ‚¬μš©ν•  수 μžˆλ„λ‘ μ—°κ²°ν•΄ μ£ΌλŠ” 도ꡬ이기 λ•Œλ¬Έμ— μ—¬λŸ¬ ν™˜κ²½ μ˜μ‘΄μ„±μ΄ μžˆμŠ΅λ‹ˆλ‹€. ν™˜κ²½ μ˜μ‘΄μ„±μ„ λ§Œμ‘±ν•΄μ•Ό λ™μž‘ν•˜λŠ” 도ꡬ가 μžˆμŠ΅λ‹ˆλ‹€.

ν˜•νƒœμ†Œ 뢄석 및 ν’ˆμ‚¬ νƒœκΉ… β€” KoNLPy 0.6.0 documentation

ν˜•νƒœμ†Œ λΆ„μ„κΈ°λ§ˆλ‹€ ν’ˆμ‚¬λ₯Ό νƒœκΉ…ν•˜λŠ” 방법이 λ‹€ λ‹€λ¦…λ‹ˆλ‹€.

πŸ€” ν’ˆμ‚¬νƒœκΉ…ν• λ•Œ λͺ…μ‚¬μ—λŠ” μ–΄λ–€ 곡톡점이 μžˆμ„κΉŒμš”?
N둜 μ‹œμž‘

πŸ€” λ™μ‚¬μ—λŠ” μ–΄λ–€ 곡톡점이 μžˆμ„κΉŒμš”?
V둜 μ‹œμž‘

πŸ’‘ μ „μ²˜λ¦¬λŠ” 속도가 였래 걸리기 λ•Œλ¬Έμ— μ „μ²˜λ¦¬ν•œ κ²ƒλ§Œ νŒŒμΌμ„ λ”°λ‘œ μ €μž₯ν•΄μ„œ μ‚¬μš©ν•˜κΈ°λ„ 함

πŸ’‘ Pecab : Pecab is a pure python Korean morpheme analyzer based on Mecab.

πŸ“Œ Stemming (μ–΄κ°„ μΆ”μΆœ)

  • μ–΄κ°„ μΆ”μΆœμ€ μ›ν˜•μ„ μžƒμ„ 수 μžˆμœΌλ‚˜ ν‘œμ œμ–΄ ν‘œκΈ°λ²•μ€ μ›ν˜•μ„ 보쑴할 수 μžˆμ–΄μ„œ λͺ¨λΈ ν•™μŠ΅μ— μ„±λŠ₯이 더 쒋은 것은 ν‘œμ œμ–΄ ν‘œκΈ°λ²•λΌκ³  ν•  수 μžˆλ‹€.
  • μ–΄κ°„ μΆ”μΆœμ€ 단어 ν˜•μ‹μ„ μ˜λ―Έκ°€ μžˆκ±°λ‚˜ λ¬΄μ˜λ―Έν•  수 μžˆλŠ” μ€„κΈ°λ‘œ μΆ•μ†Œν•˜κ³ , ν‘œμ œμ–΄ ν‘œκΈ°λ²•μ€ 단어 ν˜•μ‹μ„ μ–Έμ–΄ν•™μ μœΌλ‘œ μœ νš¨ν•œ 의미둜 μΆ•μ†Œν•œλ‹€.
  • 'creating'μ΄λΌλŠ” 단어λ₯Ό μ–΄κ°„ μΆ”μΆœλ‘œ ν‘œν˜„ν•˜λ©΄ 'creat'κ°€ 되고, ν‘œμ œμ–΄ ν‘œκΈ°λ²•μœΌλ‘œ ν‘œν˜„ν•˜λ©΄ 'create'κ°€ λœλ‹€.

πŸ’‘ Okt: stemming κΈ°λŠ₯을 제곡

from konlpy.tag import Okt

okt = Okt()
okt.pos("λ²„μŠ€μ˜ μš΄ν–‰μ‹œκ°„μ„ λ¬Έμ˜ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€. μ–΄?!", stem=True) 

>>> 
[('λ²„μŠ€', 'Noun'),
 ('의', 'Josa'),
 ('μš΄ν–‰', 'Noun'),
 ('μ‹œκ°„', 'Noun'),
 ('을', 'Josa'),
 ('문의', 'Noun'),
 ('ν•˜λ‹€', 'Verb'),  # ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€ => ν•˜λ‹€
 ('.', 'Punctuation'),
 ('μ–΄', 'Eomi'),
 ('?!', 'Punctuation')]

okt.pos("λ²„μŠ€μ˜ μš΄ν–‰μ‹œκ°„μ„ λ¬Έμ˜ν–ˆλ‹€. μ–΄?!", stem=True)

>>>
[('λ²„μŠ€', 'Noun'),
 ('의', 'Josa'),
 ('μš΄ν–‰', 'Noun'),
 ('μ‹œκ°„', 'Noun'),
 ('을', 'Josa'),
 ('문의', 'Noun'),
 ('ν•˜λ‹€', 'Verb'),   # ν–ˆλ‹€ => ν•˜λ‹€
 ('.', 'Punctuation'),
 ('μ–΄', 'Eomi'),
 ('?!', 'Punctuation')]

πŸ’‘ ν’ˆμ‚¬ νƒœκΉ…ν•  λ•Œ μ‹œκ°„μ΄ λ„ˆλ¬΄ 였래 κ±Έλ¦¬λŠ”λ° 속도λ₯Ό κ°œμ„ ν•˜κ³ μž ν•œλ‹€λ©΄ λ©€ν‹°μŠ€λ ˆλ“œλ₯Ό λ§Œλ“€μ–΄μ„œ μ²˜λ¦¬ν•˜λŠ” 방법이 μžˆλ‹€.

# ν˜•νƒœμ†Œ 뢄석기(Okt) 뢈러였기 
# ['Josa', 'Eomi', 'Punctuation'] 쑰사, μ–΄λ―Έ, ꡬ두점 제거
# 전체 ν…μŠ€νŠΈμ— μ μš©ν•΄ μ£ΌκΈ° μœ„ν•΄ ν•¨μˆ˜λ₯Ό λ§Œλ“­λ‹ˆλ‹€.
# 1) ν…μŠ€νŠΈλ₯Ό μž…λ ₯λ°›μŠ΅λ‹ˆλ‹€.
# 2) ν’ˆμ‚¬νƒœκΉ…μ„ ν•©λ‹ˆλ‹€. [('문의', 'Noun'), ('ν•˜λ‹€', 'Verb'), ('?!', 'Punctuation')]
# 3) νƒœκΉ… κ²°κ³Όλ₯Ό λ°›μ•„μ„œ 순회 ν•©λ‹ˆλ‹€. 
# 4) ν•˜λ‚˜μ”© 순회 ν–ˆμ„ λ•Œ νŠœν”Œ ν˜•νƒœλ‘œ κ°€μ Έμ˜€κ²Œ λ©λ‹ˆλ‹€. ('을', 'Josa') 
# 5) νŠœν”Œμ—μ„œ 1번 μΈλ±μŠ€μ— μžˆλŠ” ν’ˆμ‚¬λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€.
# 6) ν•΄λ‹Ή ν’ˆμ‚¬κ°€ 쑰사, μ–΄λ―Έ, ꡬ두점이면 μ œμ™Έν•˜κ³  append 둜 인덱슀 0번 κ°’λ§Œ λ‹€μ‹œ λ¦¬μŠ€νŠΈμ— λ‹΄μ•„μ€λ‹ˆλ‹€.
# 7) " ".join() 으둜 곡백문자둜 μ—°κ²°ν•΄ μ£Όλ©΄ λ‹€μ‹œ λ¬Έμž₯이 λ©λ‹ˆλ‹€.
# 8) μ „μ²˜λ¦¬ ν›„ μ™„μ„±λœ λ¬Έμž₯을 λ°˜ν™˜ν•©λ‹ˆλ‹€. 

def okt_clean(text):
    clean_text = []
    # ν’ˆμ‚¬νƒœκΉ…μ„ ν•©λ‹ˆλ‹€. [('문의', 'Noun'), ('ν•˜λ‹€', 'Verb'), ('?!', 'Punctuation')]
    # νƒœκΉ… κ²°κ³Όλ₯Ό λ°›μ•„μ„œ 순회 ν•©λ‹ˆλ‹€. 
    for word in okt.pos(text, norm=True, stem=True):
        # ν•΄λ‹Ή ν’ˆμ‚¬κ°€ 쑰사, μ–΄λ―Έ, ꡬ두점이면 μ œμ™Έν•˜κ³  append 둜 인덱슀 0번 κ°’λ§Œ λ‹€μ‹œ λ¦¬μŠ€νŠΈμ— λ‹΄μ•„μ€λ‹ˆλ‹€.
        if word[1] not in ['Josa', 'Eomi', 'Punctuation']:
            clean_text.append(word[0])
    # " ".join() 으둜 곡백문자둜 μ—°κ²°ν•΄ μ£Όλ©΄ λ‹€μ‹œ λ¬Έμž₯이 λ©λ‹ˆλ‹€.
    return " ".join(clean_text)

okt_clean("λ‹¬λ‹¬ν•œκ±° λ¨Ήκ³  싢은데 λ„Œ μ–΄λ•Œ?")

>>>
'달달 ν•œ κ±° λ¨Ήλ‹€ μ‹Άλ‹€ λ„Œ μ–΄λ–»λ‹€'

1105 μ‹€μŠ΅

πŸ’‘ μ‹€μŠ΅ λͺ©μ : μ‹œν€€μŠ€ λ°©μ‹μ˜ 인코딩을 μ‚¬μš©ν•΄ 보고, Bag of Words 와 TF-IDF 방식과 μ‹œν€€μŠ€ 방식이 μ–΄λ–€ 차이가 μžˆλŠ”μ§€ μ•Œμ•„λ³΄κΈ°

πŸ’‘ μ‹€μŠ΅ 흐름
1) Tokenizer μΈμŠ€ν„΄μŠ€λ₯Ό 생성
2) fit_on_texts와 word_indexλ₯Ό μ‚¬μš©ν•˜μ—¬ key value둜 이루어진 λ”•μ…”λ„ˆλ¦¬λ₯Ό 생성
3) texts_to_sequencesλ₯Ό μ΄μš©ν•˜μ—¬ text λ¬Έμž₯을 숫자둜 이루어진 리슀트둜 λ³€κ²½
4) λ§ˆμ§€λ§‰μœΌλ‘œ pad_sequencesλ₯Ό μ΄μš©ν•˜μ—¬ 리슀트의 길이λ₯Ό 톡일화

πŸ“Œ Tokenizer

tf.keras.preprocessing.text.Tokenizer(
    num_words=None,
    filters='!"#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n',
    lower=True,
    split=' ',
    char_level=False,
    oov_token=None,
    analyzer=None,
    **kwargs
)
  1. 이 클래슀λ₯Ό μ‚¬μš©ν•˜λ©΄ 각 ν…μŠ€νŠΈλ₯Ό 일련의 μ •μˆ˜(각 μ •μˆ˜λŠ” 사전에 μžˆλŠ” ν† ν°μ˜ μΈλ±μŠ€μž„) λ˜λŠ” 단어 μˆ˜μ— 따라 각 ν† ν°μ˜ κ³„μˆ˜κ°€ 이진일 수 μžˆλŠ” λ²‘ν„°λ‘œ λ³€ν™˜ν•˜μ—¬ ν…μŠ€νŠΈ λ§λ­‰μΉ˜λ₯Ό 벑터화할 수 μžˆμŠ΅λ‹ˆλ‹€.(TF-IDF기반)

  2. λ§€κ°œλ³€μˆ˜
    num_words: 단어 λΉˆλ„μ— 따라 μœ μ§€ν•  μ΅œλŒ€ 단어 μˆ˜μž…λ‹ˆλ‹€. κ°€μž₯ 일반적인 단어 만 μœ μ§€λ©λ‹ˆλ‹€.
    filters: 각 μš”μ†Œκ°€ ν…μŠ€νŠΈμ—μ„œ 필터링될 문자인 λ¬Έμžμ—΄μž…λ‹ˆλ‹€. 기본값은 문자λ₯Ό μ œμ™Έν•œ λͺ¨λ“  ꡬ두점과 νƒ­ 및 쀄 λ°”κΏˆ 'μž…λ‹ˆλ‹€.
    lower: λΆ€μšΈ. ν…μŠ€νŠΈλ₯Ό μ†Œλ¬Έμžλ‘œ λ³€ν™˜ν• μ§€ μ—¬λΆ€μž…λ‹ˆλ‹€.
    split: str. 단어 뢄할을 μœ„ν•œ ꡬ뢄 κΈ°ν˜Έμž…λ‹ˆλ‹€.
    char_level: True이면 λͺ¨λ“  λ¬Έμžκ°€ ν† ν°μœΌλ‘œ μ²˜λ¦¬λ©λ‹ˆλ‹€.
    oov_token: 주어진 경우, 그것은 word_index에 μΆ”κ°€λ˜κ³  text_to_sequence 호좜 쀑에 μ–΄νœ˜ λ°–μ˜ 단어λ₯Ό λŒ€μ²΄ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.

πŸ’‘ num_words=vocab_sizeλ₯Ό μ§€μ •ν•˜λ©΄ ν•΄λ‹Ή λ¬Έμž₯의 단어 μˆ˜κ°€ μ§€μ •ν•œ vocab_sizeλ₯Ό λ„˜μœΌλ©΄ λΉˆλ„μˆ˜κ°€ 적은 λ‹¨μ–΄λŠ” μ œμ™Έν•˜κ³  좜λ ₯ν•œλ‹€. (= λΉˆλ„μˆ˜κ°€ 높은 λ‹¨μ–΄λ§Œ vocab_size - 1 만큼 좜λ ₯)

단어 수λ₯Ό λ„ˆλ¬΄ 많이 μ§€μ •ν•˜λ©΄ λ‚˜μ€‘μ— ν•™μŠ΅μ„ ν•  λ•Œ λ„ˆλ¬΄ 였래 걸릴 수 있고 λ¬Έμž₯ 길이가 λ‹€ μ œκ°κ°μž…λ‹ˆλ‹€. 단어 수λ₯Ό μ œν•œν•˜λ©΄ μ–΄νœ˜μ— μ—†λŠ” 단어가 λ“±μž₯ν–ˆμ„ λ•Œ μ‹œν€€μŠ€μ— λˆ„λ½μ΄ 되기 λ•Œλ¬Έμ— 이런 값을 μ²˜λ¦¬ν•˜λŠ” 방법이 μžˆμŠ΅λ‹ˆλ‹€.
oov_token(out-of-vocabulary)을 μ‚¬μš©ν•˜λ©΄ μ—†λŠ” μ–΄νœ˜λŠ” μ—†λŠ” μ–΄νœ˜λΌκ³  ν‘œν˜„ν•΄ μ€λ‹ˆλ‹€.

πŸ€” oov_token κ°’μœΌλ‘œ 넣어쀄 수 μžˆλŠ” 값은 어떀것듀이 μžˆλ‚˜μš”?
λ§ˆμŠ€ν¬κ°’, μ’…κ²°, νŒ¨λ”© λ“±μœΌλ‘œ μ‚¬μš©ν•˜κΈ°λ„ ν•©λ‹ˆλ‹€.
"<oov>" λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  λ‹€λ₯Έ 문자λ₯Ό μ‚¬μš©ν•΄λ„ 상관은 μ—†μŠ΅λ‹ˆλ‹€.

[UNK]: unknown의 의미둜 많이 μ‚¬μš©ν•˜κΈ΄ ν•©λ‹ˆλ‹€

πŸ’‘ μΈλ±μŠ€κ°€ 0λΆ€ν„° μ‹œμž‘ν•˜μ§€ μ•Šκ³  1λΆ€ν„° μ‹œμž‘ν•œλ‹€.

tokenizer = Tokenizer(num_words=10, oov_token="<oov>")
tokenizer.fit_on_texts(corpus)
print(tokenizer.word_index)
print(corpus)
corpus_sequences = tokenizer.texts_to_sequences(corpus)
corpus_sequences

>>>
{'<oov>': 1, 'λ¬Έμ˜μž…λ‹ˆλ‹€': 2, 'μš΄ν–‰μ‹œκ°„': 3, 'seoul': 4, 'μ„œμšΈ': 5, 'μ½”λ‘œλ‚˜': 6, 'μƒμƒμ§€μ›κΈˆ': 7, '인천': 8, 'μ§€ν•˜μ² ': 9, 'bus': 10, 'λ²„μŠ€': 11}
['SEOUL μ„œμšΈ μ½”λ‘œλ‚˜ μƒμƒμ§€μ›κΈˆ λ¬Έμ˜μž…λ‹ˆλ‹€.?', '인천 μ§€ν•˜μ²  μš΄ν–‰μ‹œκ°„ λ¬Έμ˜μž…λ‹ˆλ‹€.!', 'Bus λ²„μŠ€ μš΄ν–‰μ‹œκ°„ λ¬Έμ˜μž…λ‹ˆλ‹€.#']
[[4, 5, 6, 7, 2], [8, 9, 3, 2], [1, 1, 3, 2]]

길이가 λ§žμ§€ μ•Šμ•„μ„œ μ œλŒ€λ‘œ numpy arrayκ°€ λ§Œλ“€μ–΄μ§€μ§€ μ•ŠλŠ”λ°, 이럴 λ•ŒλŠ” Padding 기법을 μ‚¬μš©ν•΄ 길이λ₯Ό 맞좰주면 λœλ‹€.

πŸ“Œ Encoding: Padding

기본적으둜 κ°€μž₯ 길이가 κ°€μž₯ κΈ΄ sequence에 맞좰 인코딩

βœ… 예제

pad_sequences(sequences, maxlen=None, dtype='int32',
			  padding='pre', truncating='pre', value=0.0)

>>> sequence = [[1], [2, 3], [4, 5, 6]]
>>> tf.keras.preprocessing.sequence.pad_sequences(sequence)
array([[0, 0, 1],
       [0, 2, 3],
       [4, 5, 6]], dtype=int32)

>>> tf.keras.preprocessing.sequence.pad_sequences(sequence, value=-1)
# 0λŒ€μ‹  -1둜 채움
array([[-1, -1,  1],
       [-1,  2,  3],
       [ 4,  5,  6]], dtype=int32)

>>> tf.keras.preprocessing.sequence.pad_sequences(sequence, padding='post')
# 0을 뒀에 μΆ”κ°€
array([[1, 0, 0],
       [2, 3, 0],
       [4, 5, 6]], dtype=int32)

>>> tf.keras.preprocessing.sequence.pad_sequences(sequence, maxlen=2)
array([[0, 1],
       [2, 3],
       [5, 6]], dtype=int32)

πŸ’‘ sequence λ°©μ‹μ˜ 인코딩은 μˆœμ„œλ₯Ό λ³΄μ‘΄ν•˜κΈ° λ•Œλ¬Έμ— RNN(μˆœμ„œλ₯Ό κ³ λ €ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜)μ—μ„œ λ‚˜μ€ μ„±λŠ₯을 λ‚Έλ‹€.
λ¨Έμ‹ λŸ¬λ‹μ—μ„œλŠ” sequence 방식 보닀 TF-IDFλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 더 λ‚˜μ€ μ„±λŠ₯을 λ‚Έλ‹€.

πŸ“Œ 1105 μ‹€μŠ΅ Summary

from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences

"""
1) tokenizer 뢈러였기
2) fit_on_text
3) sequence λ§Œλ“€κΈ°
4) padding
"""

tokenizer = Tokenizer(num_words=7, oov_token="[UNK]")
tokenizer.fit_on_texts(corpus2)
print(tokenizer.word_index)
print(corpus2)
corpus_sequences = tokenizer.texts_to_sequences(corpus2)
pads = pad_sequences(corpus_sequences, maxlen=10, padding="pre")
print(corpus2)
print(word_to_index)
print(pads)
np.array(pads)

>>>
{'[UNK]': 1, 'λ¬Έμ˜μž…λ‹ˆλ‹€': 2, 'μ½”λ‘œλ‚˜': 3, 'μ§€ν•˜μ² ': 4, 'μŠΉκ°•μž₯': 5, 'bus': 6, 'μ•ˆλ‚΄μž…λ‹ˆλ‹€': 7, 'covid19': 8, '거리두기와': 9, 'μƒμƒμ§€μ›κΈˆ': 10, 'μš΄ν–‰μ‹œκ°„κ³Ό': 11, 'μš”κΈˆ': 12, 'μ„ λ³„μ§„λ£Œμ†Œ': 13, 'μš΄ν–‰μ‹œκ°„': 14, '터미널': 15, 'μœ„μΉ˜': 16, '거리두기': 17, 'taxi': 18}
['COVID19 거리두기와 μ½”λ‘œλ‚˜ μƒμƒμ§€μ›κΈˆ λ¬Έμ˜μž…λ‹ˆλ‹€.', 'μ§€ν•˜μ²  μš΄ν–‰μ‹œκ°„κ³Ό μ§€ν•˜μ²  μš”κΈˆ λ¬Έμ˜μž…λ‹ˆλ‹€.', 'μ§€ν•˜μ²  μŠΉκ°•μž₯ λ¬Έμ˜μž…λ‹ˆλ‹€.', 'μ½”λ‘œλ‚˜ μ„ λ³„μ§„λ£Œμ†Œ λ¬Έμ˜μž…λ‹ˆλ‹€.', 'Bus μš΄ν–‰μ‹œκ°„ λ¬Έμ˜μž…λ‹ˆλ‹€.', 'BUS 터미널 μœ„μΉ˜ μ•ˆλ‚΄μž…λ‹ˆλ‹€.', 'μ½”λ‘œλ‚˜ 거리두기 μ•ˆλ‚΄μž…λ‹ˆλ‹€.', 'taxi μŠΉκ°•μž₯ λ¬Έμ˜μž…λ‹ˆλ‹€.']
['COVID19 거리두기와 μ½”λ‘œλ‚˜ μƒμƒμ§€μ›κΈˆ λ¬Έμ˜μž…λ‹ˆλ‹€.', 'μ§€ν•˜μ²  μš΄ν–‰μ‹œκ°„κ³Ό μ§€ν•˜μ²  μš”κΈˆ λ¬Έμ˜μž…λ‹ˆλ‹€.', 'μ§€ν•˜μ²  μŠΉκ°•μž₯ λ¬Έμ˜μž…λ‹ˆλ‹€.', 'μ½”λ‘œλ‚˜ μ„ λ³„μ§„λ£Œμ†Œ λ¬Έμ˜μž…λ‹ˆλ‹€.', 'Bus μš΄ν–‰μ‹œκ°„ λ¬Έμ˜μž…λ‹ˆλ‹€.', 'BUS 터미널 μœ„μΉ˜ μ•ˆλ‚΄μž…λ‹ˆλ‹€.', 'μ½”λ‘œλ‚˜ 거리두기 μ•ˆλ‚΄μž…λ‹ˆλ‹€.', 'taxi μŠΉκ°•μž₯ λ¬Έμ˜μž…λ‹ˆλ‹€.']
{'λ¬Έμ˜μž…λ‹ˆλ‹€': 1, 'μš΄ν–‰μ‹œκ°„': 2, 'seoul': 3, 'μ„œμšΈ': 4, 'μ½”λ‘œλ‚˜': 5, 'μƒμƒμ§€μ›κΈˆ': 6, '인천': 7, 'μ§€ν•˜μ² ': 8, 'bus': 9, 'λ²„μŠ€': 10}
[[0 0 0 0 0 1 1 3 1 2]
 [0 0 0 0 0 4 1 4 1 2]
 [0 0 0 0 0 0 0 4 5 2]
 [0 0 0 0 0 0 0 3 1 2]
 [0 0 0 0 0 0 0 6 1 2]
 [0 0 0 0 0 0 6 1 1 1]
 [0 0 0 0 0 0 0 3 1 1]
 [0 0 0 0 0 0 0 1 5 2]]
array([[0, 0, 0, 0, 0, 1, 1, 3, 1, 2],
       [0, 0, 0, 0, 0, 4, 1, 4, 1, 2],
       [0, 0, 0, 0, 0, 0, 0, 4, 5, 2],
       [0, 0, 0, 0, 0, 0, 0, 3, 1, 2],
       [0, 0, 0, 0, 0, 0, 0, 6, 1, 2],
       [0, 0, 0, 0, 0, 0, 6, 1, 1, 1],
       [0, 0, 0, 0, 0, 0, 0, 3, 1, 1],
       [0, 0, 0, 0, 0, 0, 0, 1, 5, 2]], dtype=int32)

πŸ’‘ λŒ€λ¬ΈμžλŠ” μžλ™μœΌλ‘œ μ†Œλ¬Έμžλ‘œ λ³€ν™˜λ¨.
πŸ’‘ num_wordsλ₯Ό λ¬Έμž₯ 길이에 λΉ„ν•΄ λ„ˆλ¬΄ μž‘κ²Œ μ„€μ •ν•˜λ©΄ oovκ°€ λ„ˆλ¬΄ 많이 μƒκΈ°κ²Œ λ˜μ–΄ μ„±λŠ₯이 μ•ˆ 쒋아진닀. λ¬Έμž₯이 λ„ˆλ¬΄ κΈΈλ©΄ num_wordsλ₯Ό μ„€μ •ν•˜μ§€ μ•ŠλŠ” 것도 방법.

  • tokenizer의 word_index 속성은 단어와 숫자의 ν‚€-κ°’ μŒμ„ ν¬ν•¨ν•˜λŠ” λ”•μ…”λ„ˆλ¦¬λ₯Ό λ°˜ν™˜ν•œλ‹€.
  • fit_on_texts() λ©”μ„œλ“œλŠ” 문자 데이터λ₯Ό μž…λ ₯λ°›μ•„μ„œ λΉˆλ„μˆ˜λ₯Ό κΈ°μ€€μœΌλ‘œ 단어 집합을 μƒμ„±ν•œλ‹€.
  • TokenizerλŠ” μ •μˆ˜ 인코딩을 μˆ˜ν–‰ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.
    to_categoricla()λŠ” μ •μˆ˜ 인코딩 κ²°κ³Όλ₯Ό μž…λ ₯으둜 λ°›μ•„ λ°”λ‘œ 원-ν•« 인코딩 과정을 μˆ˜ν–‰ν•˜λŠ” 방법이닀.
  • texts_to_sequences() λ©”μ„œλ“œλŠ” ν…μŠ€νŠΈ μ•ˆμ˜ 단어듀을 숫자의 μ‹œν€€μŠ€μ˜ ν˜•νƒœλ‘œ λ³€ν™˜ν•œλ‹€.

[4,1,2]

1106 μ‹€μŠ΅

πŸ€” μˆœμ„œ, λ§₯락, μ‹œν€€μŠ€ κ°€ μ€‘μš”ν•œ λ°μ΄ν„°λŠ” μ–΄λ–€ 데이터가 μžˆμ„κΉŒμš”?
μ‹œκ³„μ—΄λ°μ΄ν„°, 주식, 날씨, 악보

μˆœμ„œκ°€ μ€‘μš”ν•œ μ‹œκ³„μ—΄ 데이터(μ£Όκ°€ 데이터 λ“±)λŠ” μ„žμ§€ μ•Šκ³  μˆœμ„œλŒ€λ‘œ λ‚˜λˆ„κΈ°λ„ ν•œλ‹€.

πŸ“Œ RNN

RNN (Recurrent Neural Network)은 μ‹œκ³„μ—΄ λ˜λŠ” μžμ—°μ–΄μ™€ 같은 μ‹œν€€μŠ€ 데이터λ₯Ό λͺ¨λΈλ§ν•˜λŠ” 데 κ°•λ ₯ν•œ 신경망 ν΄λž˜μŠ€μž…λ‹ˆλ‹€.

πŸ“Œ RNN μœ ν˜•

μž…λ ₯ 갯수 좜λ ₯ κ°―μˆ˜μ— λ”°λΌμ„œ one to many, many to one, many to many 둜 λ‚˜λˆ μ§€μ§€λ§Œ 핡심은 νƒ€μž„μŠ€ν…μœΌλ‘œ 이전 hidden state 의 아웃풋과 ν˜„μ‹œμ μ˜ 인
풋이 ν•¨κ»˜ μ—°μ‚°

좜처 : http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture10.pdf

  • One to one - κ°€μž₯ 기본적인 λͺ¨λΈ
  • One to many - ν•˜λ‚˜μ˜ 이미지λ₯Ό 톡해 λ¬Έμž₯으둜 ν‘œν˜„ν•  수 있음
  • Many to one - μ˜ν™” 리뷰λ₯Ό 톡해 긍정 λ˜λŠ” λΆ€μ •μœΌλ‘œ 감정을 λΆ„λ₯˜ κ°€λŠ₯
  • Many to many - μ—¬λŸ¬ 개의 단어λ₯Ό μž…λ ₯λ°›μ•„ μ—¬λŸ¬ 개의 λ‹¨μ–΄λ‘œ κ΅¬μ„±λœ λ¬Έμž₯을 λ°˜ν™˜ν•˜λŠ” λ²ˆμ—­κΈ°, λ™μ˜μƒμ˜ 경우 μ—¬λŸ¬ 개의 이미지 ν”„λ ˆμž„μ— λŒ€ν•΄ μ—¬λŸ¬ 개의 μ„€λͺ…μ΄λ‚˜ λ²ˆμ—­ ν˜•νƒœλ‘œ 좜λ ₯

πŸ€” RNN λͺ¨λΈμ„ λ§Œλ“€ μ˜ˆμ •μ΄λ©° 좜λ ₯측은 기쑴에 λ§Œλ“€μ—ˆλ˜ κ²ƒμ²˜λŸΌ λ§Œλ“€ μ˜ˆμ •μž…λ‹ˆλ‹€. "ν–‰μ •", "경제", "볡지" label을 one-hot-encoding 을 ν•΄μ£ΌλŠ” 이유?
λΆ„λ₯˜ λͺ¨λΈμ˜ 좜λ ₯측을 softmax둜 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ.

softmax λŠ” 각 클래슀의 ν™•λ₯ κ°’을 λ°˜ν™˜ν•˜λ©° 각각의 클래슀의 합계λ₯Ό κ΅¬ν–ˆμ„ λ•Œ 1이 λ©λ‹ˆλ‹€.

πŸ™‹πŸ»β€β™€οΈ 질문

Q: tqdm 의 μ‚¬μš©λͺ©μ μ€ λ¬΄μ—‡μΌκΉŒμš”?
A: 였래 κ±Έλ¦¬λŠ” μž‘μ—…μ„ ν•  λ•Œ μ§„ν–‰μƒνƒœλ₯Ό ν‘œμ‹œν•΄μ€λ‹ˆλ‹€.


✏️ TIL

  • 사싀(Fact): RNN에 λŒ€ν•΄ λ°°μ› λ‹€.
  • λŠλ‚Œ(Feeling): κ°‘μžκΈ° μ–΄λ €μ›Œμ‘Œλ‹€.
  • κ΅ν›ˆ(Finding): λ³΅μŠ΅ν•˜μž 볡슡!
profile
데이터 뢄석가가 되기 μœ„ν•œ 기둝 ✏️

0개의 λŒ“κΈ€