파이토치를 처음 배우던 날이 떠오른 하루다. 무슨 소리인지 하나도 모르겠다. 머신러닝 때 하던 텍스트 전처리와 비슷한 부분도 약간 있는 것 같은데,,, 당분간 힘든 하루가 될 것 같다. 왜 자연어가 어렵다고 하는지 알겠다.
학습시간 09:00~02:00(당일17H/누적H)
요약표
| 분류 | 기법/도구 | 설명 요약 |
|---|---|---|
| 빈도 기반 | BoW, TF-IDF | 단어 빈도 기반 벡터 |
| 정적 임베딩 | Word2Vec, GloVe, FastText | 단어 간 의미 학습, 문맥 미반영 |
| 문맥 임베딩 | ELMo, BERT, GPT | 문맥 포함 동적 벡터 |
| 최신 임베딩 | SBERT, SimCSE | 문장 간 유사도 중심 |
| 전처리 | Cleansing, Tokenizing, BPE | 텍스트 정제 및 구조화 |
| 벡터화 | CountVectorizer, TfidfVectorizer | 정형 입력으로 변환 |
| 문장 임베딩 | SentenceTransformer | 딥러닝 기반 문장 표현 |
전처리 순서
''' 데이터 로드 '''
# 자연어 데이터를 저장할 때에는 tsv 형식을 많이 사용
# 실무에서는 자연어를 보통 데이터 프레임 형태로 처리
import pandas as pd
df = pd.read_csv('imdb.tsv', delimiter='\\t')
df
''' 대소문자 통합 '''
df['review'] = df['review'].str.lower()
print(df['review'][0])
''' 토큰화 '''
df['word_tokens'] = df['review'].apply(word_tokenize)
print(df['word_tokens'][0])
''' 정제 '''
stopwords_set = set(stopwords.words('english'))
df['cleaned_tokens'] = df['word_tokens'].apply(lambda x: clean_by_freq(x, 1))
df['cleaned_tokens'] = df['cleaned_tokens'].apply(lambda x: clean_by_len(x, 2))
df['cleaned_tokens'] = df['cleaned_tokens'].apply(lambda x: clean_by_stopwords(x, stopwords_set))
print(df['cleaned_tokens'][0])
''' 어간 추출 '''
df['stemmed_tokens'] = df['cleaned_tokens'].apply(stemming_by_porter)
print(df['stemmed_tokens'][0])
''' 데이터 전처리 관련 함수 '''
from collections import Counter
from nltk.stem import PorterStemmer
# 등장 빈도 기준 정제 함수
def clean_by_freq(tokenized_words, cut_off_count):
# 파이썬의 Counter 모듈을 통해 단어의 빈도수 카운트하여 단어 집합 생성
vocab = Counter(tokenized_words)
# 빈도수가 cut_off_count 이하인 단어 set 추출
uncommon_words = {key for key, value in vocab.items() if value <= cut_off_count}
# uncommon_words에 포함되지 않는 단어 리스트 생성
cleaned_words = [word for word in tokenized_words if word not in uncommon_words]
return cleaned_words
# 단어 길이 기준 정제 함수
def clean_by_len(tokenized_words, cut_off_length):
cleaned_by_freq_len = []
for word in tokenized_words:
if len(word) > cut_off_length:
cleaned_by_freq_len.append(word)
return cleaned_by_freq_len
# 불용어 제거 함수
def clean_by_stopwords(tokenized_words, stop_words_set):
cleaned_words = []
for word in tokenized_words:
if word not in stop_words_set:
cleaned_words.append(word)
return cleaned_words
# 포터 스테머 어간 추출 함수
def stemming_by_porter(tokenized_words):
porter_stemmer = PorterStemmer()
porter_stemmed_words = []
for word in tokenized_words:
stem = porter_stemmer.stem(word)
porter_stemmed_words.append(stem)
return porter_stemmed_words
from sklearn.feature_extraction.text import TfidfVectorizer
docs = ["I love NLP", "NLP is fun", "I love machine learning"]
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(docs)
print(X.toarray())
print(vectorizer.get_feature_names_out())
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(docs)
print(X.toarray())
print(vectorizer.get_feature_names_out())
from gensim.models import Word2Vec
sentences = [["I", "love", "NLP"], ["NLP", "is", "fun"]]
model = Word2Vec(sentences, vector_size=50, window=2, min_count=1, sg=1)
print(model.wv["NLP"]) # 'NLP' 단어 벡터 출력
glove-python 또는 사전 학습 벡터 활용# GloVe는 gensim downloader를 통해 불러오는 방식 추천
import gensim.downloader as api
glove_vectors = api.load("glove-wiki-gigaword-50")
print(glove_vectors["king"]) # 'king'의 벡터 출력
from gensim.models import FastText
model = FastText(sentences, vector_size=50, window=2, min_count=1)
print(model.wv["NLP"])
# AllenNLP 설치 필요
pip install allennlp
# 핵심 구조만 요약
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
model = AutoModel.from_pretrained("bert-base-uncased")
inputs = tokenizer("Hello NLP", return_tensors="pt")
outputs = model(**inputs)
print(outputs.last_hidden_state.shape)
from transformers import BertTokenizer, BertModel
tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
model = BertModel.from_pretrained("bert-base-uncased")
inputs = tokenizer("Natural language processing", return_tensors="pt")
outputs = model(**inputs)
print(outputs.last_hidden_state)
from transformers import GPT2Tokenizer, GPT2Model
tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
model = GPT2Model.from_pretrained("gpt2")
inputs = tokenizer("I love natural", return_tensors="pt")
outputs = model(**inputs)
print(outputs.last_hidden_state)
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
embeddings = model.encode(["This is a sentence", "That is another one"])
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('princeton-nlp/sup-simcse-bert-base-uncased')
embeddings = model.encode(["This is a test", "This is a test too"])
text = "I love natural language processing."
tokens = text.split()
print(tokens)
import re
text = "NLP is fun!! @@@"
clean_text = re.sub(r'[^a-zA-Z\s]', '', text)
print(clean_text)
from kiwipiepy import Kiwi
kiwi = Kiwi()
result = kiwi.tokenize("자연어 처리는 어렵지만 재미있다.")
print([(token.form, token.tag) for token in result])
import sentencepiece as spm
spm.SentencePieceTrainer.train(input='train.txt', model_prefix='bpe', vocab_size=500)
sp = spm.SentencePieceProcessor(model_file='bpe.model')
print(sp.encode('자연어처리는 어렵지만 재미있다.', out_type=str))
from sklearn.feature_extraction.text import CountVectorizer
corpus = ["I love NLP", "NLP is amazing"]
vec = CountVectorizer()
X = vec.fit_transform(corpus)
print(X.toarray())
from sklearn.feature_extraction.text import TfidfVectorizer
vec = TfidfVectorizer()
X = vec.fit_transform(corpus)
print(X.toarray())
from gensim.models import Word2Vec
sentences = [["I", "love", "coding"], ["deep", "learning", "rocks"]]
model = Word2Vec(sentences, vector_size=100, sg=1)
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("all-MiniLM-L6-v2")
sentence_vec = model.encode("딥러닝은 흥미롭다.")