Gensim-벡터 및 모델
여기서는 벡터와 모델에 중점을두고 Gensim의 핵심 개념에 대해 배웁니다.
벡터 란?
우리 말뭉치의 잠재 구조를 추론하려면 어떻게해야합니까? 이를 위해 우리는 동일한 것을 수학적으로 조작 할 수있는 방식으로 문서를 표현해야합니다. 인기있는 표현 유형 중 하나는 말뭉치의 모든 문서를 특징 벡터로 표현하는 것입니다. 그래서 벡터는 문서를 수학적으로 편리하게 표현한 것이라고 말할 수 있습니다.
예를 들어, 위에서 사용한 코퍼스의 단일 기능을 QA 쌍으로 표현해 보겠습니다.
Q − 단어는 몇 번입니까? Hello 문서에 표시됩니까?
A − 제로 (0).
Q − 문서에 몇 개의 단락이 있습니까?
A − 두 (2)
질문은 일반적으로 정수 ID로 표시되므로이 문서의 표현은 (1, 0.0), (2, 2.0)과 같은 일련의 쌍입니다. 이러한 벡터 표현은dense벡터. 왜dense, 위의 모든 질문에 대한 명시적인 답변으로 구성되어 있기 때문입니다.
모든 질문을 미리 알고 있다면 표현은 (0, 2)와 같이 간단 할 수 있습니다. 이러한 일련의 답변 (물론 질문이 미리 알려진 경우)은vector 우리 문서를 위해.
또 다른 인기있는 표현은 bag-of-word (BoW)모델. 이 접근 방식에서 각 문서는 기본적으로 사전에있는 모든 단어의 빈도 수를 포함하는 벡터로 표현됩니다.
예를 들어, [ 'Hello', 'How', 'are', 'you']라는 단어가 포함 된 사전이 있다고 가정합니다. 문자열 "How are you how"로 구성된 문서는 벡터 [0, 2, 1, 1]로 표현됩니다. 여기에서 벡터의 항목은 "Hello", "How", "are"및 "you"의 발생 순서입니다.
벡터 대 문서
위의 벡터 설명에서 문서와 벡터의 구분을 거의 알 수 있습니다. 하지만 더 명확하게하기 위해document 텍스트이고 vector텍스트를 수학적으로 편리하게 표현한 것입니다. 불행히도 때때로 많은 사람들이 이러한 용어를 같은 의미로 사용합니다.
예를 들어, 임의의 문서 A가있는 경우 "문서 A에 해당하는 벡터"대신 "벡터 A"또는 "문서 A"라고 말합니다. 이것은 큰 모호성을 가져옵니다. 여기서 주목해야 할 한 가지 더 중요한 점은 두 개의 서로 다른 문서가 동일한 벡터 표현을 가질 수 있다는 것입니다.
말뭉치를 벡터 목록으로 변환
말뭉치를 벡터 목록으로 변환하는 구현 예를 취하기 전에 말뭉치의 각 단어를 고유 한 정수 ID와 연결해야합니다. 이를 위해 위 장에서 가져온 예제를 확장 할 것입니다.
예
from gensim import corpora
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)
산출
Dictionary(25 unique tokens: ['computer', 'opinion', 'response', 'survey', 'system']...)
우리 말뭉치에 25 개의 다른 토큰이 있음을 보여줍니다. gensim.corpora.Dictionary.
구현 예
사전을 사용하여 토큰 화 된 문서를 다음과 같이 5 가지 식 벡터로 변환 할 수 있습니다.
pprint.pprint(dictionary.token2id)
산출
{
'binary': 11,
'computer': 0,
'error': 7,
'generation': 12,
'graph': 16,
'intersection': 17,
'iv': 19,
'measurement': 8,
'minors': 20,
'opinion': 1,
'ordering': 21,
'paths': 18,
'perceived': 9,
'quasi': 22,
'random': 13,
'relation': 10,
'response': 2,
'survey': 3,
'system': 4,
'time': 5,
'trees': 14,
'unordered': 15,
'user': 6,
'well': 23,
'widths': 24
}
마찬가지로 문서에 대한 bag-of-word 표현을 다음과 같이 만들 수 있습니다.
BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)
산출
[
[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1)],
[(2, 1), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1), (10, 1)],
[(11, 1), (12, 1), (13, 1), (14, 1), (15, 1)],
[(14, 1), (16, 1), (17, 1), (18, 1)],
[(14, 1), (16, 1), (19, 1), (20, 1), (21, 1), (22, 1), (23, 1), (24, 1)]
]
모델이란?
말뭉치를 벡터화하면 다음은 무엇입니까? 이제 모델을 사용하여 변환 할 수 있습니다. 모델은 한 문서 표현을 다른 문서 표현으로 변환하는 데 사용되는 알고리즘을 참조 할 수 있습니다.
앞서 논의했듯이 Gensim에서 문서는 벡터로 표현되므로 두 벡터 공간 간의 변환으로 모델링 할 수 있습니다. 모델이 이러한 변환의 세부 사항을 학습하는 훈련 단계가 항상 있습니다. 모델은 훈련 단계에서 훈련 코퍼스를 읽습니다.
모델 초기화
초기화합시다 tf-idf모델. 이 모델은 벡터를 BoW (Bag of Words) 표현에서 코퍼스의 모든 단어의 상대적 희귀도에 따라 빈도 수에 가중치를 부여하는 다른 벡터 공간으로 변환합니다.
구현 예
다음 예제에서 우리는 초기화 할 것입니다 tf-idf모델. 말뭉치에서 학습 한 다음 "trees graph"문자열을 변환합니다.
예
from gensim import models
tfidf = models.TfidfModel(BoW_corpus)
words = "trees graph".lower().split()
print(tfidf[dictionary.doc2bow(words)])
산출
[(3, 0.4869354917707381), (4, 0.8734379353188121)]
이제 모델을 생성하면 tfidf를 통해 전체 말뭉치를 변환하고 색인을 생성하고 말뭉치의 각 문서에 대해 쿼리 문서 (쿼리 문서 '트리 시스템'제공)의 유사성을 쿼리 할 수 있습니다.
예
from gensim import similarities
index = similarities.SparseMatrixSimilarity(tfidf[BoW_corpus],num_features=5)
query_document = 'trees system'.split()
query_bow = dictionary.doc2bow(query_document)
simils = index[tfidf[query_bow]]
print(list(enumerate(simils)))
산출
[(0, 0.0), (1, 0.0), (2, 1.0), (3, 0.4869355), (4, 0.4869355)]
위의 결과에서 문서 4와 문서 5의 유사성 점수는 약 49 %입니다.
또한 다음과 같이 가독성을 높이기 위해이 출력을 정렬 할 수도 있습니다.
예
for doc_number, score in sorted(enumerate(sims), key=lambda x: x[1], reverse=True):
print(doc_number, score)
산출
2 1.0
3 0.4869355
4 0.4869355
0 0.0
1 0.0