λ°μν
- μ€λλ§μ NLP κ΄λ ¨ κΈμ μ°λ€μ.. μκ° λλλλ‘ μ΄μ¬ν μ°κ³ μ¬λ € 보λλ‘ νκ² μ΅λλ€.
Thesaursus - μμλ¬μ€
μμλ¬μ€(Thesaurus)λ λ¨μ΄μ κ·Έ μλ―Έλ₯Ό μ°κ²°μμΌμ£Όλ λꡬμ λλ€.
μ£Όλ‘ νΉμ λ¨μ΄μ μλ―Έμ μΌλ‘ μ μ¬ν λ¨μ΄(λμμ΄)μ λ°λ μλ―Έλ₯Ό κ°μ§ λ¨μ΄(λ°μμ΄)λ₯Ό μ 곡νμ¬, κΈμ μ°κ±°λ λ§μ ν λ λ€μν ννμ μ¬μ©ν μ μλλ‘ λμ΅λλ€.
- λ€λ₯Έ μλ―Έλ‘ λ§νλ©΄, μ μμ΄ μ¬μ μΌλ‘ 'λ»μ΄ κ°μ λ¨μ΄(λμμ΄)'λ 'λ»μ΄ λΉμ·ν λ¨μ΄(μ μμ΄)'κ° ν κ·Έλ£ΉμΌλ‘ λΆλ₯λμ΄ μμ΅λλ€.
- λν NLPμμ μ΄μ©λλ μμλ¬μ€μμλ λ¨μ΄ μ¬μ΄μ 'μμ, νμ' νΉμ 'μ 체, λΆλΆ'λ± λ μΈμΈν κ΄κ³κΉμ§ μ μν΄λ κ²½μ°κ° μμ΅λλ€.
- μλ₯Ό λ€μ΄μ μλμ κ·Έλν μ²λΌ κ΄κ³λ₯Ό μ μν©λλ€.
- μ΄μ²λΌ λͺ¨λ λ¨μ΄μ λ°ν μ μμ΄ μ§ν©μ λ§λ λ€μ, λ¨μ΄λ€μ κ΄κ³λ₯Ό κ·Έλνλ‘ νννμ¬, λ¨μ΄ μ¬μ΄μ μ°κ²°μ μ μν μ μμ΅λλ€.
WordNet
NLPλΆμΌμμ κ°μ₯ μ λͺ ν μμλ¬μ€λ WordNetμ λλ€.
- WordNetμ νλ¦°μ€ν΄ λνκ΅μμ κ°λ°λ μμ΄ μ΄ν λ°μ΄ν°λ² μ΄μ€μ λλ€.
- μ¬λμ μΈμ΄ μ΄ν΄λ₯Ό λκΈ° μν΄ λ§λ€μ΄μ‘μΌλ©°, λ¨μ΄ κ°μ μλ―Έ κ΄κ³λ₯Ό μ€μ¬μΌλ‘ ꡬμ±λμ΄ μμ΅λλ€.
- μ΄ν κ΄κ³λ§: WordNetμ λ¨μ΄λ₯Ό λμμ΄ μ§ν©(synset)μΌλ‘ κ·Έλ£Ήννμ¬, κ° κ·Έλ£Ήμ΄ νΉμ κ°λ μ λνλ΄λλ‘ ν©λλ€. μ΄λ₯Ό ν΅ν΄ κ°μ μλ―Έλ₯Ό κ°μ§λ λ€μν λ¨μ΄λ€μ μ½κ² μ°Ύμ μ μμ΅λλ€.
- μλ―Έ κ΄κ³: λ¨μ΄λ€ κ°μ λ€μν μλ―Έ κ΄κ³λ₯Ό μ μν©λλ€. μλ₯Ό λ€μ΄, μμμ΄/νμμ΄(hypernym/hyponym), λ°μμ΄(antonym), λΆλΆ/μ 체 κ΄κ³(meronym/holonym) λ±μ ν¬ν¨ν©λλ€.
- λμμ΄μ μ μ: κ° λμμ΄ μ§ν©μλ κ·Έ μλ―Έλ₯Ό μ€λͺ νλ μ μ(gloss)κ° ν¬ν¨λμ΄ μμ΄, λ¨μ΄μ μ νν μλ―Έλ₯Ό νμ ν μ μμ΅λλ€.
- λ€μ€ κ°κ°: νλμ λ¨μ΄κ° μ¬λ¬ κ°μ§ μλ―Έλ₯Ό κ°μ§ μ μλ κ²½μ°, WordNetμ κ° μλ―Έλ₯Ό λ³λλ‘ μ μνκ³ κ΄λ ¨ λ¨μ΄λ₯Ό μ°κ²°νμ¬ μ 곡ν©λλ€.
- κ·Έλ¦¬κ³ , WordNetμ μ¬μ©νλ©΄ 'μ μμ΄'λ₯Ό μ»κ±°λ 'λ¨μ΄ λ€νΈμν¬'λ₯Ό μ΄μ©νμ¬ λ¨μ΄ μ¬μ΄μ μ μ¬λλ₯Ό ꡬν μ μμ΅λλ€.
Thesaursus(μμλ¬μ€)μ λ¬Έμ μ
WordNetκ³Ό κ°μ Thesaursus(μμλ¬μ€)μλ μλ§μ λ¨μ΄μ λ°ν λμμ΄, κ³μΈ΅ ꡬ쑰λ±μ κ΄κ³κ° μ μλμ΄ μμ΅λλ€.
- κ·Έλ¦¬κ³ μ΄ Thesaursus(μμλ¬μ€)λ₯Ό μ΄μ©νλ©΄ 'λ¨μ΄μ μλ―Έ'λ₯Ό (κ°μ μ μΌλ‘λΌλ) μ»΄ν¨ν°μ μ λ¬ν μ μμ΅λλ€.
- νμ§λ§ μ΄μ²λΌ μ¬λμ΄ μμμ μΌλ‘ labelingνλ λ°©μμλ ν¬λν° κ²°μ μ΄ μ‘΄μ¬ν©λλ€.
μλ λ³νμ λμνκΈ° μ΄λ ΅μ΅λλ€.
- μ°λ¦¬κ° μ¬μ©νλ λ§μ λλλ‘ μλ‘μ΄ λ¨μ΄κ° μ겨λκ³ , μλ§μ μΈμ κ° μνμ§λλ€. λν μλμ λ°λΌ μΈμ΄μ μλ―Έκ° λ³νκΈ°λ μμ΅λλ€.
- μ΄λ° λ¨μ΄μ λ³νμ λμνλ €λ©΄ Thesaursus(μμλ¬μ€)λ₯Ό μ¬λμ΄ μμμ μΌλ‘ λμμμ΄ κ°±μ ν΄μΌ ν©λλ€.
μ¬λμ μ°λ λΉμ©μ ν¬λ€
- Thesaursus(μμλ¬μ€)λ₯Ό λ§λλ λ°λ μμ²λ μΈμ λΉμ©μ΄ λ°μν©λλ€.
- μμ΄λ₯Ό μλ‘ λ€λ©΄, νμ‘΄νλ μμ΄ λ¨μ΄μ μλ 1,000λ§ κ°κ° λλλ€κ³ ν©λλ€. λ°λΌμ μ΄μμ μΌλ‘λ μ΄ λ°©λν λ¨μ΄λ€ λͺ¨λμ λν΄ λ¨μ΄ μ¬μ΄μ κ΄κ³λ₯Ό μ μν΄μ€μΌ ν©λλ€.
- μ°Έκ³ λ‘ WordNetμ λ±λ‘λ λ¨μ΄λ 20λ§ κ° μ΄μμ λλ€.
λ¨μ΄μ λ―Έλ¬ν μ°¨μ΄λ₯Ό ννν μ μλ€.
- Thesaursus(μμλ¬μ€)λ λ»μ΄ λΉμ·ν λ¨μ΄λ€μ λ¬Άμ΅λλ€.
- κ·Έλ¬λ μ€μ λ‘ λΉμ·ν λ¨μ΄λ€μ΄λΌλ λ―Έλ¬ν μ°¨μ΄κ° μμ΅λλ€. μμ»¨λ ‘λΉν°μ§[vintage, λ‘κ³ μ€λλ κ²]’μ ‘λ νΈλ‘[retro, λ³΅κ³ ]’λ μλ―Έκ° κ°μ§λ§, μ©λ²μ λ€λ¦ λλ€.
- Thesaursus(μμλ¬μ€)μμλ μ΄λ¬ν λ―Έλ¬ν μ°¨μ΄λ₯Ό ννν μ μμ΅λλ€. κ·Έλ λ€κ³ μ΄λ₯Ό μμμ μΌλ‘ νννλ €λ©΄ λ§€μ° κ³€λν©λλ€.
μ΄μ²λΌ μμλ¬μ€λ₯Ό μ¬μ©νλ κΈ°λ²(λ¨μ΄μ μλ―Έλ₯Ό μ¬λμ΄ μ μνλ κΈ°λ²)μλ 컀λ€λ λ¬Έμ κ° μμ΅λλ€.
μ΄ λ¬Έμ λ₯Ό νΌνκΈ° μν΄, μ¬μ©νλ ‘ν΅κ³ κΈ°λ° κΈ°λ²’ κ³Ό μ κ²½λ§μ μ¬μ©ν ‘μΆλ‘ κΈ°λ° κΈ°λ²’ μ λ°νμ¬ μμλ³΄κ² μ΅λλ€.
ν΅κ³ κΈ°λ° κΈ°λ²
μ°λ¦¬λ ν΅κ³ κΈ°λ° κΈ°λ²μ μ¬μ©νλ©΄μ Corpus(λ§λμΉ)λ₯Ό μ΄μ©ν κ²λλ€.
- Corpusλ κ°λ¨ν λ§νλ©΄ λλμ Test Dataμ λλ€.
- λ€λ§ Corpusλ NLPμ°κ΅¬μμμ μΌλλ₯Ό λκ³ μμ§λ Test Dataλ₯Ό μΌλ°μ μΌλ‘ "Corpus(λ§λͺ½μΉ)" λΌκ³ ν©λλ€.
- λν ν΅κ³ κΈ°λ° κΈ°λ²μ λͺ©νλ μ΄μ²λΌ μ¬λμ μ§μμΌλ‘ κ°λν Corpus(λ§λμΉ)μμ μλμΌλ‘, ν¨μ¨μ μΌλ‘ κ·Έ ν΅μ¬μ μΆμΆνλ κ²μ λλ€.
μμ°μ΄ μ²λ¦¬μ μ¬μ©λλ λ§λμΉμλ ν μ€νΈ λ°μ΄ν°μ λν μΆκ° μ λ³΄κ° ν¬ν¨λλ κ²½μ°κ° μ μ΅λλ€
μ컨λ ν μ€νΈ λ°μ΄ν°μ λ¨μ΄ κ°κ°μ ‘νμ¬’κ° λ μ΄λΈλ§λ μ μμ΅λλ€
μ΄λ΄ κ²½μ° λ§λμ°¨λ μ»΄ν¨ν°κ° λ€λ£¨κΈ° μ¬μ΄ νν νΈλ¦¬ κ΅¬μ‘°λ‘ κ°κ³΅λμ΄ μ£Όμ΄μλ κ²μ΄ μΌλ°μ μ λλ€
μ΄ κΈμμλ λ¨μν ν μ€νΈ λ°μ΄ν°νλμ ν° ν μ€νΈ νμΌ)λ‘ μ£Όμ΄μ‘λ€κ³ κ°μ ν©λλ€
Corpus(λ§λμΉ) μ μ²λ¦¬ νκΈ° by Python
μμ°μ΄ μ²λ¦¬μλ λ€μν λ§λμΉκ° μ¬μ©λ©λλ€
- μ λͺ ν κ²μΌλ‘λ μν€λ°±κ³ΌWikipediaμ κ΅¬κΈ λ΄μ€Google News λ±μ ν μ€νΈ λ°μ΄ν°λ₯Ό λ€ μ μμ£
- λν μ °μ΅μ€νΌμ΄λ λμ°λ© μμΈν€ κ°μ λλ¬ΈνΈ μ μνλ€λ λ§λμΉλ‘ μ΄μ©λ©λλ€
- μ΄λ²μλ λ¬Έμ₯ νλλ‘ μ΄λ€μ§ λ¨μν ν μ€νΈλ₯Ό μ¬μ©ν©λλ€. νλ² ν΄λ³΄κ² μ΅λλ€.
text = 'You say goodbye and I say hello.'
- μ΄μ²λΌ λ¬Έμ₯ νλλ‘ μ΄λ€μ§ ν μ€νΈλ₯Ό Corpus(λ§λμΉ)λ‘ μ΄μ©ν©λλ€.
- μ€μ μ΄λΌλ©΄ μ΄ textμ μμ² ,λ§ κ°κ° λλ λ¬Έμ₯μ΄ (μ°μ΄μ΄) λ΄κ²¨ μμ κ²μ λλ€.
- λ€λ§, μ½κ² μ€λͺ νκΈ° μν΄μ μ΄ μμ ν μ€νΈ λ°μ΄ν° λ§μΌλ‘ μ μ²λ¦¬λ₯Ό ν΄λ³΄κ² μ΅λλ€.
- λ¨Όμ textλ₯Ό λ¨μ΄ λ¨μλ‘ λλ λ³΄κ² μ΅λλ€.
text = text.lower()
text = text.replace('.’, '.')
text
'you say goodbye and i say hello.'
words = text.split(' ')
words
['you','say','goodbye', ‘and’, 'i', 'say', 'hello', '.']
- lower() Methodλ₯Ό μ¬μ©νμ¬ λ¬Έμλ₯Ό μλ¬Έμλ‘ λ³νν©λλ€.
- κ·Έλ¦¬κ³ split() Methodλ₯Ό μ΄λνμ¬ κ³΅λ°±μ κΈ°μ€μΌλ‘ λΆν ν©λλ€.
- μ΄μ μλμ λ¬Έμ₯μ λ¨μ΄ λͺ©λ‘ ννλ‘ μ΄μ©ν μ μκ² λμμ΅λλ€.
- λ¨μ΄ λ¨μλ‘ λΆν λμ΄ λ€λ£¨κΈ°κ° μ¬μμ§ κ²μ μ¬μ€μ΄μ§λ§, λ¨μ΄λ₯Ό ν μ€νΈ κ·Έλλ‘ μ‘°μνκΈ°λ μ¬λ¬ λ©΄μμ λΆνΈν©λλ€.
- κ·Έλμ λ¨μ΄μ IDλ₯Ό λΆμ¬νκ³ , IDμ 리μ€νΈλ‘ μ΄μ©ν μ μλλ‘ ν λ² λ μμ§ν©λλ€.
- μ΄λ₯Ό μν μ¬μ μ€λΉλ‘, νμ΄μ¬μ λμ λ리λ₯Ό μ΄μ©νμ¬ λ¨μ΄ IDμ λ¨μ΄λ₯Ό μ§μ§μ΄μ£Όλ λμνλ₯Ό μμ±ν©λλ€.
>>> word_to_id = {}
>>> id_to_word = {}
>>> for word in words:
... if word not in word_to_id:
... new_id = len(word_to_id)
... word_to_id[word] = new_id
... id_to_word[new_id] = word
- λ¨μ΄ IDμμ λ¨μ΄λ‘μ λ³νμ id_to_wordκ° λ΄λΉνλ©°(ν€κ° λ¨μ΄ ID, κ°μ΄ λ¨μ΄), λ¨μ΄μμ λ¨μ΄ IDλ‘μ λ³νμ word_to_idκ° λ΄λΉν©λλ€.
- μμ μ½λλ λ¨μ΄ λ¨μλ‘ λΆν λ wordsμ κ° μμλ₯Ό μ²μλΆν° νλμ© μ΄ν΄λ³΄λ©΄μ, λ¨μ΄κ° word_to_idμ λ€μ΄ μμ§ μμΌλ©΄ word_to_idμ id_to_word κ°κ°μ μλ‘μ΄ IDμ λ¨μ΄λ₯Ό μΆκ°ν©λλ€.
- λν μΆκ° μμ μ λμ λ리 κΈΈμ΄κ° μλ‘μ΄ λ¨μ΄μ IDλ‘ μ€μ λκΈ° λλ¬Έμ λ¨μ΄ IDλ 0, 1, 2, … μμΌλ‘ μ¦κ°ν©λλ€.
- μλλ λ¨μ΄ IDμ λ¨μ΄μ λμνμ λλ€.
>>> id_to_word
{0: 'you', 1: 'say', 2: 'goodbye', 3: 'and', 4: 'i', 5: 'hello', 6: '.'}
>>> word_to_id
{'you': 0, 'say': 1, 'goodbye': 2, 'and': 3, 'i': 4, 'hello': 5, '.': 6}
- μ΄μ²λΌ λμ λ리λ₯Ό μ¬μ©νλ©΄ λ¨μ΄λ₯Ό κ°μ§κ³ λ¨μ΄ IDλ₯Ό κ²μνκ±°λ, λ°λλ‘ λ¨μ΄ IDλ₯Ό κ°μ§κ³ λ¨μ΄λ₯Ό κ²μν μ μμ΅λλ€.
>>> id_to_word[1]
'say'
>>> word_to_id['hello']
5
- κ·ΈλΌ λ§μ§λ§μΌλ‘ ‘λ¨μ΄ λͺ©λ‘’μ ‘λ¨μ΄ ID λͺ©λ‘’μΌλ‘ λ³κ²½ν΄λ΄ μλ€.
- λ€μ μ½λμμλ νμ΄μ¬μ λ΄ν¬ comprehension νκΈ°λ₯Ό μ¬μ©νμ¬ λ¨μ΄ λͺ©λ‘μμ λ¨μ΄ ID λͺ©λ‘μΌλ‘ λ³νν λ€μ, λ€μ λνμ΄ λ°°μ΄λ‘ λ³ννμ΅λλ€.
λ΄ν¬λ 리μ€νΈλ λμ λ리 λ±μ λ°λ³΅λ¬Έ μ²λ¦¬λ₯Ό κ°λ¨νκ² μ°κΈ° μν κΈ°λ²μ λλ€.
>>> import numpy as np
>>> corpus = [word_to_id[w] for w in words]
>>> corpus = np.array(corpus)
>>> corpus
array([0, 1, 2, 3, 4, 1, 5, 6])
- μ΄κ²μΌλ‘ Corups(λ§λμΉ)λ₯Ό μ΄μ©νκΈ° μν μ¬μ μ€λΉλ₯Ό λ§μ³€μ΅λλ€.
- μ΄λ¬ν μ²λ¦¬λ₯Ό ν λ° λͺ¨μ preprocess()λΌλ ν¨μλ‘ κ΅¬νν΄ λ³΄κ² μ΅λλ€.
def preprocess(text):
text = text.lower()
text = text.replace('.', ' .')
words = text.split(' ')
word_to_id = {}
id_to_word = {}
for word in words:
if word not in word_to_id:
new_id = len(word_to_id)
word_to_id[word] = new_id
id_to_word[new_id] = word
corpus = np.array([word_to_id[w] for w in words])
return corpus, word_to_id, id_to_word
- μ΄ ν¨μλ₯Ό μ¬μ©νλ©΄ Corpus(λ§λμΉ) μ μ²λ¦¬λ₯Ό λ€μκ³Ό κ°μ΄ μνν μ μμ΅λλ€.
>>> text = 'You say goodbye and I say hello.'
>>> corpus, word_to_id, id_to_word = preprocess(text)
- μ΄κ²μΌλ‘ λ§λμΉ μ μ²λ¦¬κ° λλ¬μ΅λλ€.
- corpusλ λ¨μ΄ ID λͺ©λ‘, word_to_idλ λ¨μ΄μμ λ¨μ΄ IDλ‘μ λμ λ리, id_to_wordλ λ¨μ΄ IDμμ λ¨μ΄λ‘μ λμ λ리λ₯Ό λ»ν©λλ€.
- μ΄μμΌλ‘ λ§λμΉλ₯Ό λ€λ£° μ€λΉλ₯Ό λ§μ³€μ΅λλ€.
λ¨μ΄μ λΆμ° νν
- μΈμμ λ€μν μμ κ³ μ ν μ΄λ¦μΌλ‘ λΆλ₯Ό μλ μμ§λ§, RGBμ κ°μ 벑ν°λ‘ νννλ©΄ λ μ ννκ³ κ°κ²°νκ² ννν μ μμ΅λλ€.
- μ΄μ λ§μ°¬κ°μ§λ‘, λ¨μ΄λ Vector(벑ν°)λ‘ νννμ¬ κ·Έ μλ―Έλ₯Ό μ λννκ³ κ΄λ ¨μ±μ νμ ν μ μμ΅λλ€.
- μ΄λ¬ν λ¨μ΄μ λ²‘ν° ννμ 'λΆμ° νν'μ΄λΌκ³ νλ©°, μ΄λ μμ°μ΄ μ²λ¦¬ λΆμΌμμ λ¨μ΄μ μλ―Έλ₯Ό ν¨κ³Όμ μΌλ‘ νμ νκΈ° μν΄ μ€μν λ°©λ²μ λλ€.
Distributional Hypothesis - λΆν¬ κ°μ€
μ΅κ·Όμ NLP μ°κ΅¬λ€μ μ΄ν΄λ³΄λ©΄, μ€μν κΈ°λ²λ€μ΄ νλμ κ°λ¨ν μμ΄λμ΄μ κΈ°λ°νκ³ μμ΅λλ€.
λ°λ‘ 'λ¨μ΄μ μλ―Έλ μ£Όλ³ λ¨μ΄μ μν΄ νμ±λλ€' λΌλ κ²μ λλ€. μ΄λ₯Ό λΆν¬ κ°μ€ distributional hypothesis μ΄λΌκ³ ν©λλ€.
- λΆν¬ κ°μ€μ΄ λ§νκ³ μ νλ λ°λ λ§€μ° κ°λ¨ν©λλ€.
- λ¨μ΄ μ체μλ μλ―Έκ° μκ³ , κ·Έ λ¨μ΄κ° μ¬μ©λ ‘λ§₯λ½’(context)μ΄ μλ―Έλ₯Ό νμ±νλ€λ κ²μ΄μ£ .
- λ¬Όλ‘ μλ―Έκ° κ°μ λ¨μ΄λ€μ κ°μ λ§₯λ½μμ λ λ§μ΄ λ±μ₯ν©λλ€.
- μλ₯Ό λ€μ΄ "I drink beer"μ "We drink wine"μ²λΌ "drink"μ μ£Όλ³μλ μλ£κ° λ±μ₯νκΈ° μ¬μΈ κ²μ λλ€.
- μλμ κ·Έλ¦Όμ μ’μ°μ λ λ¨μ΄μ©μ΄ 'λ§₯λ½'μ ν΄λΉν©λλ€.
- ‘λ§₯λ½’μ΄λ νΉμ λ¨μ΄λ₯Ό μ€μ¬μ λ κ·Έ μ£Όλ³ λ¨μ΄λ₯Ό λ§ν©λλ€.
- κ·Έλ¦¬κ³ λ§₯λ½μ ν¬κΈ°(μ£Όλ³ λ¨μ΄λ₯Ό λͺ κ°λ ν¬ν¨ν μ§)λ₯Ό ‘μλμ° ν¬κΈ°’(window size)λΌκ³ ν©λλ€.
- μλμ° ν¬κΈ°κ° 1μ΄λ©΄ μ’μ° ν λ¨μ΄μ©μ΄, μλμ° ν¬κΈ°κ° 2μ΄λ©΄ μ’μ° λ λ¨μ΄μ©μ΄ λ§₯λ½μ ν¬ν¨λ©λλ€.
Co-occurence Matrix - λμλ°μ νλ ¬
Co-occurence Matrix(λμ λ°μ νλ ¬)μ μ΄λ€ λ¨μ΄λ₯Ό μ£Όλͺ©νμλ, κ·Έ μ£Όλ²μ μ΄λ€ λ¨μ΄κ° λͺ λ²μ΄λ λ±μ₯νλμ§λ₯Ό μΈμ΄ μ§κ³νλ λ°©λ²μ λλ€.
- νλ² μ½λλ‘ μ΄ν΄ λ³΄κ² μ΅λλ€.
import sys
sys.path.append('..')
import numpy as np
from common.util import preprocess
text = 'You say goodbye and I say hello.'
corpus, word_to_id, id_to_word = preprocess(text)
print(corpus)
# [0 1 2 3 4 1 5 6]
print(id_to_word)
# {0: 'you', 1: 'say', 2: 'goodbye', 3: 'and', 4: 'i', 5: 'hello', 6: '.'}
- preprocess ν¨μλ₯Ό μ¬μ©νμ¬ ν μ€νΈ λ°μ΄ν°λ₯Ό μ μ²λ¦¬ν©λλ€.
- λ¨Όμ , νμν λͺ¨λμ μν¬νΈνκ³ preprocess ν¨μλ₯Ό μ μν ν, μμ ν μ€νΈλ₯Ό μ μ²λ¦¬νμ¬ λ¨μ΄ IDλ‘ λ³νλ λ§λμΉμ λ¨μ΄-ID 맀ν λμ λ리λ₯Ό μμ±ν©λλ€.
- μ΄λ₯Ό ν΅ν΄ ν μ€νΈ λ°μ΄ν°λ₯Ό λ²‘ν° ννλ‘ λ³νν©λλ€.
- κ²°κ³Όλ₯Ό 보면 λ¨μ΄μκ° 7κ°μμ μ μ μμ΅λλ€.
- μ΄λ²μλ νλ² κ° λ¨μ΄μ λ§₯λ΅μ ν΄λΉνλ λ¨μ΄μ λΉλλ₯Ό μΈμ΄λ³΄κ² μ΅λλ€.
- Window ν¬κΈ°λ 1λ‘ νκ³ , λ¨μ΄ IDκ° 0μΈ "you"λΆν° λ³΄κ² μ΅λλ€.
- μμ κ·Έλ¦Όμμ λ³Ό μ μλ―, λ¨μ΄ "you"μ λ§₯λ΅μ "say" νλ λΏμ λλ€. μ΄λ₯Ό νλ‘ νννλ©΄ μλμ ν μ²λΌ λμ΅λλ€.
- λ¨μ΄ "you"μ λ§₯λ΅μΌλ‘μ¨ λμμ λ°μ(λ±μ₯)νλ λ¨μ΄μ λΉλλ₯Ό λνλ΄μμ΅λλ€.
- κ·Έλ¦¬κ³ μ΄λ₯Ό λ°νμΌλ‘ "you"λΌλ λ¨μ΄λ₯Ό [0, 1, 0, 0, 0, 0. 0]μ΄λΌλ 벑ν°λ‘ ννν μ μμ΅λλ€.
- κ·Έλ¦¬κ³ IDκ° 1μΈ "say"μ λν΄μλ κ°μ μμ μ μνν©λλ€. κ²°κ³Όλ μλμμ λ³Ό μ μμ΅λλ€.
- μ΄λ κ² "say"λΌλ λ¨μ΄λ Vector [1, 0, 1, 0, 1, 1, 0]μΌλ‘ ννν μ μμ΅λλ€.
- μ΄ λͺ¨λ μμ μ μνν κ²°κ³Όλ μλμ νκ³Ό κ°μ΅λλ€.
- μ΄ νλ λͺ¨λ λ¨μ΄μ λ°ν΄ λμλ°μνλ λ¨μ΄λ₯Ό νμ μ 리ν κ²μ λλ€. μ΄ νμ κ° νμ ν΄λΉ λ¨μ΄λ₯Ό ννν Vectorκ° λ©λλ€.
- κ·Έλ¦¬κ³ μ΄ νκ° Matrix(νλ ¬)μ ννλ₯Ό λ€λ€λ λ»μμ Co-occurence Matrix(λμλ°μ νλ ¬)μ΄λΌκ³ ν©λλ€. νλ² PythonμΌλ‘ ꡬνν΄λ³΄κ² μ΅λλ€.
C = np.array([
[0, 1, 0, 0, 0, 0, 0],
[1, 0, 1, 0, 1, 1, 0],
[0, 1, 0, 1, 0, 0, 0],
[0, 0, 1, 0, 1, 0, 0],
[0, 1, 0, 1, 0, 1, 0],
[0, 1, 0, 0, 1, 0, 1],
], dtype=np.int32)
- μ΄ Co-occurence Matrix(λμλ°μ νλ ¬)μ μ¬μ©νλ©΄ λ€μκ³Ό κ°μ λ°©μμΌλ‘ κ° λ¨μ΄μ Vectorλ₯Ό μ»μ μ μμ΅λλ€.
print(C[0]) # IDκ° 0μΈ λ¨μ΄μ λ²‘ν° νν
# [0 1 0 0 0 0 0]
print(C[4]) # IDκ° 4μΈ λ¨μ΄μ λ²‘ν° νν
# [0 1 0 1 0 1 0]
print(C[word_to_id['goodbye']]) # "goodbye"μ λ²‘ν° νν
# [0 1 0 1 0 1 0]
- Co-occurence Matrix(λμλ°μ νλ ¬)μ νμ©νλ©΄ λ¨μ΄λ₯Ό Vectorλ‘ λνλΌ μ μμ΅λλ€.
- κ·Έλ¦¬κ³ Co-occurence Matrix(λμλ°μ νλ ¬)μ μλνν μλ μμ΅λλ€.
- κ·Έλ¬λ©΄ Corpus(λ§λμΉ)λ‘λΆν° λμλ°μ νλ ¬μ λ§λ€μ΄μ£Όλ ν¨μλ₯Ό ꡬνν΄λ΄ μλ€.
- μΈμλ€μ μ°¨λ‘λ‘ λ¨μ΄ IDμ corpus(리μ€νΈ), vocab_size(μ΄ν μ), window_size=1(μλμ° ν¬κΈ°)λ₯Ό λνλ λλ€.
def create_co_matrix(corpus, vocab_size, window_size=1):
# λ§λμΉ(corpus)μ ν¬κΈ°λ₯Ό κ³μ°
corpus_size = len(corpus)
# λμλ°μ νλ ¬μ 0μΌλ‘ μ΄κΈ°ν. ν¬κΈ°λ (μ΄ν μ, μ΄ν μ)
co_matrix = np.zeros((vocab_size, vocab_size), dtype=np.int32)
# λ§λμΉμ κ° λ¨μ΄μ λν΄ λ°λ³΅
for idx, word_id in enumerate(corpus):
# νμ¬ λ¨μ΄μ μ’μ° window_size λ²μ λ΄μ λ¨μ΄λ€μ νμΈ
for i in range(1, window_size + 1):
left_idx = idx - i
right_idx = idx + i
# μ’μΈ‘ μλμ° μΈλ±μ€κ° 0 μ΄μμΌ κ²½μ°
if left_idx >= 0:
# μ’μΈ‘ λ¨μ΄μ IDλ₯Ό κ°μ Έμ λμλ°μ νλ ¬μ μ
λ°μ΄νΈ
left_word_id = corpus[left_idx]
co_matrix[word_id, left_word_id] += 1
# μ°μΈ‘ μλμ° μΈλ±μ€κ° λ§λμΉ ν¬κΈ°λ³΄λ€ μμ κ²½μ°
if right_idx < corpus_size:
# μ°μΈ‘ λ¨μ΄μ IDλ₯Ό κ°μ Έμ λμλ°μ νλ ¬μ μ
λ°μ΄νΈ
right_word_id = corpus[right_idx]
co_matrix[word_id, right_word_id] += 1
# μ΅μ’
λμλ°μ νλ ¬ λ°ν
return co_matrix
- μ΄ ν¨μλ λ¨Όμ co_matrixλ₯Ό 0μΌλ‘ μ±μμ§ 2μ°¨μ Arrayλ‘ μ΄κΈ°νν©λλ€.
- κ·Έλ€μμ Corpusμ λͺ¨λ λ¨μ΄ κ°κ°μ λνμ¬ Windowμ ν¬ν¨λ μ£Όλ³ λ¨μ΄λ₯Ό μΈμ΄λκ°λλ€.
- μ΄λ Corpusμ μΌμͺ½ λκ³Ό μ€λ₯Έμͺ½ λ κ²½κ³λ₯Ό λ²μ΄λμ§ μλμ§λ νμΈν©λλ€.
Vectorκ° μ μ¬λ
νλ² Vector μ¬μ΄μ μ μ¬λλ₯Ό μΈ‘μ νλ λ°©λ²μ μ΄ν΄λ³΄κ² μ΅λλ€.
- Vector(벑ν°) μ¬μ΄μ μ μ¬λλ₯Ό ννν λλ Cosine Similarity(μ½μ¬μΈ μ μ¬λ)λ₯Ό μμ£Ό μ΄μ©ν©λλ€.
- λ λ²‘ν° π₯=(π₯1,π₯2,π₯3,β― ,π₯π)κ³Ό μ΄ μλ€λ©΄, μ½μ¬μΈ μ μ¬λλ λ€μ μμΌλ‘ μ μλ©λλ€.
- λΆμμλ Vector(벑ν°)μ λ΄μ μ΄, λΆλͺ¨μλ κ° Vector(벑ν°)μ λ Έλ¦(norm)μ΄ λ±μ₯ν©λλ€.
- λ Έλ¦μ Vector(벑ν°)μ ν¬κΈ°λ₯Ό λνλΈ κ²μΌλ‘, μ¬κΈ°μλ λ Έλ¦μ κ³μ°ν©λλ€ ( λ Έλ¦μ 벑ν°μ κ° μμλ₯Ό μ κ³±ν΄ λν ν λ€μ μ κ³±κ·Όμ κ΅¬ν΄ κ³μ°ν©λλ€).
- μ΄μμ ν΅μ¬μ Vector(벑ν°)λ₯Ό μ κ·ννκ³ λ΄μ μ ꡬνλ κ²μ λλ€.
μ½μ¬μΈ μ μ¬λλ₯Ό μ§κ΄μ μΌλ‘ νμ΄λ³΄μλ©΄ ‘λ 벑ν°κ° κ°λ¦¬ν€λ λ°©ν₯μ΄ μΌλ§λ λΉμ·νκ°’μ λλ€.
λ 벑ν°μ λ°©ν₯μ΄ μμ ν κ°μΌλ©΄ μ½μ¬μΈ μ μ¬λκ° 1μ΄ λλ©°, μμ ν λ°λλΌλ©΄ -1μ΄ λ©λλ€.
- κ·Έλ¬λ©΄ μ΄μ Cosine Similarity(μ½μ¬μΈ μ μ¬λ)λ₯Ό Python ν¨μλ‘ κ΅¬νν΄ λ³΄κ² μ΅λλ€.
def cos_similarity(x, y):
nx = x / np.sqrt(np.sum(x**2)) # xμ μ κ·ν
ny = y / np.sqrt(np.sum(y**2)) # yμ μ κ·ν
return np.dot(nx, ny)
- ν¨μλ λ¨Όμ λ²‘ν° xμ yλ₯Ό μ κ·νν ν λ Vector(벑ν°)μ λ΄μ μ ꡬνμ΅λλ€.
- μ΄λ κ²λ§ ν΄λ Cosine Similarity(μ½μ¬μΈ μ μ¬λ)λ₯Ό ꡬν μ μμ΅λλ€λ§, μ¬μ€ μ΄ κ΅¬νμλ λ¬Έμ κ° νλ μμ΅λλ€.
- μΈμλ‘ Zero Vector(μ λ‘ λ²‘ν° - μμκ° λͺ¨λ 0μΈ Vector)κ° λ€μ΄μ€λ©΄ 0μΌλ‘ λλκΈ°(divide by zero) μ€λ₯κ° λ°μν©λλ€.
- μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ μ ν΅μ μΈ λ°©λ²μ λλμ λΆλͺ¨μ μμ κ°μ λν΄μ£Όλ κ²μ λλ€. μλλ κ°μ λ μ½λ μ λλ€.
def cos_similarity(x, y, eps=1e-8):
nx = x / (np.sqrt(np.sum(x ** 2)) + eps)
ny = y / (np.sqrt(np.sum(y ** 2)) + eps)
return np.dot(nx, ny)
- μλλ μ΅μ’ μ μΌλ‘ λ¨μ΄ "you"μ "i"μ μ μ¬λλ₯Ό ꡬνλ μ½λμ λλ€.
import sys
sys.path.append('..')
from common.util import preprocess, create_co_matrix, cos_similarity
text = 'You say goodbye and I say hello.'
corpus, word_to_id, id_to_word = preprocess(text)
vocab_size = len(word_to_id)
C = create_co_matrix(corpus, vocab_size)
c0 = C[word_to_id['you']] # "you"μ λ¨μ΄ 벑ν°
c1 = C[word_to_id['i']] # "i"μ λ¨μ΄ 벑ν°
print(cos_similarity(c0, c1))
# 0.7071067691154799
μ€ν κ²°κ³Ό "you"μ "i"μ μ½μ¬μΈ μ μ¬λλ 0.70...μΌλ‘ λμμ΅λλ€
μ½μ¬μΈ μ μ¬λ κ°μ -1μμ 1 μ¬μ΄μ΄λ―λ‘, μ΄ κ°μ λΉκ΅μ λλ€(μ μ¬μ±μ΄ ν¬λ€)κ³ λ§ν μ μμ΅λλ€.
μ μ¬ λ¨μ΄μ λνΉ νμ
μ΄λ€ λ¨μ΄κ° κ²μμ΄λ‘ μ£Όμ΄μ§λ©΄, κ·Έ κ²μμ΄μ λΉμ·ν λ¨μ΄λ₯Ό μ μ¬λ μμΌλ‘ μΆλ ₯νλ ν¨μλ μ΄λ¨κΉμ?
κ·Έ ν¨μ μ΄λ¦μ most_similar()λ‘ νκ³ , λ€μ μΈμλ€μ μ λ ₯λ°λλ‘ κ΅¬νν΄λ΄ μλ€.
most_similar(query, word_to_id, id_to_word, word_matrix, top=5)
- most_similar() ν¨μμ μΈμ
μΈμλͺ | μ€λͺ |
query | κ²μμ΄(λ¨μ΄) |
word_to_id | λ¨μ΄μμ λ¨μ΄ IDλ‘μ λμ λ리 |
id_to_word | λ¨μ΄ IDμμ λ¨μ΄λ‘μ λμ λ리 |
word_matrix | λ¨μ΄ 벑ν°λ€μ νλ° λͺ¨μ νλ ¬. κ° νμλ λμνλ λ¨μ΄μ 벑ν°κ° μ μ₯λμ΄ μλ€κ³ κ°μ νλ€. |
top | μμ λͺ κ°κΉμ§ μΆλ ₯ν μ§ μ€μ |
- most_similar() ν¨μμ ꡬνμ λ€μκ³Ό κ°μ΅λλ€.
def most_similar(query, word_to_id, id_to_word, word_matrix, top=5):
# 1. κ²μμ΄λ₯Ό κΊΌλΈλ€.
if query not in word_to_id:
print('%s(μ)λ₯Ό μ°Ύμ μ μμ΅λλ€.' % query)
return
print('\n[query] ' + query)
query_id = word_to_id[query]
query_vec = word_matrix[query_id]
# 2. μ½μ¬μΈ μ μ¬λ κ³μ°
vocab_size = len(id_to_word)
similarity = np.zeros(vocab_size)
for i in range(vocab_size):
similarity[i] = cos_similarity(word_matrix[i], query_vec)
# 3. μ½μ¬μΈ μ μ¬λλ₯Ό κΈ°μ€μΌλ‘ λ΄λ¦Όμ°¨μμΌλ‘ μΆλ ₯
count = 0
for i in (-1 * similarity).argsort():
if id_to_word[i] == query:
continue
print(' %s: %s' % (id_to_word[i], similarity[i]))
count += 1
if count >= top:
return
- μ΄ μ½λμ λμμμλ μλμ κ°μ΄ λμν©λλ€.
- κ²μμ΄μ λ¨μ΄ 벑ν°λ₯Ό κΊΌλ λλ€.
- κ²μμ΄μ λ¨μ΄ 벑ν°μ λ€λ₯Έ λͺ¨λ λ¨μ΄ 벑ν°μμ μ½μ¬μΈ μ μ¬λλ₯Ό κ°κ° ꡬν©λλ€.
- κ³μ°ν μ½μ¬μΈ μ μ¬λ κ²°κ³Όλ₯Ό κΈ°μ€μΌλ‘ κ°μ΄ λμ μμλλ‘ μΆλ ₯ν©λλ€.
- 3λ²μ§Έ μ½λμ λΆλΆμ λ°ν μ€λͺ μ μ‘°κΈλ§ λ§λΆμ΄λ©΄, similarity λ°°μ΄μ λ΄κΈ΄ μμμ μΈλ±μ€λ₯Ό λ΄λ¦Όμ°¨μμΌλ‘ μ λ ¬ν ν μμ μμλ€μ μΆλ ₯ν©λλ€.
- μ΄λ λ°°μ΄ μΈλ±μ€μ μ λ ¬μ λ°κΎΈλ λ° μ¬μ©ν argsort() λ©μλλ λνμ΄ λ°°μ΄μ μμλ₯Ό μ€λ¦μ°¨μμΌλ‘ μ λ ¬ν©λλ€.
- μλλ argsort() Methodμ μ¬μ© μμ μ λλ€.
>>> x = np.array([100, -20, 2])
>>> x.argsort()
array([1, 2, 0])
- μ΄μ²λΌ argsort()λ₯Ό μ¬μ©νλ©΄ λ¨μ΄μ μ μ¬λκ° λμ μμλ‘ μΆλ ₯ν μ μμ΅λλ€.
- μ΄κ²μ΄ most_similar() ν¨μμ ꡬνμ λλ€. νλ² "you"λ₯Ό κ²μμ΄λ‘ μ§μ ν΄ μ μ¬ν λ¨μ΄λ€μ μΆλ ₯ν΄λ³΄κ² μ΅λλ€.
import sys
sys.path.append('..') # μμ λλ ν 리λ₯Ό λͺ¨λ κ²μ κ²½λ‘μ μΆκ°
from common.util import preprocess, create_co_matrix, most_similar # νμν ν¨μλ€ μν¬νΈ
# μ
λ ₯ ν
μ€νΈ
text = 'You say goodbye and I say hello.'
# ν
μ€νΈ μ μ²λ¦¬: λ¨μ΄ λͺ©λ‘κ³Ό λ¨μ΄-μΈλ±μ€ 맀ν, μΈλ±μ€-λ¨μ΄ 맀ν μμ±
corpus, word_to_id, id_to_word = preprocess(text)
# μ΄ν μ¬μ μ ν¬κΈ°
vocab_size = len(word_to_id)
# λμλ°μ νλ ¬ μμ±
C = create_co_matrix(corpus, vocab_size)
# νΉμ λ¨μ΄μ μ μ¬ν λ¨μ΄λ€μ μ°Ύκ³ μΆλ ₯ (μ¬κΈ°μλ 'you'μ μ μ¬ν λ¨μ΄λ€)
most_similar('you', word_to_id, id_to_word, C, top=5)
- μλμ μ½λμ μ€ν κ²°κ³Ό μ λλ€.
[query] you
goodbye: 0.7071067691154799
i: 0.7071067691154799
hello: 0.7071067691154799
say: 0.0
and: 0.0
- μ΄ κ²°κ³Όλ κ²μμ΄ "you"μ μ μ¬ν λ¨μ΄λ₯Ό μμ 5κ°λ§ μΆλ ₯ν κ²μ λλ€.
- Cosine Similarity(μ½μ¬μΈ μ μ¬λ)λ ν΄λΉ λ¨μ΄μ μ€λ₯Έμͺ½μμ λ³Ό μ μμ΅λλ€.
- κ²°κ³Όλ₯Ό 보면 "you"μ κ°μ₯ κ°κΉμ΄ λ¨μ΄λ μ΄ 3κ°μΈλ°, μ°¨λ‘λ‘ "goodbye", "i(=λ)", "hello"μ λλ€.
- νμ€ν "i"μ "you" λͺ¨λ μΈμΉλλͺ μ¬μ΄λ―λ‘ λμ΄ λΉμ·νλ€λ 건 λ©λμ΄ λ©λλ€.
- νμ§λ§ "goodbye"μ "hello"μ Cosine Similarity(μ½μ¬μΈ μ μ¬λ)κ° λλ€λ κ²μ μ°λ¦¬μ μ§κ΄κ³Όλ κ±°λ¦¬κ° λ©μ£ .
- μ΄μ λ μ§κΈμ Corpus(λ§λμΉ), μ¦ λ°μ΄ν°μ μ ν¬κΈ°κ° λ무 μλ€λ κ²μ΄ μμΈμ΄λΌκ³ λ³Ό μ μμκ² κ°μ΅λλ€.
Summary
WordNet λ±μ Thesaursusλ₯Ό μ΄μ©νλ©΄ μ μμ΄λ₯Ό μ»κ±°λ λ¨μ΄ μ¬μ΄μ μ μ¬λλ₯Ό μΈ‘μ νλ λ± μ μ©ν μμ μ ν μ μλ€.
Thesaursus κΈ°λ° κΈ°λ²μ Thesaursusλ₯Ό μμ±νλ λ° μμ²λ μΈμ μμμ΄ λ λ€κ±°λ μλ‘μ΄ λ¨μ΄μ λμνκΈ° μ΄λ ΅λ€λ λ¬Έμ κ° μλ€.
νμ¬λ Corpus(λ§λμΉ)λ₯Ό μ΄μ©ν΄ λ¨μ΄λ₯Ό Vectorννλ λ°©μμ΄ μ£Όλ‘ μ°μΈλ€.
μ΅κ·Όμ λ¨μ΄ Vectorν κΈ°λ²λ€μ λλΆλΆ 'λ¨μ΄μ μλ―Έλ μ£Όλ³ λ¨μ΄μ μν΄ νμ±λλ€'λ λΆν¬ κ°μ€μ κΈ°μ΄νλ€.
ν΅κ³ κΈ°λ° κΈ°λ²μ Corpus(λ§λμΉ) μμ κ° λ¨μ΄μ λν΄μ κ·Έ λ¨μ΄μ μ£Όλ³ λ¨μ΄μ λΉλλ₯Ό μ§κ³νλ€ (Co-Occurance Matrix).
λ°μν
'π NLP (μμ°μ΄μ²λ¦¬) > π Natural Language Processing' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[NLP] μΆλ‘ κΈ°λ° κΈ°λ² & Neural Network (μ κ²½λ§) (0) | 2024.05.22 |
---|---|
[NLP] ν΅κ³ κΈ°λ° κΈ°λ² κ°μ νκΈ° (0) | 2024.05.20 |
[NLP] Transformer Model - νΈλμ€ν¬λ¨Έ λͺ¨λΈ μμ보기 (0) | 2024.03.07 |
[NLP] ν©μ±κ³±, μνμ κ²½λ§, Encoder, Decoderμμ μννλ Self-Attention (0) | 2024.03.01 |
[NLP] Attention - μ΄ν μ (0) | 2024.02.17 |