mich Ihnen eine andere Tutorial ist von mir geschrieben Let geben. Es beantwortet Ihre Frage, macht aber auch eine Erklärung, warum wir einige Dinge tun. Ich habe auch versucht, es kurz zu machen.
So haben Sie eine list_of_documents
, die nur ein Array von Strings und anderen document
ist, die nur eine Zeichenfolge ist. Sie müssen ein solches Dokument aus dem list_of_documents
finden, das dem document
am ähnlichsten ist.
wir sie miteinander zu verknüpfen: documents = list_of_documents + [document]
Lasst uns mit Abhängigkeiten starten. Es wird klar werden, warum wir jeden von ihnen verwenden.
from nltk.corpus import stopwords
import string
from nltk.tokenize import wordpunct_tokenize as tokenize
from nltk.stem.porter import PorterStemmer
from sklearn.feature_extraction.text import TfidfVectorizer
from scipy.spatial.distance import cosine
Einer der Ansätze, die Anwendungen sein kann, ist ein bag-of-words Ansatz, bei dem wir jedes Wort in dem Dokument unabhängig von anderen zu behandeln und nur alle zusammen in der großen Tasche werfen.Von einem Gesichtspunkt verliert es viele Informationen (wie die Wörter verbunden sind), aber unter einem anderen Gesichtspunkt macht es das Modell einfach.
In Englisch und in jeder anderen menschlichen Sprache gibt es viele "nutzlose" Wörter wie "a", "the", "in", die so häufig sind, dass sie nicht viel Bedeutung besitzen. Sie heißen stop words und es ist eine gute Idee, sie zu entfernen. Eine andere Sache, die man bemerken kann, ist, dass Wörter wie "analysieren", "Analysator", "Analyse" wirklich ähnlich sind. Sie haben eine gemeinsame Wurzel und alle können in nur ein Wort umgewandelt werden. Dieser Prozess wird stemming genannt und es existieren verschiedene Stemmer, die sich in Geschwindigkeit, Aggressivität usw. unterscheiden. Also transformieren wir jedes der Dokumente in eine Liste von Wortstämmen ohne Stoppwörter. Außerdem verwerfen wir alle Interpunktionszeichen.
porter = PorterStemmer()
stop_words = set(stopwords.words('english'))
modified_arr = [[porter.stem(i.lower()) for i in tokenize(d.translate(None, string.punctuation)) if i.lower() not in stop_words] for d in documents]
Also, wie hilft uns diese Tüte Worte? Stellen Sie sich vor, wir haben 3 Taschen: [a, b, c]
, [a, c, a]
und [b, c, d]
. Wir können sie in vectors in the basis[a, b, c, d]
konvertieren. Also enden wir mit Vektoren: [1, 1, 1, 0]
, [2, 0, 1, 0]
und [0, 1, 1, 1]
. Ähnliches gilt für unsere Dokumente (nur die Vektoren sind viel zu lang). Jetzt sehen wir, dass wir viele Wörter entfernt haben und andere auch dazu gebracht haben, die Dimensionen der Vektoren zu verringern. Hier gibt es nur interessante Beobachtungen. Längere Dokumente werden viel positivere Elemente haben als kürzere, deshalb ist es schön, den Vektor zu normalisieren. Dies wird Begriff Häufigkeit TF genannt, Menschen verwendet auch zusätzliche Informationen darüber, wie oft das Wort in anderen Dokumenten verwendet wird - inverse Dokument Häufigkeit IDF. Zusammen haben wir eine Metrik TF-IDF which have a couple of flavors. Dies kann mit einer Zeile in sklearn :-)
modified_doc = [' '.join(i) for i in modified_arr] # this is only to convert our list of lists to list of strings that vectorizer uses.
tf_idf = TfidfVectorizer().fit_transform(modified_doc)
Eigentlich vectorizer allows to do a lot of things wie Entfernen von Stoppwörtern und Kleinschreibung erreicht werden. Ich habe sie in einem separaten Schritt gemacht, nur weil sklearn nicht englische Stoppwörter hat, aber nltk hat.
Also haben wir alle Vektoren berechnet. Der letzte Schritt besteht darin, herauszufinden, welcher dem letzten am ähnlichsten ist. Es gibt verschiedene Möglichkeiten, um das zu erreichen, eine davon ist die euklidische Distanz, die nicht so groß ist, aus dem Grund discussed here. Ein anderer Ansatz ist cosine similarity. Wir durchlaufen alle Dokumente und Berechnung Cosinus Ähnlichkeit zwischen dem Dokument und die letzte:
l = len(documents) - 1
for i in xrange(l):
minimum = (1, None)
minimum = min((cosine(tf_idf[i].todense(), tf_idf[l + 1].todense()), i), minimum)
print minimum
Jetzt minimale Informationen über die beste Dokument und seine Punktzahl haben.
Für jeden Vektor in trainVectorizerArray müssen Sie die Kosinusähnlichkeit mit dem Vektor in testVectorizerArray finden. – excray
@excray Danke, mit deinem hilfreichen Punkt schaffe ich es, es herauszufinden, sollte ich die Antwort setzen? –
@excray Aber ich habe kleine Frage, actuall tf * IDF Berechnung hat keinen Nutzen für diese, weil ich nicht die Endergebnisse verwenden, die in der Matrix angezeigt wird. –