Hier ist ein Beispiel in pyspark
, die ich schätze, ist einfach nach Scala zu portieren - der Schlüssel ist die Verwendung von model.transform
.
Zunächst trainieren wir das Modell wie im Beispiel:
from pyspark import SparkContext
from pyspark.mllib.feature import Word2Vec
sc = SparkContext()
inp = sc.textFile("text8_lines").map(lambda row: row.split(" "))
k = 220 # vector dimensionality
word2vec = Word2Vec().setVectorSize(k)
model = word2vec.fit(inp)
k
die Dimensionalität der Wortvektoren ist - je höher desto besser (Standardwert ist 100), aber Sie werden Speicher benötigen, und die höchste Zahl, die ich mit meiner Maschine gehen konnte, war 220. (BEARBEITEN: Typische Werte in den relevanten Publikationen sind zwischen 300 und 1000)
Nachdem wir das Modell trainiert haben, können wir eine einfache Funktion wie folgt definieren:
def getAnalogy(s, model):
qry = model.transform(s[0]) - model.transform(s[1]) - model.transform(s[2])
res = model.findSynonyms((-1)*qry,5) # return 5 "synonyms"
res = [x[0] for x in res]
for k in range(0,3):
if s[k] in res:
res.remove(s[k])
return res[0]
Nun, hier sind einige Beispiele mit den Ländern und ihre Hauptstädte:
s = ('france', 'paris', 'portugal')
getAnalogy(s, model)
# u'lisbon'
s = ('china', 'beijing', 'russia')
getAnalogy(s, model)
# u'moscow'
s = ('spain', 'madrid', 'greece')
getAnalogy(s, model)
# u'athens'
s = ('germany', 'berlin', 'portugal')
getAnalogy(s, model)
# u'lisbon'
s = ('japan', 'tokyo', 'sweden')
getAnalogy(s, model)
# u'stockholm'
s = ('finland', 'helsinki', 'iran')
getAnalogy(s, model)
# u'tehran'
s = ('egypt', 'cairo', 'finland')
getAnalogy(s, model)
# u'helsinki'
Die Ergebnisse sind nicht immer richtig - ich es Ihnen überlassen werden, zu experimentieren, aber sie besser mit mehr Training Daten und erhöhte Vektordimensionalität k
.
Die for
Schleife in der Funktion entfernt Einträge, die zu der Eingabeabfrage selbst gehören, da ich festgestellt habe, dass häufig die richtige Antwort die zweite in der zurückgegebenen Liste war, wobei die erste normalerweise einer der Eingabebegriffe ist.
Können Sie die Antwort auch jetzt noch annehmen? Danke ... – desertnaut