History
home
BDA 연혁
home

- 정규식, 형태소, 코사인 유사도 등 (CounterVectorizer(), TF-IDF, CBOW, Word2Vec)

CountVectorizer() 실습

CountVectorizer()는 Scikit-learn 라이브러리에서 제공하는 텍스트 분석 도구로, 문서 집합에서 단어 토큰을 생성하고 각 단어의 발생 빈도를 카운트하여 피처 벡터를 생성한다. 이 방법은 Bag of Words (BoW) 모델을 기반으로 하며, 텍스트 데이터를 수치 데이터로 변환하는 데 사용된다. 이 변환 과정을 통해 머신 러닝 알고리즘에서 사용할 수 있는 입력 형태로 텍스트 데이터를 준비할 수 있다.
CountVectorizer()는 다음과 같은 과정을 통해 작동한다:
1.
텍스트 정규화: 모든 텍스트를 소문자로 변환
2.
토큰화: 공백이나 구두점 등을 기준으로 텍스트를 단어 단위로 분리
3.
불용어 제거: 옵션으로, 'the', 'is'와 같은 불용어를 제거
4.
단어 카운트: 각 문서에서 단어의 발생 횟수를 카운트
5.
벡터 변환: 각 문서를 단어의 발생 빈도를 나타내는 벡터로 변환
다음 실습코드는 간단한 텍스트 데이터를 피처 벡터로 변환하는 예제이다.
먼저, 세 개의 간단한 문서로 구성된 데이터셋을 CountVectorizer()를 사용하여 벡터로 변환한다. fit_transform() 메소드는 먼저 문서 집합에서 단어의 어휘를 학습한 후, 각 문서를 단어의 발생 빈도를 나타내는 벡터로 변환한다. 결과는 각 문서를 표현하는 단어 빈도 벡터의 배열로, 머신 러닝 모델의 입력으로 사용될 수 있다.
from sklearn.feature_extraction.text import CountVectorizer # 예제 문서 documents = [ 'Hello, how are you?', 'I am fine, thank you.', 'How do you do?' ] # CountVectorizer 객체 생성 vectorizer = CountVectorizer() # 문서를 학습하고 벡터로 변환 X = vectorizer.fit_transform(documents) # 각 단어의 피처 이름 얻기 feature_names = vectorizer.get_feature_names_out() # 벡터화된 결과 출력 print("피처 이름:", feature_names) print("벡터화된 표현:\n", X.toarray())
Python
복사

TF-IDF(Term Frequency-Inverse Document Frequency) 실습

TF-IDF는 텍스트 데이터의 특징을 추출하는 데 사용되는 가중치를 계산하는 방법이다. 이 방법은 문서 내에서 단어의 중요도를 평가하기 위해 사용되며, 정보 검색과 텍스트 마이닝에서 널리 사용된다. TF-IDF는 두 가지 요소, 즉 단어 빈도(Term Frequency, TF)역 문서 빈도(Inverse Document Frequency, IDF)를 결합한 값이다.
단어 빈도(TF)는 특정 단어가 문서 내에서 얼마나 자주 등장하는지를 나타낸다. 단어가 문서 내에서 더 자주 나타날수록 그 단어는 문서에 더 중요하다고 간주된다.
역 문서 빈도(IDF)는 단어가 문서 집합 전체에서 얼마나 고유한지를 나타낸다. 모든 문서에서 자주 등장하는 단어는 중요도가 낮다고 간주되며, 특정 문서에만 자주 등장하는 단어는 중요도가 높다고 간주된다.
TF-IDF 값은 특정 단어의 TF 값과 IDF 값을 곱하여 계산된다. 이 값이 클수록 해당 단어는 문서 내에서 중요하며, 문서 집합 전체에서는 드물게 등장하는 단어임을 의미한다.
Scikit-learn 라이브러리는 TfidfVectorizer 클래스를 통해 문서 집합의 TF-IDF 값을 계산할 수 있는 기능을 제공한다.
다음은 TfidfVectorizer를 사용하여 간단한 텍스트 데이터의 TF-IDF 값을 계산하는 실습코드이다. 먼저, 세 개의 문서로 구성된 데이터셋을 TfidfVectorizer를 사용하여 TF-IDF 벡터로 변환한다. fit_transform() 메소드는 먼저 문서 집합에서 단어의 어휘를 학습한 후, 각 문서를 단어의 TF-IDF 가중치를 나타내는 벡터로 변환한다. 결과는 각 문서를 표현하는 TF-IDF 가중치 벡터의 배열로, 텍스트 데이터의 중요한 특징을 반영한다.
from sklearn.feature_extraction.text import TfidfVectorizer # 예제 문서 documents = [ 'Data Science is an overlap between Arts and Science.', 'Generally, Arts graduates are right-brained and Science graduates are left-brained.', 'Excelling in both Arts and Science at a time becomes difficult.' ] # TfidfVectorizer 객체 생성 tfidf_vectorizer = TfidfVectorizer() # 문서를 학습하고 TF-IDF 벡터로 변환 tfidf_matrix = tfidf_vectorizer.fit_transform(documents) # 각 단어의 피처 이름 얻기 feature_names = tfidf_vectorizer.get_feature_names_out() # TF-IDF 벡터화된 결과 출력 print("피처 이름:", feature_names) print("TF-IDF 행렬:\n", tfidf_matrix.toarray())
Python
복사

