Incorporação de palavras e Word2Vec com exemplos
ā” Resumo Inteligente
Word Embedding e Word2Vec convertem texto em vetores numéricos densos para que modelos de aprendizado de mÔquina reconheçam palavras com significados semelhantes. Este recurso explica a técnica, suas arquiteturas CBOW e Skip-Gram, funções de ativação e uma implementação completa no Gensim para aplicações reais.

O que é incorporação de palavras?
Incorporação de palavras Ć© um tipo de representação de palavras que permite que algoritmos de aprendizado de mĆ”quina entendam palavras com significados semelhantes. Ć uma tĆ©cnica de modelagem de linguagem e aprendizado de recursos para mapear palavras em vetores de nĆŗmeros reais usando redes neurais, modelos probabilĆsticos ou redução de dimensionalidade na matriz de coocorrĆŖncia de palavras. Alguns modelos de incorporação de palavras sĆ£o Word2vec (Google), GloVe (Stanford) e fastText (Facebook).
O Word Embedding tambĆ©m Ć© chamado de modelo semĆ¢ntico distribuĆdo, modelo de representação distribuĆda, espaƧo vetorial semĆ¢ntico ou modelo de espaƧo vetorial. Ao ler esses nomes, vocĆŖ se depara com a palavra semĆ¢nticoO que significa categorizar palavras semelhantes juntas. Por exemplo, frutas como maçã, manga e banana devem ser colocadas próximas umas das outras, enquanto livros serĆ£o colocados longe dessas palavras. Em um sentido mais amplo, o word embedding criarĆ” um vetor de frutas que serĆ” colocado longe da representação vetorial de livros.
Onde a incorporação de palavras é usada?
A incorporação de palavras auxilia na geração de caracterĆsticas, agrupamento de documentos, classificação de texto e processamento de linguagem natural. Vamos listar essas aplicaƧƵes e discutir cada uma delas.
- Calcule palavras semelhantes: A incorporação de palavras é usada para sugerir palavras semelhantes à palavra que estÔ sendo submetida ao modelo de previsão. Além disso, também sugere palavras diferentes, bem como as palavras mais comuns.
- Crie um grupo de palavras relacionadas: Ć usado para agrupamento semĆ¢ntico.ping, que agrupa coisas com caracterĆsticas semelhantes e afasta itens diferentes.
- Recurso para classificação de texto: O texto é mapeado em matrizes de vetores que são fornecidas ao modelo para treinamento e previsão. Modelos de classificação baseados em texto não podem ser treinados com strings, portanto, esse método converte o texto em um formato treinÔvel por mÔquina. Seus recursos de construção semântica auxiliam ainda mais na classificação baseada em texto.
- Agrupamento de documentos: Esta é mais uma aplicação onde Word Embedding e Word2vec são amplamente utilizados.
- Processamento de linguagem natural: Existem muitas aplicações em que o word embedding é útil e supera o feature extracfases de anÔlise, como a classificação gramatical, a anÔlise de sentimentos e a anÔlise sintÔtica.
Agora que vocĆŖ entende onde o word embedding Ć© aplicado, vamos analisar o modelo mais popular usado para criar esses embeddings.
O que Ć© Word2vec?
Word2vec à uma técnica ou modelo que produz representações vetoriais de palavras para uma melhor representação das mesmas. Trata-se de um método de processamento de linguagem natural que captura um grande número de relações sintÔticas e semânticas precisas entre palavras. à uma rede neural rasa de duas camadas que, após o treinamento, consegue detectar palavras sinÓnimas e sugerir palavras adicionais para frases parciais.
Antes de prosseguirmos, observe a diferença entre uma rede neural rasa e uma rede neural profunda, conforme mostrado no diagrama de exemplo de incorporação de palavras abaixo:
Uma rede neural rasa consiste em apenas uma camada oculta entre a entrada e a saĆda, enquanto uma rede neural profunda contĆ©m mĆŗltiplas camadas ocultas entre a entrada e a saĆda. A entrada Ć© processada por nós, enquanto a camada oculta, assim como a camada de saĆda, contĆ©m neurĆ“nios.

