일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- BAEKJOON
- 파이토치 트랜스포머를 활용한 자연어 처리와 컴퓨터비전 심층학습
- system hacking
- Image Processing
- BFS
- 백준
- rao
- bloc
- BOF
- Kaggle
- MDP
- Got
- Algorithm
- Stream
- MATLAB
- Widget
- Flutter
- llm을 활용 단어장 앱 개발일지
- Computer Architecture
- study book
- PCA
- Dreamhack
- DART
- ARM
- FastAPI
- pytorch
- ML
- 영상처리
- fastapi를 사용한 파이썬 웹 개발
- C++
- Today
- Total
Bull
[NLP library] Gensim: 텍스트 분석을 위한 비지도 머신 러닝의 힘을 발휘하다 본문
[Gensim의 공식문서]
https://radimrehurek.com/gensim/intro.html
Gensim: topic modelling for humans
Efficient topic modelling in Python
radimrehurek.com
Gensim
Gensim은 무료 오픈소스 파이썬 라이브러리로, 비정형 디지털 텍스트를 비지도 머신 러닝 알고리즘을 사용하여 효율적으로 처리하는 데 중점을 둡니다. Gensim을 사용하면 문서를 의미 벡터로 표현하여 강력한 텍스트 분석 및 자연어 처리 작업을 수행할 수 있습니다.
Gensim의 역사와 발전
Gensim은 2008년 체코 디지털 수학 도서관(dml.cz) 프로젝트를 위한 파이썬 스크립트 모음으로 시작되었습니다. 이 스크립트는 주어진 기사와 가장 유사한 수학 기사를 생성하는 역할을 했습니다.
Gensim의 창시자인 Radim은 최신의 "잠재 의미 기법"을 시도하고 싶었지만, 필요한 계산을 수행하는 기존 라이브러리들은 사용하기 어려웠습니다. 그래서 Radim은 직접 새로운 라이브러리를 개발하기로 결심했습니다. 2010년 LREC 논문에서 Gensim의 초기 설계 결정에 대해 설명하였는데, 이 논문은 오늘날 Gensim의 작동 방식에도 잘 부합합니다.
Gensim의 후속 버전들은 효율성과 확장성을 크게 개선했습니다. 실제로 Radim은 분산 의미론의 알고리즘적 확장성을 자신의 박사 학위 논문의 주제로 삼았습니다. 현재 Gensim은 평문 텍스트로부터 비지도 의미 모델링을 실현하는 가장 견고하고 효율적이며 사용하기 쉬운 소프트웨어로 알려져 있습니다. 이는 확장되지 않는 과제용 구현체와 단순한 "Hello World" 실행에도 오랜 시간이 걸리는 복잡한 Java 프로젝트와 대조됩니다.
2011년에 Radim은 Gensim의 소스 코드를 Github로 옮기고 Gensim 웹사이트를 만들었습니다. 2013년에 현재의 로고를 얻었고, 2020년에는 웹사이트 디자인을 새롭게 개선했습니다.
Gensim의 발전 과정은 사용자의 요구에 맞추어 끊임없이 개선되어 왔으며, 지금도 자연어 처리와 텍스트 분석 작업에 널리 사용되고 있습니다. 참고로 Gensim은 "Generate Similar"의 약자입니다.
Gensim의 주요 특징
알고리즘: Word2Vec, FastText, Latent Semantic Indexing (LSI), Latent Dirichlet Allocation (LDA) 등의 인기 있는 알고리즘을 구현합니다.
비지도 학습
텍스트 코퍼스의 통계적 동시 발생 패턴을 분석하여 자동으로 의미 구조를 발견합니다.
확장성
전체 코퍼스를 메모리에 로드할 필요 없이 대규모 데이터셋을 처리할 수 있습니다.
성능
C, BLAS 및 메모리 매핑을 사용한 고도로 최적화된 벡터 공간 알고리즘 구현을 제공합니다.
메모리 독립성
실시간 데이터 스트리밍을 통해 웹 스케일의 코퍼스를 처리할 수 있습니다.
pip install gensim
Gensim에는 크게 8가지의 도구가 있습니다. 저는 우선 Word2Vec 모델에 대해 알아보겠습니다.
Word2Vec 모델 소개
Word2Vec은 신경망을 기반으로 한 알고리즘으로, 대량의 주석이 없는 평문 텍스트를 사용하여 단어 간의 관계를 자동으로 학습합니다.
Word2Vec의 출력은 단어당 하나의 벡터로, 벡터 간의 선형 관계를 통해 다음과 같은 계산이 가능합니다.
vec(“king”) - vec(“man”) + vec(“woman”) =~ vec(“queen”)
vec(“Montreal Canadiens”) – vec(“Montreal”) + vec(“Toronto”) =~ vec(“Toronto Maple Leafs”)
Word2Vec은 자동 텍스트 태깅, 추천 시스템 및 기계 번역에서 유용하게 사용됩니다.
Word2Vec 모델의 특징
Bag-of-Words
전통적인 Bag-of-Words 모델을 개선하여 단어의 순서와 의미를 학습합니다.
데모 모델 사용
사전 학습된 모델을 다운로드하여 사용해볼 수 있습니다.
사용자 데이터로 모델 학습
사용자 데이터로 새로운 모델을 학습할 수 있습니다.
모델 저장 및 로드
학습된 모델을 저장하고 다시 로드할 수 있습니다.
단어 임베딩 시각화
차원 축소를 통해 Word2Vec 임베딩을 시각화합니다.
Word2Vec 사용해보기
import gensim
from gensim.models import Word2Vec
# 예제 문장
sentences = [
["dog", "barks"],
["cat", "meows"],
["dog", "eats", "food"],
["cat", "eats", "food"],
["dog", "plays"],
["cat", "plays"]
]
# Word2Vec 모델 학습
model = Word2Vec(
sentences,
vector_size=100, # 벡터 차원 수
window=5, # 윈도우 크기
min_count=1, # 최소 단어 빈도
workers=4, # 사용할 스레드 수
sg=1, # Skip-gram 모델 사용
hs=0, # 네거티브 샘플링 사용
negative=5, # 네거티브 샘플링 개수
epochs=10 # 에포크 수
)
# 학습된 모델 저장
model.save("word2vec_example.model")
# 학습된 모델 로드
model = Word2Vec.load("word2vec_example.model")
# 단어 벡터 얻기
vector = model.wv['dog']
print(f"'dog' 벡터: {vector}")
# 유사한 단어 찾기
similar_words = model.wv.most_similar('dog')
print(f"'dog'와 유사한 단어들: {similar_words}")
'dog' 벡터: [-8.6196875e-03 3.6657380e-03 5.1898835e-03 5.7419385e-03
7.4669183e-03 -6.1676754e-03 1.1056137e-03 6.0472824e-03
-2.8400505e-03 -6.1735227e-03 -4.1022300e-04 -8.3689485e-03
-5.6000124e-03 7.1045388e-03 3.3525396e-03 7.2256695e-03
6.8002474e-03 7.5307419e-03 -3.7891543e-03 -5.6180597e-04
2.3483764e-03 -4.5190323e-03 8.3887316e-03 -9.8581640e-03
6.7646410e-03 2.9144168e-03 -4.9328315e-03 4.3981876e-03
-1.7395747e-03 6.7113843e-03 9.9648498e-03 -4.3624435e-03
-5.9933780e-04 -5.6956373e-03 3.8508223e-03 2.7866268e-03
6.8910765e-03 6.1010956e-03 9.5384968e-03 9.2734173e-03
7.8980681e-03 -6.9895042e-03 -9.1558648e-03 -3.5575271e-04
-3.0998408e-03 7.8943167e-03 5.9385742e-03 -1.5456629e-03
1.5109634e-03 1.7900408e-03 7.8175711e-03 -9.5101865e-03
-2.0553112e-04 3.4691966e-03 -9.3897223e-04 8.3817719e-03
9.0107834e-03 6.5365066e-03 -7.1162102e-04 7.7104042e-03
-8.5343346e-03 3.2071066e-03 -4.6379971e-03 -5.0889552e-03
3.5896183e-03 5.3703394e-03 7.7695143e-03 -5.7665063e-03
7.4333609e-03 6.6254963e-03 -3.7098003e-03 -8.7456414e-03
5.4374672e-03 6.5097557e-03 -7.8755023e-04 -6.7098560e-03
-7.0859254e-03 -2.4970602e-03 5.1432536e-03 -3.6652375e-03
-9.3700597e-03 3.8267397e-03 4.8844791e-03 -6.4285635e-03
1.2085581e-03 -2.0748770e-03 2.4403334e-05 -9.8835090e-03
2.6920044e-03 -4.7501065e-03 1.0876465e-03 -1.5762246e-03
2.1966731e-03 -7.8815762e-03 -2.7171839e-03 2.6631986e-03
5.3466819e-03 -2.3915148e-03 -9.5100943e-03 4.5058788e-03]
'dog'와 유사한 단어들: [('food', 0.06797593832015991), ('meows', 0.0093911774456501), ('eats', 0.0045030200853943825), ('cat', -0.010839177295565605), ('plays', -0.023671656847000122), ('barks', -0.11410721391439438)]
자주사용하는 파라미터
vector_size: 단어 벡터의 차원 수를 지정합니다. ::: vector_size=100
window: 예측 단어와 주변 단어 사이의 최대 거리(윈도우 크기)를 설정합니다. ::: window=5
min_count: 최소 단어 빈도. 이 값보다 적게 등장하는 단어는 무시됩니다. ::: min_count=1
workers: 학습 시 사용할 스레드 수를 지정합니다. Python이 설치되어 있다면 멀티코어를 사용하여 학습 속도를 높일 수 있습니다. ::: workers=4
sg: 0은 CBOW(Continuous Bag of Words) 모델을, 1은 Skip-gram 모델을 사용합니다. ::: sg=1
hs: 0은 네거티브 샘플링을, 1은 계층적 Softmax를 사용합니다. ::: hs=0
negative: 네거티브 샘플링을 사용할 때, 단어당 생성할 노이즈 단어의 수를 지정합니다. ::: negative=5
epochs: 전체 코퍼스를 학습하는 에포크 수를 지정합니다. ::: epochs=10