Gensim-변환
이 장은 Gensim의 다양한 변형에 대해 배우는 데 도움이 될 것입니다. 변형 문서를 이해하는 것으로 시작하겠습니다.
문서 변형
문서 변환은 문서를 수학적으로 조작 할 수있는 방식으로 문서를 표현하는 것을 의미합니다. 말뭉치의 잠재 구조를 추론하는 것 외에도 문서 변환은 다음과 같은 목표를 달성합니다.
단어 사이의 관계를 발견합니다.
그것은 말뭉치의 숨겨진 구조를 드러냅니다.
문서를 새롭고 더 의미있는 방식으로 설명합니다.
문서의 표현을보다 간결하게 만듭니다.
새로운 표현이 더 적은 자원을 소비하므로 효율성이 향상됩니다.
새로운 표현에서 한계 데이터 추세가 무시되기 때문에 효율성이 향상됩니다.
새 문서 표현에서도 노이즈가 줄어 듭니다.
한 벡터 공간 표현에서 다른 벡터 공간 표현으로 문서를 변환하는 구현 단계를 살펴 보겠습니다.
구현 단계
문서를 변환하려면 다음 단계를 따라야합니다.
1 단계 : 코퍼스 만들기
첫 번째이자 기본 단계는 문서에서 말뭉치를 만드는 것입니다. 이전 예제에서 이미 말뭉치를 만들었습니다. 몇 가지 향상된 기능으로 다른 하나를 만들어 보겠습니다 (일반적인 단어와 한 번만 나타나는 단어 제거)-
import gensim
import pprint
from collections import defaultdict
from gensim import corpora
이제 말뭉치를 만들기위한 문서를 제공합니다.
t_corpus = [ "이전에는 Computational Network Toolkit으로 알려진 CNTK", "사용하기 쉬운 무료 오픈 소스 상용 등급 툴킷입니다.", "인간의 두뇌처럼 학습 할 수 있도록 딥 러닝 알고리즘을 훈련시킬 수 있습니다.", " tutorialspoint.com에서 무료 자습서를 찾을 수 있습니다. ","Tutorialspoint.com은 AI 딥 러닝 머신 러닝과 같은 기술에 대한 최고의 기술 자습서도 무료로 제공합니다. "]
다음으로 우리는 토큰 화를해야하고 그와 함께 일반적인 단어도 제거 할 것입니다.
stoplist = set('for a of the and to in'.split(' '))
processed_corpus = [
[
word for word in document.lower().split() if word not in stoplist
]
for document in t_corpus
]
다음 스크립트는 표시되는 단어 만 제거합니다.
frequency = defaultdict(int)
for text in processed_corpus:
for token in text:
frequency[token] += 1
processed_corpus = [
[token for token in text if frequency[token] > 1]
for text in processed_corpus
]
pprint.pprint(processed_corpus)
산출
[
['toolkit'],
['free', 'toolkit'],
['deep', 'learning', 'like'],
['free', 'on', 'tutorialspoint.com'],
['tutorialspoint.com', 'on', 'like', 'deep', 'learning', 'learning', 'free']
]
이제 그것을 corpora.dictionary() 우리 말뭉치에서 고유 한 객체를 얻기위한 객체-
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)
산출
Dictionary(7 unique tokens: ['toolkit', 'free', 'deep', 'learning', 'like']...)
다음으로, 다음 코드 줄은 우리 코퍼스에 대한 Bag of Word 모델을 생성합니다.
BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)
산출
[
[(0, 1)],
[(0, 1), (1, 1)],
[(2, 1), (3, 1), (4, 1)],
[(1, 1), (5, 1), (6, 1)],
[(1, 1), (2, 1), (3, 2), (4, 1), (5, 1), (6, 1)]
]
2 단계 : 변환 생성
변환은 몇 가지 표준 Python 객체입니다. 훈련 된 말뭉치를 사용하여 이러한 변환, 즉 Python 객체를 초기화 할 수 있습니다. 여기서 우리는tf-idf 훈련 된 말뭉치의 변형을 만드는 모델, 즉 BoW_corpus.
먼저 gensim에서 모델 패키지를 가져와야합니다.
from gensim import models
이제 다음과 같이 모델을 초기화해야합니다.
tfidf = models.TfidfModel(BoW_corpus)
3 단계 : 벡터 변환
이제이 마지막 단계에서 벡터는 이전 표현에서 새 표현으로 변환됩니다. 위 단계에서 tfidf 모델을 초기화 했으므로 tfidf는 이제 읽기 전용 개체로 처리됩니다. 여기서이 tfidf 객체를 사용하여 벡터를 단어 표현 (이전 표현)에서 Tfidf 실수 값 가중치 (새 표현)로 변환합니다.
doc_BoW = [(1,1),(3,1)]
print(tfidf[doc_BoW]
산출
[(1, 0.4869354917707381), (3, 0.8734379353188121)]
우리는 말뭉치의 두 값에 변환을 적용했지만 다음과 같이 전체 말뭉치에 적용 할 수도 있습니다.
corpus_tfidf = tfidf[BoW_corpus]
for doc in corpus_tfidf:
print(doc)
산출
[(0, 1.0)]
[(0, 0.8734379353188121), (1, 0.4869354917707381)]
[(2, 0.5773502691896257), (3, 0.5773502691896257), (4, 0.5773502691896257)]
[(1, 0.3667400603126873), (5, 0.657838022678017), (6, 0.657838022678017)]
[
(1, 0.19338287240886842), (2, 0.34687949360312714), (3, 0.6937589872062543),
(4, 0.34687949360312714), (5, 0.34687949360312714), (6, 0.34687949360312714)
]
완전한 구현 예
import gensim
import pprint
from collections import defaultdict
from gensim import corpora
t_corpus = [
"CNTK formerly known as Computational Network Toolkit",
"is a free easy-to-use open-source commercial-grade toolkit",
"that enable us to train deep learning algorithms to learn like the human brain.",
"You can find its free tutorial on tutorialspoint.com",
"Tutorialspoint.com also provide best technical tutorials on
technologies like AI deep learning machine learning for free"
]
stoplist = set('for a of the and to in'.split(' '))
processed_corpus = [
[word for word in document.lower().split() if word not in stoplist]
for document in t_corpus
]
frequency = defaultdict(int)
for text in processed_corpus:
for token in text:
frequency[token] += 1
processed_corpus = [
[token for token in text if frequency[token] > 1]
for text in processed_corpus
]
pprint.pprint(processed_corpus)
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)
BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)
from gensim import models
tfidf = models.TfidfModel(BoW_corpus)
doc_BoW = [(1,1),(3,1)]
print(tfidf[doc_BoW])
corpus_tfidf = tfidf[BoW_corpus]
for doc in corpus_tfidf:
print(doc)
Gensim의 다양한 변환
Gensim을 사용하여 다양한 인기 변환, 즉 벡터 공간 모델 알고리즘을 구현할 수 있습니다. 그들 중 일부는 다음과 같습니다-
Tf-Idf (용어 주파수-역 문서 주파수)
초기화 중에이 tf-idf 모델 알고리즘은 정수 값 (예 : Bag-of-Words 모델)을 가진 학습 코퍼스를 예상합니다. 그런 다음 변환시 벡터 표현을 취하고 다른 벡터 표현을 반환합니다.
출력 벡터는 동일한 차원을 갖지만 희귀 기능의 값 (훈련 당시)이 증가합니다. 기본적으로 정수 값 벡터를 실수 벡터로 변환합니다. 다음은 Tf-idf 변환의 구문입니다-
Model=models.TfidfModel(corpus, normalize=True)
LSI (Latent Semantic Indexing)
LSI 모델 알고리즘은 정수 값 벡터 모델 (예 : Bag-of-Words 모델) 또는 Tf-Idf 가중치 공간에서 잠복 공간으로 문서를 변환 할 수 있습니다. 출력 벡터는 더 낮은 차원입니다. 다음은 LSI 변환의 구문입니다-
Model=models.LsiModel(tfidf_corpus, id2word=dictionary, num_topics=300)
LDA (Latent Dirichlet Allocation)
LDA 모델 알고리즘은 Bag-of-Words 모델 공간에서 주제 공간으로 문서를 변환하는 또 다른 알고리즘입니다. 출력 벡터는 더 낮은 차원입니다. 다음은 LSI 변환의 구문입니다-
Model=models.LdaModel(corpus, id2word=dictionary, num_topics=100)
무작위 투영 (RP)
매우 효율적인 접근 방식 인 RP는 벡터 공간의 차원을 줄이는 것을 목표로합니다. 이 접근 방식은 기본적으로 문서 간의 Tf-Idf 거리에 가깝습니다. 이것은 약간의 무작위성을 던져서 수행합니다.
Model=models.RpModel(tfidf_corpus, num_topics=500)
계층 적 디리클레 프로세스 (HDP)
HDP는 Gensim에 새로 추가 된 비모수 베이지안 방법입니다. 우리는 그것을 사용하는 동안주의를 기울여야합니다.
Model=models.HdpModel(corpus, id2word=dictionary