Word2vec Ć© uma rede de duas camadas, composta por uma camada de entrada, uma camada oculta e uma camada de saĆda.
O Word2vec foi desenvolvido por um grupo de pesquisadores liderado por Tomas Mikolov em GoogleO Word2vec é melhor e mais eficiente do que o modelo de anÔlise semântica latente.
Por que Word2vec?
O Word2vec representa palavras em um espaço vetorial. As palavras são representadas na forma de vetores, e o posicionamento é feito de forma que palavras com significados semelhantes apareçam juntas e palavras com significados diferentes fiquem distantes umas das outras. Isso também é chamado de relação semântica. Redes neurais não entendem texto; em vez disso, elas entendem apenas números. O Word Embedding (incorporação de palavras) fornece uma maneira de converter texto em um vetor numérico.
O Word2vec reconstrói o contexto linguĆstico das palavras. Antes de prosseguirmos, vamos entender o que Ć© contexto linguĆstico. Em um cenĆ”rio geral, quando falamos ou escrevemos para nos comunicar, outras pessoas tentam descobrir o objetivo da frase. Por exemplo: āQual Ć© a temperatura da Ćndia?ā Aqui, o contexto Ć© que o usuĆ”rio quer saber a ātemperatura da Ćndiaā. Resumindo, o principal objetivo de uma frase Ć© o contexto. As palavras ou frases que cercam a linguagem falada ou escrita ajudam a determinar o significado do contexto. O Word2vec aprende a representação vetorial das palavras por meio desses contextos.
O que o Word2vec faz?
Antes da incorporação de palavras
à importante saber qual abordagem era usada antes do word embedding e quais eram suas desvantagens. Em seguida, veremos como essas desvantagens são superadas pelo word embedding usando a abordagem Word2vec. Finalmente, abordaremos o funcionamento do Word2vec, pois é fundamental entender seu processo.
Abordagem para AnÔlise Semântica Latente
Essa é a abordagem usada antes dos word embeddings. Ela utiliza o conceito de "Saco de Palavras", onde as palavras são representadas na forma de vetores codificados. Trata-se de uma representação vetorial esparsa, cuja dimensão é igual ao tamanho do vocabulÔrio. Se a palavra ocorre no dicionÔrio, ela é contabilizada; caso contrÔrio, não é. Para entender melhor, veja o programa abaixo.
Exemplo Word2vec
from sklearn.feature_extraction.text import CountVectorizer vectorizer = CountVectorizer() data_corpus = ["guru99 is the best site for online tutorials. I love to visit guru99."] vocabulary = vectorizer.fit(data_corpus) X = vectorizer.transform(data_corpus) print(X.toarray()) print(vectorizer.get_feature_names_out())
SaĆda:
[[1 2 1 1 1 1 1 1 1 1]] [u'best', u'guru99', u'is', u'love', u'online', u'sitefor', u'the', u'to', u'tutorials', u'visit']
Code Explicação
- O módulo CountVectorizer é usado para armazenar o vocabulÔrio com base na correspondência das palavras a ele. Ele é importado do sklearn.
- FaƧa o objeto usando a classe CountVectorizer.
- Escreva os dados da lista que devem ser ajustados no CountVectorizer.
- Os dados cabem no objeto criado a partir da classe CountVectorizer.
- Aplique uma abordagem de saco de palavras para contar palavras nos dados usando o vocabulĆ”rio. Se uma palavra ou token nĆ£o estiver disponĆvel no vocabulĆ”rio, a posição do Ćndice correspondente serĆ” definida como zero.
- A variĆ”vel na linha 5, que Ć© x, Ć© convertida em um array (um mĆ©todo disponĆvel para x). Isso fornece a contagem de cada token na frase ou lista fornecida na linha 3.
- Isto mostra as caracterĆsticas que fazem parte do vocabulĆ”rio quando este Ć© ajustado utilizando os dados da linha 4.
Na abordagem da Semântica Latente, a linha representa palavras únicas, enquanto a coluna representa o número de vezes que essa palavra aparece no documento. Trata-se de uma representação das palavras na forma de uma matriz de documentos. O coeficiente TF-IDF (Frequência do Termo-Frequência Inversa do Documento) é utilizado para calcular a frequência das palavras no documento, dividindo-se a frequência do termo no documento pela frequência do termo em todo o corpus.
Deficiência do método Bag of Words
- Ignora a ordem das palavras; por exemplo, isto Ć© mau = Isso Ć© ruim..
- Ignora o contexto das palavras. Suponha que escrevamos a frase "Ele amava livros. A melhor educação é encontrada nos livros." Isso criaria dois vetores: um para "Ele amava livros" e outro para "A melhor educação é encontrada nos livros". Ambos seriam tratados como ortogonais, o que os tornaria independentes, mas, na realidade, estão relacionados.
Para superar essas limitaƧƵes, foi desenvolvido o word embedding, e o Word2vec Ʃ uma das abordagens utilizadas para implementƔ-lo.
Como funciona o Word2vec?
O Word2vec aprende uma palavra prevendo o contexto em que ela estĆ” inserida. Por exemplo, vamos considerar a palavra "Ele". ama Futebol."
Queremos calcular o Word2vec para a palavra: ama.
Suponha:
loves = Vin. P(Vout / Vin) is calculated where, Vin is the input word. P is the probability of likelihood. Vout is the output word.
A palavra ama O algoritmo percorre cada palavra do corpus, codificando as relações sintÔticas e semânticas entre elas. Isso auxilia na identificação de palavras semelhantes e anÔlogas.
Todas as caracterĆsticas aleatórias da palavra ama sĆ£o calculados. Essas caracterĆsticas sĆ£o alteradas ou atualizadas em relação Ć s palavras vizinhas ou contextuais com a ajuda de um Retropropagação mĆ©todo.
Outra forma de aprendizado Ć© que, se os contextos de duas palavras forem semelhantes, ou se duas palavras tiverem caracterĆsticas semelhantes, entĆ£o essas palavras estĆ£o relacionadas.
Word2vec Archiarquitetura
Existem duas arquiteturas usadas pelo Word2vec:
- Saco de Palavras ContĆnuo (CBOW)
- Skip-gram
Antes de prosseguirmos, vamos discutir por que essas arquiteturas ou modelos são importantes do ponto de vista da representação de palavras. O aprendizado da representação de palavras é essencialmente não supervisionado, mas alvos/rótulos são necessÔrios para treinar o modelo. Skip-gram e CBOW convertem a representação não supervisionada em uma forma supervisionada para o treinamento do modelo.
No CBOW, a palavra atual Ć© prevista usando a janela das janelas de contexto circundantes. Por exemplo, se wi-1, Wi-2, Wi + 1, Wi + 2 recebem palavras ou contexto, este modelo fornecerĆ” wi.
O Skip-Gram realiza a função oposta à do CBOW, ou seja, prevê a sequência ou o contexto a partir da palavra. Você pode inverter o exemplo para entender melhor. Se wi se for dado, isso preverÔ o contexto, ou wi-1, Wi-2, Wi + 1, Wi + 2.
O Word2vec oferece a opção de escolher entre CBOW (Continuous Bag of Words) e skip-gram. Esses parĆ¢metros sĆ£o fornecidos durante o treinamento do modelo. Ć possĆvel optar por usar amostragem negativa ou uma camada softmax hierĆ”rquica.
Saco ContĆnuo de Palavras
Vamos desenhar um diagrama de exemplo simples do Word2vec para entender a arquitetura de saco de palavras contĆnuo.
Vamos calcular as equações matematicamente. Suponha que V seja o tamanho do vocabulÔrio e N seja o tamanho da camada oculta. A entrada é definida como { xi-1, xi-2, xi + 1, xi + 2 Obtemos a matriz de pesos multiplicando V * N. Outra matriz é obtida multiplicando o vetor de entrada pela matriz de pesos. Isso também pode ser compreendido pela seguinte equação.
h = xitW
onde xit e W são, respectivamente, o vetor de entrada e a matriz de pesos.
Para calcular a correspondência entre o contexto e a próxima palavra, consulte a equação abaixo.
u = representação prevista * h
onde a representação prevista é obtida a partir do modelo na equação acima.
Modelo Skip-Gram
A abordagem Skip-Gram é usada para prever uma frase a partir de uma palavra de entrada. Para melhor compreensão, vejamos o diagrama apresentado no exemplo Word2vec abaixo.
Pode-se considerar esse modelo como o inverso do modelo Continuous Bag of Words, onde a entrada Ć© a palavra e o modelo fornece o contexto ou a sequĆŖncia. Podemos tambĆ©m concluir que o alvo Ć© fornecido como entrada, e a camada de saĆda Ć© replicada vĆ”rias vezes para acomodar o nĆŗmero escolhido de palavras de contexto. O vetor de erro de todas as camadas de saĆda Ć© somado para ajustar os pesos por meio de um mĆ©todo de retropropagação.
Qual modelo escolher?
O CBOW é vÔrias vezes mais rÔpido que o skip-gram e fornece uma frequência melhor para palavras frequentes, enquanto o skip-gram precisa de uma pequena quantidade de dados de treinamento e representa até mesmo palavras ou frases raras. A tabela abaixo compara ambas as arquiteturas rapidamente.
| Aspecto | CBOW | Pular grama |
|---|---|---|
| Predição | Prevê a palavra-alvo a partir do contexto. | Prevê o contexto a partir da palavra-alvo. |
| Velocidade de treino | Mais rƔpido | Mais lento |
| Palavras frequentes | Maior precisão | Precisão menor |
| Palavras raras | Representação mais fraca | Representação mais forte |
| Dados de treinamento | Precisa de mais dados | Funciona com menos dados |
A relação entre Word2vec e NLTK
NLTK Ć© o Natural Language ToolO Word2vec Ć© um kit de prĆ©-processamento de texto. Ele permite realizar diversas operaƧƵes, como marcação gramatical, lematização, stemming, remoção de stopwords e remoção de palavras raras ou pouco usadas. Isso auxilia na limpeza do texto e na extração de caracterĆsticas das palavras mais relevantes. Por outro lado, o Word2vec Ć© utilizado para correspondĆŖncia semĆ¢ntica (itens intimamente relacionados) e sintĆ”tica (sequĆŖncia). Com o Word2vec, Ć© possĆvel encontrar palavras semelhantes, palavras diferentes, realizar redução de dimensionalidade e muito mais. Outra caracterĆstica importante do Word2vec Ć© a conversĆ£o da representação de texto de alta dimensionalidade em vetores de baixa dimensionalidade.
Onde usar NLTK e Word2vec?
Se for necessÔrio realizar tarefas de propósito geral, como tokenização, etiquetagem POS e anÔlise sintÔtica, deve-se optar pelo NLTK, enquanto que para prever palavras de acordo com algum contexto, modelagem de tópicos ou similaridade de documentos, deve-se usar o Word2vec.
Relação de NLTK e Word2vec com ajuda de código
NLTK e Word2vec podem ser usados āāem conjunto para encontrar representaƧƵes de palavras semelhantes ou correspondĆŖncias sintĆ”ticas. O toolkit NLTK permite carregar diversos pacotes que acompanham o NLTK, e um modelo pode ser criado usando o Word2vec. Em seguida, ele pode ser testado com palavras em tempo real. Vejamos a combinação de ambos no código a seguir. Antes de prosseguir, consulte os corpora fornecidos pelo NLTK. VocĆŖ pode baixĆ”-los usando o comando:
nltk(nltk.download('all'))
Por favor, veja a captura de tela para o código.
import nltk import gensim from nltk.corpus import abc model = gensim.models.Word2Vec(abc.sents()) X = list(model.wv.vocab) data = model.most_similar('science') print(data)
SaĆda:
[('law', 0.9415997266769409), ('practice', 0.9276568293571472), ('discussion', 0.9259148836135864), ('agriculture', 0.9257254004478455), ('media', 0.9232194423675537), ('policy', 0.922248125076294), ('general', 0.9166069030761719), ('undertaking', 0.916458249092102), ('tight', 0.9129181504249573), ('board', 0.9107444286346436)]
Explicação de Code
- A biblioteca nltk foi importada, de onde você pode baixar o corpus abc que usaremos na próxima etapa.
- O Gensim foi importado. Se o Gensim Word2vec nĆ£o estiver instalado, instale-o usando o comando āpip3 install gensimā. Veja a captura de tela abaixo.
- Importe o corpus abc, que foi baixado usando nltk.download('abc').
- Passe os arquivos para o modelo Word2vec, que Ć© importado usando o Gensim, como frases.
- O vocabulƔrio Ʃ armazenado na forma de uma variƔvel.
- O modelo é testado na palavra de exemplo. ciência, visto que esses arquivos estão relacionados à ciência.
- Aqui, o modelo prevĆŖ uma palavra semelhante Ć "ciĆŖncia".
Ativadores e Word2Vec
A função de ativação de um neurĆ“nio define a saĆda desse neurĆ“nio em resposta a um conjunto de estĆmulos. Ela Ć© inspirada biologicamente pela atividade em nossos cĆ©rebros, onde diferentes neurĆ“nios sĆ£o ativados por diferentes estĆmulos. Vamos entender a função de ativação atravĆ©s do diagrama a seguir.
Aqui, x1, x2, ⦠x4 são os nós da rede neural.
w1, w2 e w3 são os pesos dos nós.
A soma (Σ) de todos os pesos e valores dos nós funciona como a função de ativação.
Por que função de ativação?
Se nenhuma função de ativação for usada, a saĆda serĆ” linear, mas a funcionalidade de uma função linear Ć© limitada. Para alcanƧar funcionalidades complexas como detecção de objetos, classificação de imagens, etc., Ć© necessĆ”rio utilizar uma função de ativação.ping Para gerar texto usando voz e para muitas outras saĆdas nĆ£o lineares, Ć© necessĆ”ria uma função de ativação.
Como a camada de ativação é calculada na incorporação de palavras (Word2vec)
A camada Softmax (função exponencial normalizada) Ć© a função da camada de saĆda que ativa ou dispara cada nó. Outra abordagem utilizada Ć© a Softmax HierĆ”rquica, cuja complexidade Ć© calculada por O(log n).2V), enquanto que na softmax Ć© O(V), onde V Ć© o tamanho do vocabulĆ”rio. A diferenƧa entre elas reside na redução da complexidade na camada softmax hierĆ”rquica. Para entender seu funcionamento, veja o exemplo de incorporação de palavras abaixo:
Suponha que queiramos calcular a probabilidade de observar a palavra gosta, Dado um determinado contexto, o fluxo da raiz para o nó folha primeiro se moverÔ para o nó 2 e depois para o nó 5. Portanto, se tivermos um vocabulÔrio de tamanho 8, apenas três cÔlculos serão necessÔrios. Isso permite decompor o cÔlculo da probabilidade de uma palavra (gosta,).
Que outras opƧƵes estĆ£o disponĆveis alĆ©m do Softmax hierĆ”rquico?
De forma geral, as opƧƵes de incorporação de palavras disponĆveis sĆ£o: Softmax Diferenciado, CNN-Softmax, Amostragem por ImportĆ¢ncia, Amostragem por ImportĆ¢ncia Adaptativa, Estimativa de Contraste de RuĆdo, Amostragem Negativa, Auto-Normalização e Normalização Infrequente.
Falando especificamente sobre o Word2vec, temos amostragem negativa disponĆvel.
A amostragem negativa Ć© uma forma de amostrar os dados de treinamento. Ć semelhante ao mĆ©todo do gradiente descendente estocĆ”stico, mas com algumas diferenƧas. A amostragem negativa busca apenas exemplos de treinamento negativos. Ela se baseia na estimativa contrastiva de ruĆdo e amostra aleatoriamente palavras que nĆ£o estĆ£o no contexto. Ć um mĆ©todo de treinamento rĆ”pido e escolhe o contexto aleatoriamente. Se a palavra prevista aparecer no contexto escolhido aleatoriamente, ambos os vetores estarĆ£o próximos um do outro.
Que conclusão pode ser tirada?
Os ativadores disparam os neurĆ“nios da mesma forma que nossos neurĆ“nios sĆ£o disparados por estĆmulos externos. A camada Softmax Ć© uma das funƧƵes da camada de saĆda que dispara os neurĆ“nios no caso de embeddings de palavras. No Word2vec, temos opƧƵes como softmax hierĆ”rquico e amostragem negativa. Usando ativadores, Ć© possĆvel converter uma função linear em uma função nĆ£o linear, e um algoritmo complexo de aprendizado de mĆ”quina pode ser implementado utilizando essas funƧƵes.
O que Ć© Gensim?
Gensim é um kit de ferramentas de modelagem de tópicos e processamento de linguagem natural de código aberto que é implementado em Python e Cython. O kit de ferramentas Gensim permite que os usuÔrios importem o Word2vec para modelagem de tópicos, a fim de descobrir estruturas ocultas no corpo do texto. O Gensim fornece não apenas uma implementação do Word2vec, mas também do Doc2vec e do FastText.
Esta seção se concentra no Word2vec, portanto, vamos nos ater ao tópico atual.
Como implementar Word2vec usando Gensim
Até agora, discutimos o que é Word2vec, suas diferentes arquiteturas, por que hÔ uma mudança de um modelo de saco de palavras para Word2vec, a relação entre Word2vec e NLTK com código em execução e funções de ativação.
A seguir, apresentamos o mƩtodo passo a passo para implementar o Word2vec usando o Gensim:
Etapa 1) Coleta de dados
O primeiro passo para implementar qualquer modelo de aprendizado de mƔquina ou processamento de linguagem natural Ʃ a coleta de dados.
Observe os dados para construir um chatbot inteligente, conforme mostrado no exemplo Gensim Word2vec abaixo.
[{"tag": "welcome",
"patterns": ["Hi", "How are you", "Is any one to talk?", "Hello", "hi are you available"],
"responses": ["Hello, thanks for contacting us", "Good to see you here", "Hi there, how may I assist you?"]
},
{"tag": "goodbye",
"patterns": ["Bye", "See you later", "Goodbye", "I will come back soon"],
"responses": ["See you later, thanks for visiting", "have a great day ahead", "Wish you Come back again soon."]
},
{"tag": "thankful",
"patterns": ["Thanks for helping me", "Thank your guidance", "That's helpful and kind from you"],
"responses": ["Happy to help!", "Any time!", "My pleasure", "It is my duty to help you"]
},
{"tag": "hoursopening",
"patterns": ["What hours are you open?", "Tell your opening time?", "When are you open?", "Just your timing please"],
"responses": ["We're open every day 8am-7pm", "Our office hours are 8am-7pm every day", "We open office at 8 am and close at 7 pm"]
},
{"tag": "payments",
"patterns": ["Can I pay using credit card?", "Can I pay using Mastercard?", "Can I pay using cash only?"],
"responses": ["We accept VISA, Mastercard and credit card", "We accept credit card, debit cards and cash. Please don't worry"]
}
]
Eis o que concluĆmos a partir dos dados:
- Esses dados contêm três elementos: tag, padrão e respostas. A tag representa a intenção (qual é o tópico da discussão).
- Os dados estão no formato JSON.
- Um padrão é uma pergunta que os usuÔrios farão ao bot.
- As respostas são as informações que o chatbot fornecerÔ para a pergunta/padrão correspondente.
Etapa 2) PrƩ-processamento de dados
à muito importante processar os dados brutos. Se os dados limpos forem alimentados na mÔquina, o modelo responderÔ com mais precisão e aprenderÔ os dados com mais eficiência.
Esta etapa envolve a remoção de palavras irrelevantes, lematização, palavras desnecessÔrias, etc. Antes de prosseguir, é importante carregar os dados e convertê-los em um dataframe. Veja o código abaixo para isso.
import json json_file = 'intents.json' with open('intents.json', 'r') as f: data = json.load(f)
Explicação de Code:
- Como os dados estão em formato JSON, o JSON é importado.
- O arquivo estƔ armazenado na variƔvel.
- O arquivo Ʃ aberto e carregado na variƔvel de dados.
Agora que os dados foram importados, é hora de convertê-los em um dataframe. Veja o código abaixo para o próximo passo.
import pandas as pd df = pd.DataFrame(data) df['patterns'] = df['patterns'].apply(', '.join)
Explicação de Code:
1. Os dados são convertidos em um data frame usando o pandas, que foi importado anteriormente.
2. Converte a lista de padrƵes de coluna em uma string.
from nltk.corpus import stopwords from textblob import Word stop = stopwords.words('english') df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x.lower() for x in x.split())) df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if x not in string.punctuation)) df['patterns'] = df['patterns'].str.replace('[^\w\s]', '') df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if not x.isdigit())) df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if x not in stop)) df['patterns'] = df['patterns'].apply(lambda x: " ".join([Word(word).lemmatize() for word in x.split()]))
Code Explicação:
1. As palavras irrelevantes em inglês são importadas usando o módulo stop-word do kit de ferramentas nltk.
2. Todas as palavras do texto são convertidas para minúsculas usando uma condição `for` e uma função lambda. Função lambda é uma função anÓnima.
3. Todas as linhas do texto no quadro de dados são verificadas quanto à presença de pontuação e, em seguida, filtradas.
4. Caracteres como números ou pontos são removidos usando uma expressão regular.
5. Digits são removidos do texto.
6. As palavras irrelevantes são removidas nesta fase.
7. As palavras foram filtradas e diferentes formas da mesma palavra foram removidas usando lematização. Com isso, concluĆmos o prĆ©-processamento dos dados.
SaĆda:
, patterns, responses, tag 0,hi one talk hello hi available,"['Hello, thanks for contacting us', 'Good to see you here', ' Hi there, how may I assist you?']",welcome 1,bye see later goodbye come back soon,"['See you later, thanks for visiting', 'have a great day ahead', 'Wish you Come back again soon.']",goodbye 2,thanks helping thank guidance thats helpful kind,"['Happy to help!', 'Any time!', 'My pleasure', 'It is my duty to help you']",thankful 3,hour open tell opening time open timing please,"[""We're open every day 8am-7pm"", 'Our office hours are 8am-7pm every day', 'We open office at 8 am and close at 7 pm']",hoursopening 4,pay using credit card pay using mastercard pay using cash,"['We accept VISA, Mastercard and credit card', 'We accept credit card, debit cards and cash. Please dont worry']",payments
Etapa 3) Construção de rede neural usando Word2vec
Agora é hora de construir um modelo usando o módulo Word2vec do Gensim. Precisamos importar o Word2vec do Gensim. Vamos fazer isso, e então construiremos o modelo. Na etapa final, testaremos o modelo com dados em tempo real.
from gensim.models import Word2Vec
Agora podemos construir o modelo com sucesso usando o Word2Vec. Consulte a próxima linha de código para aprender como criar o modelo usando o Word2Vec. O texto é fornecido ao modelo na forma de uma lista, então vamos converter o texto do dataframe para uma lista usando o código abaixo.
Bigger_list = [] for i in df['patterns']: li = list(i.split("")) Bigger_list.append(li) Model = Word2Vec(Bigger_list, min_count=1, size=300, workers=4)
Explicação de Code:
1. Criou-se a lista `bigger_list`, onde a lista interna Ć© anexada. Este Ć© o formato que Ć© fornecido ao modelo Word2Vec.
2. Um laƧo Ʃ implementado e cada entrada da coluna "patterns" do dataframe Ʃ iterada.
3. Cada elemento dos padrƵes de coluna Ʃ dividido e armazenado na lista interna li.
4. A lista interna Ć© concatenada com a lista externa.
5. Esta lista é fornecida ao modelo Word2Vec. Vamos entender alguns dos parâmetros fornecidos aqui.
Contagem_mĆn.: Ignora todas as palavras com frequĆŖncia total inferior a esta.
Tamanho Ele informa a dimensionalidade dos vetores de palavras.
Trabalhadores: Essas são as threads para treinar o modelo.
Existem tambĆ©m outras opƧƵes disponĆveis, e algumas das mais importantes sĆ£o explicadas abaixo.
Janela: Distância mÔxima entre a palavra atual e a prevista em uma frase.
Sg: Trata-se de um algoritmo de treinamento: 1 para skip-gram e 0 para Continuous Bag of Words. JĆ” discutimos esses algoritmos em detalhes acima.
Hs: Se o valor for 1, estamos usando softmax hierƔrquico para o treinamento, e se for 0, estamos usando amostragem negativa.
Alfa: Taxa de aprendizagem inicial.
Vamos exibir o código final abaixo:
# list of libraries used by the code import string from gensim.models import Word2Vec import logging from nltk.corpus import stopwords from textblob import Word import json import pandas as pd # data in json format json_file = 'intents.json' with open('intents.json', 'r') as f: data = json.load(f) # displaying the list of stopwords stop = stopwords.words('english') # dataframe df = pd.DataFrame(data) df['patterns'] = df['patterns'].apply(', '.join) # cleaning the data using the NLP approach print(df) df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x.lower() for x in x.split())) df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if x not in string.punctuation)) df['patterns'] = df['patterns'].str.replace('[^\w\s]', '') df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if not x.isdigit())) df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if x not in stop)) df['patterns'] = df['patterns'].apply(lambda x: " ".join([Word(word).lemmatize() for word in x.split()])) # taking the outer list bigger_list = [] for i in df['patterns']: li = list(i.split(" ")) bigger_list.append(li) # structure of data to be taken by the model.word2vec print("Data format for the overall list:", bigger_list) # custom data is fed to machine for further processing model = Word2Vec(bigger_list, min_count=1, size=300, workers=4)
Etapa 4) Salvamento do modelo
O modelo pode ser salvo nos formatos binƔrio (bin) e modelo (file). O formato binƔrio Ʃ utilizado. Consulte as instruƧƵes abaixo para salvar o modelo.
model.save("word2vec.model") model.save("model.bin")
Explicação do código acima
1. O modelo Ć© salvo no formato de um arquivo .model.
2. O modelo Ć© salvo no formato de um arquivo .bin.
Usaremos esse modelo para realizar testes em tempo real, como palavras semelhantes, palavras diferentes e palavras mais comuns.
Etapa 5) Carregando o modelo e realizando testes em tempo real
O modelo é carregado usando o código abaixo:
model = Word2Vec.load('model.bin')
Se você quiser imprimir o vocabulÔrio, isso é feito usando o comando abaixo:
vocab = list(model.wv.vocab)
Por favor veja o resultado:
['see', 'thank', 'back', 'thanks', 'soon', 'open', 'mastercard', 'card', 'time', 'pay', 'talk', 'cash', 'one', 'please', 'goodbye', 'thats', 'helpful', 'hour', 'credit', 'hi', 'later', 'guidance', 'opening', 'timing', 'hello', 'helping', 'bye', 'tell', 'come', 'using', 'kind', 'available']
Etapa 6) Verificação de palavras mais semelhantes
Vamos implementar as coisas na prƔtica:
similar_words = model.most_similar('thanks') print(similar_words)
Por favor veja o resultado:
[('kind', 0.16104359924793243), ('using', 0.1352398842573166), ('come', 0.11500970274209976), ('later', 0.09989878535270691), ('helping', 0.04855936020612717), ('credit', 0.04659383371472359), ('pay', 0.0329081267118454), ('thank', 0.02484947443008423), ('hour', 0.0202352125197649), ('opening', 0.018177658319473267)]
Etapa 7) NĆ£o corresponde Ć palavra das palavras fornecidas
dissimlar_words = model.doesnt_match('See you later, thanks for visiting'.split()) print(dissimlar_words)
Nós fornecemos as palavras 'Até logo, obrigado pela visita'Este código imprime a palavra mais diferente dentre essas palavras. Vamos executar o código e verificar o resultado.
O resultado após a execução do código acima:
Thanks
Etapa 8) Encontrar a semelhanƧa entre duas palavras
Isso indica o resultado em termos da probabilidade de similaridade entre duas palavras. Veja o código abaixo para saber como executar esta seção.
similarity_two_words = model.similarity('please', 'see') print("Please provide the similarity between these two words:") print(similarity_two_words)
O resultado do código acima é o seguinte:
0.13706
Você pode encontrar outras palavras semelhantes executando o código abaixo:
similar = model.similar_by_word('kind') print(similar)
Resultado do código acima:
[('credit', 0.11764447391033173), ('cash', 0.11440904438495636), ('one', 0.11151769757270813), ('hour', 0.0944807156920433), ('using', 0.0705675333738327), ('thats', 0.05206916481256485), ('later', 0.04502468928694725), ('bye', 0.03960943967103958), ('back', 0.03837274760007858), ('thank', 0.0380823090672493)]


