Gensim - Criando um Dicionário
No capítulo anterior, onde discutimos sobre vetor e modelo, você teve uma ideia sobre o dicionário. Aqui, vamos discutirDictionary objeto com um pouco mais de detalhes.
O que é dicionário?
Antes de nos aprofundarmos no conceito de dicionário, vamos entender alguns conceitos simples de PNL -
Token - Um token significa uma 'palavra'.
Document - Um documento refere-se a uma frase ou parágrafo.
Corpus - Refere-se a uma coleção de documentos como um saco de palavras (BoW).
Para todos os documentos, um corpus sempre contém o id do token de cada palavra junto com sua contagem de frequência no documento.
Vamos passar para o conceito de dicionário no Gensim. Para trabalhar em documentos de texto, o Gensim também requer que as palavras, ou seja, tokens, sejam convertidos em seus ids exclusivos. Para conseguir isso, nos dá a facilidade deDictionary object, que mapeia cada palavra para seu id de número inteiro exclusivo. Ele faz isso convertendo o texto de entrada na lista de palavras e, em seguida, passando-o para ocorpora.Dictionary() objeto.
Necessidade de Dicionário
Agora surge a pergunta: qual é realmente a necessidade do objeto de dicionário e onde ele pode ser usado? No Gensim, o objeto de dicionário é usado para criar um corpus de saco de palavras (BoW) que posteriormente é usado como entrada para a modelagem de tópicos e outros modelos também.
Formas de entrada de texto
Existem três formas diferentes de texto de entrada que podemos fornecer ao Gensim -
Como as sentenças armazenadas no objeto de lista nativa do Python (conhecido como str em Python 3)
Como um único arquivo de texto (pode ser pequeno ou grande)
Vários arquivos de texto
Criação de um dicionário usando Gensim
Conforme discutido, no Gensim, o dicionário contém o mapeamento de todas as palavras, também conhecidas como tokens para seu id de número inteiro único. Podemos criar um dicionário a partir de uma lista de frases, de um ou mais arquivos de texto (arquivo de texto contendo várias linhas de texto). Então, primeiro vamos começar criando um dicionário usando uma lista de frases.
De uma lista de frases
No exemplo a seguir, estaremos criando um dicionário a partir de uma lista de frases. Quando temos uma lista de frases ou você pode dizer várias frases, devemos converter cada frase em uma lista de palavras e as compreensões é uma das maneiras muito comuns de fazer isso.
Exemplo de Implementação
Primeiro, importe os pacotes necessários e necessários da seguinte forma -
import gensim
from gensim import corpora
from pprint import pprint
Em seguida, faça a lista de compreensão da lista de frases / documento para usá-la criando o dicionário -
doc = [
"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."
]
Em seguida, precisamos dividir as frases em palavras. É chamado de tokenização.
text_tokens = [[text for text in doc.split()] for doc in doc]
Agora, com a ajuda do seguinte script, podemos criar o dicionário -
dict_LoS = corpora.Dictionary(text_tokens)
Agora vamos obter mais algumas informações, como o número de tokens no dicionário -
print(dict_LoS)
Resultado
Dictionary(27 unique tokens: ['CNTK', 'Computational', 'Network', 'Toolkit', 'as']...)
Também podemos ver a palavra para mapeamento inteiro único da seguinte maneira -
print(dict_LoS.token2id)
Resultado
{
'CNTK': 0, 'Computational': 1, 'Network': 2, 'Toolkit': 3, 'as': 4,
'formerly': 5, 'known': 6, 'a': 7, 'commercial-grade': 8, 'easy-to-use': 9,
'free': 10, 'is': 11, 'open-source': 12, 'toolkit': 13, 'algorithms': 14,
'brain.': 15, 'deep': 16, 'enable': 17, 'human': 18, 'learn': 19, 'learning': 20,
'like': 21, 'that': 22, 'the': 23, 'to': 24, 'train': 25, 'us': 26
}
Exemplo de implementação completo
import gensim
from gensim import corpora
from pprint import pprint
doc = [
"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."
]
text_tokens = [[text for text in doc.split()] for doc in doc]
dict_LoS = corpora.Dictionary(text_tokens)
print(dict_LoS.token2id)
Do arquivo de texto único
No exemplo a seguir, estaremos criando um dicionário a partir de um único arquivo de texto. Da mesma forma, também podemos criar dicionário a partir de mais de um arquivo de texto (ou seja, diretório de arquivos).
Para isso, salvamos o documento, usado no exemplo anterior, no arquivo de texto denominado doc.txt. Gensim irá ler o arquivo linha por linha e processar uma linha de cada vez usandosimple_preprocess. Dessa forma, não é necessário carregar o arquivo completo na memória de uma só vez.
Exemplo de Implementação
Primeiro, importe os pacotes necessários e necessários da seguinte forma -
import gensim
from gensim import corpora
from pprint import pprint
from gensim.utils import simple_preprocess
from smart_open import smart_open
import os
A próxima linha de códigos fará o dicionário gensim usando o único arquivo de texto denominado doc.txt -
dict_STF = corpora.Dictionary(
simple_preprocess(line, deacc =True) for line in open(‘doc.txt’, encoding=’utf-8’)
)
Agora vamos obter mais algumas informações, como o número de tokens no dicionário -
print(dict_STF)
Resultado
Dictionary(27 unique tokens: ['CNTK', 'Computational', 'Network', 'Toolkit', 'as']...)
Também podemos ver a palavra para mapeamento inteiro único da seguinte maneira -
print(dict_STF.token2id)
Resultado
{
'CNTK': 0, 'Computational': 1, 'Network': 2, 'Toolkit': 3, 'as': 4,
'formerly': 5, 'known': 6, 'a': 7, 'commercial-grade': 8, 'easy-to-use': 9,
'free': 10, 'is': 11, 'open-source': 12, 'toolkit': 13, 'algorithms': 14,
'brain.': 15, 'deep': 16, 'enable': 17, 'human': 18, 'learn': 19,
'learning': 20, 'like': 21, 'that': 22, 'the': 23, 'to': 24, 'train': 25, 'us': 26
}
Exemplo de implementação completo
import gensim
from gensim import corpora
from pprint import pprint
from gensim.utils import simple_preprocess
from smart_open import smart_open
import os
dict_STF = corpora.Dictionary(
simple_preprocess(line, deacc =True) for line in open(‘doc.txt’, encoding=’utf-8’)
)
dict_STF = corpora.Dictionary(text_tokens)
print(dict_STF.token2id)
De vários arquivos de texto
Agora vamos criar um dicionário a partir de vários arquivos, ou seja, mais de um arquivo de texto salvo no mesmo diretório. Para este exemplo, criamos três arquivos de texto diferentes, a saberfirst.txt, second.txt e third.txtcontendo as três linhas do arquivo de texto (doc.txt), usamos no exemplo anterior. Todos esses três arquivos de texto são salvos em um diretório chamadoABC.
Exemplo de Implementação
Para implementar isso, precisamos definir uma classe com um método que possa iterar por todos os três arquivos de texto (Primeiro, Segundo e Terceiro.txt) no diretório (ABC) e produzir a lista processada de tokens de palavras.
Vamos definir a classe chamada Read_files tendo um método chamado __iteration__ () como segue -
class Read_files(object):
def __init__(self, directoryname):
elf.directoryname = directoryname
def __iter__(self):
for fname in os.listdir(self.directoryname):
for line in open(os.path.join(self.directoryname, fname), encoding='latin'):
yield simple_preprocess(line)
Em seguida, precisamos fornecer o caminho do diretório da seguinte forma -
path = "ABC"
#provide the path as per your computer system where you saved the directory.
As próximas etapas são semelhantes às que fizemos nos exemplos anteriores. A próxima linha de códigos criará o diretório Gensim usando o diretório com três arquivos de texto -
dict_MUL = corpora.Dictionary(Read_files(path))
Resultado
Dictionary(27 unique tokens: ['CNTK', 'Computational', 'Network', 'Toolkit', 'as']...)
Agora também podemos ver a palavra para o mapeamento inteiro único da seguinte maneira -
print(dict_MUL.token2id)
Resultado
{
'CNTK': 0, 'Computational': 1, 'Network': 2, 'Toolkit': 3, 'as': 4,
'formerly': 5, 'known': 6, 'a': 7, 'commercial-grade': 8, 'easy-to-use': 9,
'free': 10, 'is': 11, 'open-source': 12, 'toolkit': 13, 'algorithms': 14,
'brain.': 15, 'deep': 16, 'enable': 17, 'human': 18, 'learn': 19,
'learning': 20, 'like': 21, 'that': 22, 'the': 23, 'to': 24, 'train': 25, 'us': 26
}
Salvar e carregar um dicionário Gensim
Gensim apóia seu próprio nativo save() método para salvar o dicionário no disco e load() método para carregar de volta o dicionário do disco.
Por exemplo, podemos salvar o dicionário com a ajuda do seguinte script -
Gensim.corpora.dictionary.save(filename)
#provide the path where you want to save the dictionary.
Da mesma forma, podemos carregar o dicionário salvo usando o método load (). O seguinte script pode fazer isso -
Gensim.corpora.dictionary.load(filename)
#provide the path where you have saved the dictionary.