Gensim - Vetor e Modelo

Aqui, aprenderemos sobre os principais conceitos do Gensim, com foco principal no vetor e no modelo.

O que é vetor?

E se quisermos inferir a estrutura latente em nosso corpus? Para isso, precisamos representar os documentos de tal forma que possamos manipulá-los matematicamente. Um tipo popular de representação é representar cada documento do corpus como um vetor de recursos. É por isso que podemos dizer que o vetor é uma representação matemática conveniente de um documento.

Para dar um exemplo, vamos representar um único recurso, de nosso corpus usado acima, como um par de controle de qualidade -

Q - Quantas vezes a palavra Hello aparece no documento?

A - Zero (0).

Q - Quantos parágrafos existem no documento?

A - Dois (2)

A questão é geralmente representada por seu id inteiro, portanto, a representação deste documento é uma série de pares como (1, 0.0), (2, 2.0). Essa representação vetorial é conhecida como umdensevetor. Por quêdense, porque compreende uma resposta explícita a todas as questões formuladas acima.

A representação pode ser simples como (0, 2), se soubermos todas as questões com antecedência. Essa sequência de respostas (claro se as perguntas são conhecidas com antecedência) é ovector para o nosso documento.

Outro tipo popular de representação é o bag-of-word (BoW)modelo. Nessa abordagem, cada documento é basicamente representado por um vetor que contém a contagem de frequência de cada palavra do dicionário.

Para dar um exemplo, suponha que temos um dicionário que contém as palavras ['Olá', 'Como', 'são', 'você']. Um documento consistindo na string “How are you how” seria então representado pelo vetor [0, 2, 1, 1]. Aqui, as entradas do vetor estão na ordem das ocorrências de “Hello”, “How”, “are” e “you”.

Vetor versus documento

A partir da explicação acima sobre vetor, a distinção entre um documento e um vetor é quase compreendida. Mas, para deixar mais claro,document é texto e vectoré uma representação matematicamente conveniente desse texto. Infelizmente, às vezes muitas pessoas usam esses termos alternadamente.

Por exemplo, suponha que temos algum documento arbitrário A então, em vez de dizer, “o vetor que corresponde ao documento A”, eles costumavam dizer, “o vetor A” ou “o documento A”. Isso leva a uma grande ambigüidade. Mais uma coisa importante a ser observada aqui é que dois documentos diferentes podem ter a mesma representação vetorial.

Convertendo corpus em lista de vetores

Antes de tomar um exemplo de implementação de conversão de corpus na lista de vetores, precisamos associar cada palavra do corpus a um ID de inteiro único. Para isso, estenderemos o exemplo do capítulo anterior.

Exemplo

from gensim import corpora
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)

Resultado

Dictionary(25 unique tokens: ['computer', 'opinion', 'response', 'survey', 'system']...)

Isso mostra que em nosso corpus existem 25 tokens diferentes neste gensim.corpora.Dictionary.

Exemplo de Implementação

Podemos usar o dicionário para transformar documentos tokenizados nesses vetores 5-diemsionais da seguinte maneira -

pprint.pprint(dictionary.token2id)

Resultado

{
   '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
}

E da mesma forma, podemos criar a representação do saco de palavras para um documento da seguinte maneira -

BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)

Resultado

[
   [(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)]
]

O que é modelo?

Depois de vetorizar o corpus, o que fazer? Agora, podemos transformá-lo usando modelos. O modelo pode ser referido a um algoritmo usado para transformar uma representação de documento em outra.

Como já discutimos, os documentos, no Gensim, são representados como vetores, portanto, podemos, embora modelar como uma transformação entre dois espaços vetoriais. Sempre há uma fase de treinamento em que os modelos aprendem os detalhes de tais transformações. O modelo lê o corpus de treinamento durante a fase de treinamento.

Inicializando um modelo

Vamos inicializar tf-idfmodelo. Este modelo transforma vetores da representação BoW (Bag of Words) para outro espaço vetorial onde as contagens de frequência são ponderadas de acordo com a raridade relativa de cada palavra no corpus.

Exemplo de Implementação

No exemplo a seguir, vamos inicializar o tf-idfmodelo. Vamos treiná-lo em nosso corpus e depois transformar a string “grafo de árvores”.

Exemplo

from gensim import models
tfidf = models.TfidfModel(BoW_corpus)
words = "trees graph".lower().split()
print(tfidf[dictionary.doc2bow(words)])

Resultado

[(3, 0.4869354917707381), (4, 0.8734379353188121)]

Agora, uma vez que criamos o modelo, podemos transformar todo o corpus via tfidf e indexá-lo, e consultar a similaridade do nosso documento de consulta (estamos dando ao documento de consulta 'sistema de árvores') em relação a cada documento no corpus -

Exemplo

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)))

Resultado

[(0, 0.0), (1, 0.0), (2, 1.0), (3, 0.4869355), (4, 0.4869355)]

Da saída acima, o documento 4 e o documento 5 têm uma pontuação de similaridade de cerca de 49%.

Além disso, também podemos classificar essa saída para maior legibilidade da seguinte maneira -

Exemplo

for doc_number, score in sorted(enumerate(sims), key=lambda x: x[1], reverse=True):
   print(doc_number, score)

Resultado

2 1.0
3 0.4869355
4 0.4869355
0 0.0
1 0.0