CBOW(Continuous Bag of Words) 실습

CBOW모델은 단어의 임베딩을 학습하기 위한 방법 중 하나로, 주변 단어(문맥)를 기반으로 특정 단어를 예측하는 방식으로 작동한다. 즉, 주변 단어들을 입력으로 받아, 그 중앙에 위치할 단어를 예측하려고 한다. 이 방식은 Word2Vec 모델을 구현할 때 사용되며, 단어의 벡터 표현을 학습하는 데 효과적이다.
CBOW 모델은 다음과 같은 특징을 가지고 있다:
문맥 정보 활용: CBOW는 주변 단어들의 문맥 정보를 활용하여 중심 단어를 예측한다.
효율적인 학습: 작은 데이터셋에서 효율적으로 학습할 수 있으며, 빠른 학습 속도를 보여준다.
단어의 분산 표현: 단어를 고차원에서 저차원의 벡터 공간으로 매핑하여, 단어 간의 의미적 유사성을 벡터 거리로 표현할 수 있다.
CBOW 모델을 직접 구현하는 것은 복잡할 수 있으며, Word2Vec 라이브러리를 사용하는 것이 일반적이다. 하지만, Python의 Gensim 라이브러리를 사용하면 간단하게 Word2Vec 모델의 CBOW 버전을 학습할 수 있다.
아래 실습 코드는 Gensim을 사용한 CBOW 모델 학습 예제이다. Gensim의 Word2Vec 클래스를 사용하여 CBOW 모델을 학습한다. sentences 파라미터에는 토큰화된 문서의 리스트를 입력하며, vector_size는 벡터의 차원 수를, window는 문맥 크기를, min_count는 단어가 코퍼스에 최소 몇 번 등장해야 모델에 포함할지를, 그리고 sg 파라미터에 0을 설정하여 CBOW 모델을 사용하도록 한다(Skip-gram 모델을 사용하려면 sg=1로 설정).
from gensim.models import Word2Vec from nltk.tokenize import word_tokenize import nltk nltk.download('punkt') # 예제 문서 documents = [ "Natural language processing (NLP) is a subfield of linguistics, computer science, and artificial intelligence.", "NLP is concerned with the interactions between computers and human (natural) languages.", "In particular, how to program computers to process and analyze large amounts of natural language data." ] # 문서 토큰화 tokenized_docs = [word_tokenize(doc.lower()) for doc in documents] # CBOW 모델 학습 cbow_model = Word2Vec(sentences=tokenized_docs, vector_size=100, window=5, min_count=1, sg=0) # 학습된 단어 벡터 확인 word_vectors = cbow_model.wv print(word_vectors['nlp']) # 'nlp' 단어의 벡터 표현 출력
Python
복사

Word2Vec 실습

Word2Vec은 단어를 벡터 공간에 매핑하는 데 사용되는, 예측 기반의 모델로 자연어 처리(NLP) 분야에서 널리 사용된다. 이 모델은 단어 간의 의미적 관계를 포착하여, 단어들을 고차원에서 저차원의 벡터로 변환한다.
Word2Vec은 두 가지 아키텍처를 사용할 수 있다:
Continuous Bag of Words (CBOW)와 Skip-Gram. CBOW는 주변 단어들을 사용하여 중심 단어를 예측하고, Skip-Gram은 중심 단어로부터 주변 단어들을 예측한다. Word2Vec의 주요 장점은 대규모 텍스트 코퍼스에서 학습이 가능하며, 학습된 벡터는 단어 간의 의미론적 유사성을 반영한다는 것이다.
Python의 Gensim 라이브러리를 사용하면 Word2Vec 모델을 쉽게 구현하고 사용할 수 있다. 아래 실습 코드는 Gensim을 사용하여 Word2Vec 모델을 학습하는 예제이다.
먼저, Gensim의 Word2Vec 클래스를 사용하여 Skip-Gram 모델을 학습한다. vector_size는 벡터의 차원을, window는 문맥의 크기를, min_count는 단어가 코퍼스에 최소 몇 번 등장해야 모델에 포함할지를 설정하며, sg=1은 Skip-Gram 모델을 사용하도록 한다. 모델 학습 후, model.wv['machine']를 통해 'machine' 단어의 벡터를 조회할 수 있고, model.wv.most_similar('intelligence', topn=5)를 통해 'intelligence'와 의미적으로 유사한 단어를 찾을 수 있다.
from gensim.models import Word2Vec from nltk.tokenize import word_tokenize import nltk nltk.download('punkt') # 토큰화를 위한 데이터셋 다운로드 # 예제 문서 documents = [ "Machine learning is a field of artificial intelligence.", "It involves the study of algorithms that can learn from and make predictions on data.", "Machine learning is closely related to computational statistics." ] # 문서 토큰화 tokenized_docs = [word_tokenize(doc.lower()) for doc in documents] # Word2Vec 모델 학습 (Skip-Gram 사용) model = Word2Vec(sentences=tokenized_docs, vector_size=100, window=5, min_count=1, sg=1) # 학습된 단어 벡터 확인 print(model.wv['machine']) # 'machine' 단어의 벡터 표현 출력 # 유사한 단어 찾기 similar_words = model.wv.most_similar('intelligence', topn=5) print(similar_words)
Python
복사