Ecco un esempio in pyspark
, che immagino è semplice per portarlo su Scala - la chiave è l'uso di model.transform
.
In primo luogo, ci alleniamo il modello come nell'esempio:
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
è la dimensionalità dei vettori di parole - più alto è il migliore (valore di default è 100), ma è necessario la memoria, e il numero più alto possibile con la mia macchina era 220. (MODIFICA: I valori tipici nelle pubblicazioni pertinenti sono compresi tra 300 e 1000)
Dopo aver addestrato il modello, è possibile definire una funzione semplice come segue:
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]
Ora, ecco alcuni esempi con i paesi e le loro capitali:
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'
I risultati non sono sempre corrette - Lascio a voi di sperimentare, ma ottengono meglio con più formazione dati e aumento della dimensionalità vettoriale k
.
Il ciclo for
nella funzione rimuove le voci che appartengono alla query di input stessa, come ho notato che spesso la risposta corretta era la seconda nell'elenco restituito, con il primo di solito è uno dei termini di input.
Potrebbe gentilmente accettare la risposta, anche adesso? Grazie ... – desertnaut