Estou procurando resolver o seguinte problema: Eu tenho um conjunto de frases como meu conjunto de dados e desejo poder digitar uma nova frase e encontrar a frase em que a nova é a mais semelhante no conjunto de dados. Um exemplo seria semelhante a:
Nova frase: " I opened a new mailbox
"
Previsão com base no conjunto de dados:
Sentence | Similarity
A dog ate poop 0%
A mailbox is good 50%
A mailbox was opened by me 80%
Eu li que a semelhança de cosseno pode ser usada para resolver esses tipos de problemas associados ao tf-idf (e os RNNs não devem trazer melhorias significativas para os métodos básicos), ou também o word2vec é usado para problemas semelhantes. Também são realmente viáveis para uso neste caso específico? Existem outras técnicas / algoritmos para resolver isso (de preferência com Python e SKLearn, mas também estou aberto para aprender sobre o TensorFlow)?
fonte
Respostas:
Seu problema pode ser resolvido com o Word2vec e também com o Doc2vec. O Doc2vec daria melhores resultados porque leva em consideração as sentenças durante o treinamento do modelo.
Solução Doc2vec
Você pode treinar seu modelo doc2vec seguindo este link . Você pode executar algumas etapas de pré-processamento, como remover todas as palavras de parada (palavras como "the", "an" etc.) que não agregam muito significado à frase. Depois de treinar seu modelo, você poderá encontrar frases semelhantes usando o código a seguir.
Resultados:
Os resultados acima são uma lista de tuplas para
(label,cosine_similarity_score)
. Você pode mapear saídas para frases fazendotrain[29670]
.Observe que a abordagem acima só fornecerá bons resultados se o seu modelo doc2vec contiver incorporação de palavras encontradas na nova frase. Se você tentar obter semelhança com algumas frases sem sentido
sdsf sdf f sdf sdfsdffg
, ele fornecerá poucos resultados, mas essas podem não ser as frases semelhantes, já que seu modelo treinado pode não ter visto essas palavras sem sentido ao treinar o modelo. Portanto, tente treinar seu modelo no máximo de frases possível para incorporar o máximo de palavras para obter melhores resultados.Solução Word2vec
Se você estiver usando o word2vec, precisará calcular o vetor médio para todas as palavras em cada frase e usar a semelhança de cosseno entre vetores.
Calcular semelhança
fonte
sentence_1.split()
faz o mesmo.A Distância do motor de palavras (WMD) é um algoritmo para encontrar a distância entre as frases. O WMD é baseado em incorporação de palavras (por exemplo, word2vec), que codifica o significado semântico das palavras em vetores densos.
Por exemplo:
Fonte: Documento "De incorporados ao Word para documentar distâncias"
O pacote gensim possui uma implementação WMD .
Para o seu problema, você compararia a sentença inserida com todas as outras sentenças e retornaria a sentença com menor WMD.
fonte
Você pode tentar uma solução fácil usando o sklearn e isso funcionará bem.
Use tfidfvectorizer para obter uma representação vetorial de cada texto
Ajuste o vetorizador com seus dados, removendo palavras de parada.
Transforme a nova entrada com o vetorizador treinado anteriormente
Calcule a semelhança de cosseno entre essa representação e cada representação dos elementos em seu conjunto de dados.
Se você possui um conjunto de dados hugh, pode agrupá-lo (por exemplo, usando o KMeans do scikit learn) depois de obter a representação e antes de prever novos dados.
Este código executa todas essas etapas. Você pode verificá-la no meu github repo .
fonte
Há algum trabalho recente baseado no Auto-codificador variacional em modelos RNN. Gerando frases a partir de um espaço contínuo , com implementações pytorch: código do github .
eles conseguiram compactar o recurso global sintático e semântico de uma sentença em algum espaço latente expresso talvez com algumas variáveis aleatórias independentes de 10 a 30 finitas (distribuição fatorada).
a nova idéia neste trabalho, eles interpolam entre duas frases. e os resultados foram surpreendentes.
fonte
A solução generalizada consiste nas seguintes etapas -
Para 1. word2vec é a melhor escolha, mas se você não quiser usar o word2vec, poderá fazer algumas aproximações. Uma maneira é criar uma matriz de co-ocorrência de palavras a partir de suas frases treinadas, seguida pela aplicação do TSVD nela. Matriz de Coccurance den Xn dimensionalidade quando convertido em n Xd dimensionalidade, cria vetores de palavras de d dimensões.
Depois de obter a incorporação de palavras de cada palavra, você pode aplicar qualquer uma das métricas de similaridade, como similaridade de cosseno, etc. em cada frase para medir a similaridade com outras.
fonte