μ΄λ²μ NLP μ€ ν μ€νΈλ§μ΄λμ κ΄ν μλ£λ€μ κ°μ§κ³ μ€ν°λλ₯Ό ν΄λ³΄κ² λμλ€.
첫 μ£Όμ°¨μλ κ°λ¨νκ² ν μ€νΈ λΆμμ κ΄ν΄ μμλ³΄κ³ , μ½λλ₯Ό μμ±ν΄λ³΄μλ€.
μμΈν μ½λλ€μ κΉνλΈ μ°Έκ³ νκΈΈ λ°λλ€.
1. ν μ€νΈλ§μ΄λ, ν μ€νΈ λΆμ, μμ°μ΄ μ²λ¦¬μ μ°¨μ΄
μμνκΈ°μ μμ μ μΈ μ©μ΄λ€μ μ°¨μ΄λ₯Ό μμλ³΄κ³ μμνμ.
- ν μ€νΈλ§μ΄λ: ν μ€νΈ λ°μ΄ν°λ₯Ό νμ©ν λͺ¨λ μμ
- ν μ€νΈ λΆμ: μ’μ μλ―Έμ ν μ€νΈ(λ¬Έμ)μ νΉμ± νμ νλ κ²
- μμ°μ΄ μ²λ¦¬: ν μ€νΈλ§μ΄λμ μν ν μ€νΈ μ²λ¦¬ μμ
2. ν μ€νΈ λΆμμ μ’ λ₯
ν μ€νΈ λΆμμ μ’ λ₯λ λ€μκ³Ό κ°λ€:
- ν μ€νΈ μ λ³: μνλ μ 보λ₯Ό κ°μ§ ν μ€νΈλ§ μΆμΆ
- ν μ€νΈ μ 보 μΆμΆ: ν ν μ€νΈ λ΄μμ μνλ μ 보λ₯Ό μΆμΆ
- ν μ€νΈ μ£Όμ μ°ΎκΈ°: λΉλ λΆμ, ν ν½ λͺ¨λΈλ§ λ±μ νμ©
- ν μ€νΈ λΆλ₯: Logistic Regression, Deep Learning... λ±μ μ¬μ©
- ν μ€νΈ λ Όμ‘° λ° κ΄μ : κ°μ±λΆμ, μλ―Έ μ°κ²°λ§(Semantic Network) λΆμ
- ν μ€νΈ νΉμ± νμ : Word Embedding
3. ν μ€νΈ λΆμ κ³Όμ
ν μ€νΈ λΆμ κ³Όμ μ μμ§ -> μ μ²λ¦¬ -> λΆμ -> νκ° μμΌλ‘ μ΄λ£¨μ΄μ§λ€.
- μμ§: ν¬λ‘€λ§, μ€ν¬λν λ±μ ν΅ν λ°μ΄ν° μμ§
- μ μ²λ¦¬
- Cleaning: λΆνμν κΈ°νΈ μ κ±°
- Case Conversion: λμλ¬Έμ λ³ν
- Lemmatizing, Stemming: λ¨μ΄μ μν λλ μ΄κ° μ°ΎκΈ°
- has -> have / watched -> watch / flies -> fly
- μμ -> μμλ€
- Text Tokenizing: λ¨μ΄ λλ ν ν° λ¨μλ‘ μλΌμ£ΌκΈ°
- Tagging: λ¨μ΄ νμ¬ νκ·ΈνκΈ°
- Removing Stopwords: λΆμ©μ΄(Stopword) μ κ±°νκΈ°
- λΆμ
- νκ°
4. μ€μ΅ μ½λ
1. ν μ€νΈ μ μ²λ¦¬
μ κ°λ λ€λ‘, ν μ€νΈλ₯Ό μ μ²λ¦¬νκ³ μλν΄λΌμ°λλ₯Ό μμ±ν΄λ³΄μλ€.
λ°μ΄ν°λ‘λ it 맀거μ§μΈ μμ¦ ITλΌλ 맀거μ§μ λ°μ΄ν°λ₯Ό ν¬λ‘€λ§νμ¬ μ¬μ©νλ€.
path = '/content/drive/MyDrive/text-mining/αα
αα
³α·IT_2023.04.27.csv'
df = pd.read_csv(path); df
μ½λλ₯Ό μΆλ ₯νλ©΄, μ μ΄λ―Έμ§μ κ°μ΄ μΆλ ₯λμλ€.
# κ²°μΈ‘κ° κ°μ νμΈ
df.isnull().sum()
# κ²°μΈ‘ λ°μ΄ν° νμΈ
df[df['λΆλ₯'].isnull()]
# κ²°μΈ‘μΉ μ κ±°
df.dropna(inplace = True)
df.reset_index(inplace= True, drop = True)
μ΄ν μ μ½λλ₯Ό μ€ννμ¬ λ°μ΄ν°μ κ²°μΈ‘κ°μ νμΈνκ³ , ν΄λΉ κ²°μΈ‘μΉλ€μ λͺ¨λ μ κ±°νλ€.
# Text Cleaning
content_list = []
for k in range(len(df['λ³Έλ¬Έ'])):
content = df['λ³Έλ¬Έ'][k]
cleaned_content = re.sub(r'[^\s\w]', ' ', content) # cleaning
content_list.append(cleaned_content)
# Cleaning κ²°κ³Ό μ μ₯νκΈ°
df['λ³Έλ¬Έ_μ μ²λ¦¬'] = content_list; df
μ΄ν, λ³Έλ¬Έ ν μ€νΈλ₯Ό λͺ¨λ re (μ κ·ννμ)μΌλ‘ μ μ²λ¦¬ν ν, dfμ λ°λ‘ μ μ λ§λ€μ΄ μ μ₯νλ€.
μμ κ°μ μμ outputμ΄ λμλ€.
2. ν μ€νΈ ν ν°ν
# Okt νμ©νκΈ°
text = df['λ³Έλ¬Έ_μ μ²λ¦¬'][0]
word_list = okt.morphs(text) # morphsλ νμ¬ μμ΄ λͺ¨λ ν ν°λ€μ κ²°κ³Όλ₯Ό 보μ¬μ€λλ€.
stem_word_list = okt.morphs(text, stem = True) # stemμ Trueλ‘ νλ©΄ λ¨μ΄μ μνμΌλ‘ λ³νν κ²°κ³Όλ₯Ό 보μ¬μ€λλ€.
print(word_list, stem_word_list, sep = '\n')
μ΄ν, μμ κ°μ΄ Oktλ₯Ό νμ©νμ¬ νμ¬κ° μμ΄ κ΅¬λΆλ λ¨μ΄λ€κ³Ό, λ¨μ΄μ μνμΌλ‘ λ°λμ΄ κ΅¬λΆλ λ¨μ΄λ€μ κ²°κ³Όλ₯Ό μΆμΆνλ€. κ²°κ³Όλ λ€μκ³Ό κ°μλ€.
word_list = okt.pos(text, stem = True)
pos_list = ['Noun', 'Verb', 'Adjective']
[word for word in word_list if word[1] in pos_list]
λ€μμ list comprehension κΈ°λ²μΌλ‘ pos_list λ΄μ μ‘΄μ¬νλ νμ¬λ€λ§μΌλ‘ νν°λ§ν΄λ³΄μλ€.
μ΄ν, μ μ²λ¦¬νλ λ³Έλ¬Έλ€μ λν΄ μ€ν λ° μμ ν νμ¬λ₯Ό νκΉ νκ³ , νμ¬ νν°λ₯Ό μ μ©νμ¬ nounκ³Ό alpha νμ¬λ§ 골λΌλ΄λ³΄μλ€.
ν΄λΉ λ¨μ΄λ€μ word_list λΌλ νλμ 리μ€νΈλ‘ μ μ₯νλ€.
# νμ¬λ‘ νν°λ§νμ¬ μλ λ°ν
def pos_filtering(word_list):
pos_list = ['Noun', 'Alpha']
pos_filtered_word_list = [word[0] for word in word_list if word[1] in pos_list]
return pos_filtered_word_list
# μ€ν
λ° + νμ¬ νκ·ΈνκΈ°
df['λ³Έλ¬Έ_POS'] = df['λ³Έλ¬Έ_μ μ²λ¦¬'].map(lambda x: okt.pos(x, stem= True))
# νμ¬ νν° μ μ©νκΈ°
df['λ³Έλ¬Έ_λ¨μ΄'] = df['λ³Έλ¬Έ_POS'].map(pos_filtering)
# μλ 리μ€νΈ λ³ν©νκΈ°
word_list = sum(df['λ³Έλ¬Έ_λ¨μ΄'], [])
μ΅μ’ μ μΌλ‘, μ΄ 1261028κ°μ λ¨μ΄κ° μμλ€.
3. λΉλλΆμ
λ§μ§λ§μΌλ‘λ λ¨μ΄μ λΉλλ₯Ό λΆμνκΈ° μν΄ CounterVectorizer λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ€.
# λΉλλΆμ
c = Counter(word_list)
num = 100
# μμ 100κ° λ¨μ΄λ§ μΆλ ₯
print(c.most_common(num))
κ²°κ³Όλ λ€μκ³Ό κ°μλ€.
λ무 λ§μ΄ λ±μ₯νλ 무μλ―Έν λ¨μ΄λ€μ λΆμ©μ΄λ‘ μ€μ νκ³ , λ€μ λΉλλΆμμ νμ¬ ν΄λΉ μλλ€λ‘ μλν΄λΌμ°λλ₯Ό μμ±νλ€.
# λΆμ©μ΄
stopwords = ['μ', 'κ²', 'μ΄', 'λ', 'λ±', 'λ', 'λ₯Ό', 'κ·Έ', 'μ', 'κ²½μ°', 'ν΅ν΄', 'μν΄', 'μΌ', 'λ€λ₯Έ', 'κ°μ§', 'λν', 'μ', 'λν΄', 'μ€', 'λ΄', 'λλ¬Έ']
# λΆμ©μ΄ μ κ±° ν λΉλλΆμ
word_list = [word for word in word_list if word[0] not in stopwords]
print(c.most_common(num))
!pip install wordcloud
from wordcloud import WordCloud
word_dict = dict(c.most_common(100)) # λμ
λ리 ννλ‘ λ³ν
# μλν΄λΌμ°λ μ€μ νκΈ°
wc = WordCloud(font_path = 'NanumGothic.ttf',
background_color= 'white',
width = 3000, height = 2000,
min_font_size = 10)
cloud = wc.generate_from_frequencies(word_dict) # λμ
λ리 ννλ‘ μ μ₯λμ΄ μμ΄μΌ ν¨
μ΅μ’ μ μΈ κ²°κ³Όλ λ€μκ³Ό κ°μλ€.
μ΄λ κ², ν μ€νΈλ§μ΄λμ μ λ°μ μΈ κ°λ μ κ΄ν΄ μμλ³΄κ³ , 'μμ¦ IT'λΌλ 맀거μ§μμ ν¬λ‘€λ§ν λ°μ΄ν°λ‘ ν μ€νΈ μ μ²λ¦¬, ν ν°ν, λΉλλΆμνμ¬ μλν΄λΌμ°λκΉμ§ λ§λ€μ΄ 보μλ€.
'π μ€ν°λ > NLP' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Word2Vecμ κ΄νμ¬] - CBOW, Skip-gram (0) | 2023.07.25 |
---|---|
[NLP-μ€ν°λ] RNNμ κ΄νμ¬ (1) | 2023.06.29 |
[ν μ€νΈλ§μ΄λ] 2-2. λ¬Έμ μ μ¬λ - μ€νλ² μ€ λ€μ΄λ² λ¬Έμ μ μ¬λ ꡬνκΈ° (0) | 2023.06.19 |
[ν μ€νΈλ§μ΄λ] 2-1. ν μ€νΈ ννκ³Ό λ¬Έμ μ μ¬λ (0) | 2023.06.19 |