Szukam rozwiązania następującego problemu: Mam zestaw zdań jako zestaw danych i chcę móc wpisać nowe zdanie i znaleźć zdanie, które jest najbardziej podobne do tego w zestawie danych. Przykład mógłby wyglądać następująco:
Nowe zdanie: „ I opened a new mailbox
”
Prognozowanie na podstawie zestawu danych:
Sentence | Similarity
A dog ate poop 0%
A mailbox is good 50%
A mailbox was opened by me 80%
Czytałem, że podobieństwo cosinus może być użyte do rozwiązania tego rodzaju problemów w połączeniu z tf-idf (i RNN nie powinny przynosić znaczących ulepszeń w podstawowych metodach), lub też word2vec jest używany do podobnych problemów. Czy te rzeczywiście są również przydatne w tym konkretnym przypadku? Czy są jakieś inne techniki / algorytmy, aby rozwiązać ten problem (najlepiej w Pythonie i SKLearn, ale jestem otwarty na naukę o TensorFlow)?
źródło
Odpowiedzi:
Twój problem można rozwiązać za pomocą Word2vec oraz Doc2vec. Doc2vec dałby lepsze wyniki, ponieważ bierze pod uwagę zdania podczas szkolenia modelu.
Rozwiązanie Doc2vec
Możesz trenować swój model doc2vec, klikając ten link . Możesz wykonać kilka czynności wstępnego przetwarzania, takich jak usunięcie wszystkich słów stop (słowa takie jak „the”, „an” itp., Które nie dodają większego znaczenia do zdania). Po wytrenowaniu modelu możesz znaleźć podobne zdania, używając następującego kodu.
Wyniki:
Powyższe wyniki to lista krotek dla
(label,cosine_similarity_score)
. W ten sposób możesz odwzorować wyniki na zdaniatrain[29670]
.Należy pamiętać, że powyższe podejście da dobre wyniki tylko wtedy, gdy model doc2vec zawiera osadzenia słów znalezionych w nowym zdaniu. Jeśli spróbujesz uzyskać podobieństwo do jakiegoś bełkotliwego zdania
sdsf sdf f sdf sdfsdffg
, to da ci to niewiele rezultatów, ale mogą one nie być rzeczywistymi podobnymi zdaniami, ponieważ Twój wytrenowany model mógł nie widzieć tych bełkotliwych słów podczas treningu modelu. Spróbuj więc wytrenować swój model na jak największej liczbie zdań, aby uwzględnić jak najwięcej słów w celu uzyskania lepszych wyników.Rozwiązanie Word2vec
Jeśli używasz word2vec, musisz obliczyć średni wektor dla wszystkich słów w każdym zdaniu i użyć podobieństwa cosinus między wektorami.
Oblicz podobieństwo
źródło
sentence_1.split()
robi to samo.Word Mover's Distance (WMD) to algorytm służący do określania odległości między zdaniami. WMD opiera się na osadzaniu słów (np. Word2vec), które kodują znaczenie semantyczne słów w gęstych wektorach.
Na przykład:
Źródło: Papier „Od osadzania słów do odległości dokumentów”
Pakiet gensim ma wdrożenie BMR .
W przypadku twojego problemu porównasz wprowadzone zdanie ze wszystkimi innymi zdaniami i zwrócisz zdanie o najniższej BMR.
źródło
Możesz wypróbować proste rozwiązanie za pomocą sklearn i będzie działać dobrze.
Użyj tfidfvectorizer, aby uzyskać wektorową reprezentację każdego tekstu
Dopasuj wektoryzator do swoich danych, usuwając słowa-stop.
Przekształć nowy wpis z uprzednio przeszkolonym wektoryzatorem
Oblicz podobieństwo cosinus między tą reprezentacją a każdą reprezentacją elementów w zestawie danych.
Jeśli masz zestaw danych Hugh, możesz go zgrupować (na przykład za pomocą KMeans ze scikit learn) po uzyskaniu reprezentacji i przed prognozowaniem nowych danych.
Ten kod wykonuje wszystkie te kroki. Możesz to sprawdzić na moim repozytorium github .
źródło
Istnieje kilka ostatnich prac opartych na wariacyjnym auto-enkoderze w modelach RNN. Generowanie zdań z przestrzeni ciągłej z implementacjami pytorch: kod github .
Udało im się skompresować semantyczną, składniową globalną cechę zdania do jakiejś utajonej przestrzeni wyrażonej być może za pomocą skończonych 10–30 niezależnych zmiennych losowych (rozkład czynnikowy).
nowy pomysł w tej pracy interpolują dwa zdania. a wyniki były dość niesamowite.
źródło
Uogólnione rozwiązanie składa się z następujących kroków -
Po osadzeniu słowa w każdym słowie możesz zastosować dowolną metrykę podobieństwa, taką jak podobieństwo cosinus itp. Do każdego zdania, aby zmierzyć podobieństwo z innymi.
źródło