Come calcolo la somiglianza strutturale tra le frasi?


12

Sto lavorando a un problema in cui devo determinare se due frasi sono simili o meno. Ho implementato una soluzione usando l'algoritmo BM25 e i synset di wordnet per determinare la somiglianza sintattica e semantica. La soluzione funziona in modo adeguato e anche se l'ordine delle parole nelle frasi è confuso, sta misurando che due frasi sono simili. Per esempio

  1. Python è un buon linguaggio.
  2. La lingua è un buon pitone.

Il mio problema è determinare che queste due frasi sono simili.

  • Quale potrebbe essere la possibile soluzione per la somiglianza strutturale?
  • Come manterrò la struttura delle frasi?

Potresti essere in grado di utilizzare i vettori di frasi e confrontarli.
Aiden Grossman,

Consiglio vivamente di usare Gensim ( radimrehurek.com/gensim ) per questo compito. Soprattutto i modelli LSI e / o word2vec e fasttext
Robin

Risposte:


2

Il modo più semplice per aggiungere una sorta di misura di somiglianza strutturale è usare gli n-grammi; nel tuo caso bigrams potrebbe essere sufficiente.

Passa attraverso ogni frase e raccogli coppie di parole, come:

  • "python è", "è un", "un buon", "buon linguaggio".

L'altra tua frase ha

  • "language a", "a good", "good python", "python is".

Su otto bigram ne hai due uguali ("python is" e "a good"), quindi potresti dire che la somiglianza strutturale è 2/8.

Naturalmente puoi anche essere più flessibile se sai già che due parole sono semanticamente correlate. Se vuoi dire che Python è un buon linguaggio strutturalmente simile / identico a Java è un ottimo linguaggio , allora potresti aggiungerlo al confronto in modo da elaborare efficacemente "[PROG_LANG] è un linguaggio [POSITIVO-ADJ]", o qualcosa di simile.


5

In primo luogo, prima di iniziare, ti consiglio di fare riferimento a domande simili sulla rete come /datascience/25053/best-practical-algorithm-for-sentence-similarity e https: // stackoverflow. com / domande / 62328 / è-ci-un-algoritmo che-dice-il-semantico-similarità-di-due-frasi

Per determinare la somiglianza delle frasi dobbiamo considerare che tipo di dati abbiamo. Ad esempio, se si disponesse di un set di dati etichettato, ad esempio frasi simili e frasi diverse, un approccio semplice potrebbe essere stato quello di utilizzare un algoritmo supervisionato per classificare le frasi.

Un approccio che potrebbe determinare la somiglianza strutturale della frase sarebbe quello di calcolare la media dei vettori di parole generati dagli algoritmi di incorporamento delle parole, ovvero word2vec. Questi algoritmi creano un vettore per ogni parola e la somiglianza del coseno tra loro rappresenta la somiglianza semantica tra le parole. (Daniel L 2017)

Usando i vettori di parole possiamo usare le seguenti metriche per determinare la somiglianza delle parole.

  • Distanza del coseno tra gli incastri delle parole
  • Distanza euclidea tra gli incastri delle parole

La somiglianza del coseno è una misura della somiglianza tra due vettori diversi da zero di uno spazio interno del prodotto che misura il coseno dell'angolo tra di essi. L'angolo del coseno è la misura della sovrapposizione tra le frasi in termini di contenuto.

La distanza euclidea tra due vettori di parole fornisce un metodo efficace per misurare la somiglianza linguistica o semantica delle parole corrispondenti. (Frank D 2015)

In alternativa, è possibile calcolare l'autovettore delle frasi per determinare la somiglianza delle frasi.

Gli autovettori sono un insieme speciale di vettori associati a un sistema lineare di equazioni (cioè equazione di matrice). Qui viene generata una matrice di somiglianza di frase per ciascun cluster e viene calcolato l'autovettore per la matrice. Puoi leggere di più sull'approccio basato sull'autovettore alla classifica delle frasi su questo documento https://pdfs.semanticscholar.org/ca73/bbc99be157074d8aad17ca8535e2cd956815.pdf

Per il codice sorgente Siraj Rawal ha un notebook Python per creare un insieme di vettori di parole. I vettori di parole possono quindi essere utilizzati per trovare la somiglianza tra le parole. Il codice sorgente è disponibile qui https://github.com/llSourcell/word_vectors_game_of_thrones-LIVE

Un'altra opzione è un tutorial di Oreily che utilizza la libreria gensin Python per determinare la somiglianza tra i documenti. Questo tutorial usa NLTK per tokenizzare quindi crea un modello tf-idf (termine frequenza-documento inverso) dal corpus. Il tf-idf viene quindi utilizzato per determinare la somiglianza dei documenti. Il tutorial è disponibile qui https://www.oreilly.com/learning/how-do-i-compare-document-similarity-using-python


Grazie per aver fornito dettagli preziosi per il problema. Avevo visto l'esempio di Gensim ma ho una domanda: sarà in grado di risolvere il problema che ho citato in questione. Sebbene la soluzione che ho creato stia funzionando bene nel trovare la somiglianza tra le frasi ma si blocca quando l'ordine delle parole viene confuso.
Shubham Tiwari,

4

L'approccio migliore in questo momento (2019):

L'approccio più efficiente ora è quello di utilizzare l' encoder universale di frasi di Google ( paper_2018 ) che calcola la somiglianza semantica tra le frasi usando il prodotto punto dei loro incorporamenti (cioè vettori appresi di 215 valori) . La somiglianza è un numero float compreso tra 0 (cioè nessuna somiglianza) e 1 (cioè forte somiglianza).

L'implementazione è ora integrata nell'hub Tensorflow e può essere facilmente utilizzata. Ecco un codice pronto per l'uso per calcolare la somiglianza tra 2 frasi. Qui otterrò la somiglianza tra "Python è un buon linguaggio" e "Lingua un buon pitone" come nel tuo esempio.

Esempio di codice:

#Requirements: Tensorflow>=1.7 tensorflow-hub numpy

import tensorflow as tf
import tensorflow_hub as hub
import numpy as np

module_url = "https://tfhub.dev/google/universal-sentence-encoder-large/3" 
embed = hub.Module(module_url)
sentences = ["Python is a good language","Language a good python is"]

similarity_input_placeholder = tf.placeholder(tf.string, shape=(None))
similarity_sentences_encodings = embed(similarity_input_placeholder)

with tf.Session() as session:
  session.run(tf.global_variables_initializer())
  session.run(tf.tables_initializer())
  sentences_embeddings = session.run(similarity_sentences_encodings, feed_dict={similarity_input_placeholder: sentences})
  similarity = np.inner(sentences_embeddings[0], sentences_embeddings[1])
  print("Similarity is %s" % similarity)

Produzione:

Similarity is 0.90007496 #Strong similarity

Un'altra opzione nel 2019 è l'incorporamento delle frasi BERT - puoi vedere il codice di esempio qui - github.com/hanxiao/bert-as-service
Adnan S
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.