... ragazzo 0.274816 0.150672 0.256981 -0.061423 0.206469 0.025959 0.067223 -0.140390 -0.641028 0.745807 0.161690 0.488756 -0.216711 -0.353573 -0.040053 -0.148652 0.411991 -0.565740 0.233396 -0.302497 -0.234906 0.204365 0.382733 -0.461834 -0.172323 -0.041091 -0.326205 0.102736 0.379406 -0.367012 0.203576 -0.165576 -0.289311 0.137351 -0.264437 -0.182976 0.669364 -0.482138 0.084991 0.033591 -0.128019 0.494122 -0.545612 0.162401 -0.008899 0.091664 0.466830 -0.239388 0.161264 -0.664787 -0.122336 -0.409639 -0.028745 -0.116255 -0.015530 -0.038676 0.439448 -0.047542 0.346746 -0.002370 -0.165127 0.316057 0.087932 -0.144120 -0.298510 0.098640 0.163334 0.290075 0.364643 -0.346341 0.210945 0.181210 -0.137086 -0.088916 -0.033362 0.127205 -0.279166 0.415014 -0.755850 -0.058353 -0.055651 0.056765 0.038869 0.104142 -0.357542 0.034761 -0.141745 -0.065668 -0.040616 -0.231013 0.053406 -0.429221 -0.170160 0.145266 0.413834 -0.135055 0.148167 -0.029092 -0.157737 0.629005 ...
Ciascuna componente è un numero reale compreso tra 1 e -1. Ogni vettore può essere visto come una freccia che parte dall’origine e punta verso un punto le cui coordinate coincidono con le componenti del vettore in uno spazio cartesiano di 100 dimensioni (per cui ogni punto ha 100 coordinate anziché averne 2 - come accade quando si lavora con un piano - o 3 - come accade quando si lavora con il consueto spazio tridimensionale).
$$ \vec{a}\cdot\vec{b}=\sum_{i=1}^{n} a_{i}b_{i} $$
$$ \lVert \vec{a} \rVert =\sqrt{\sum_{i=1}^{n} a_{i}^{2}} $$
$$ cos(\theta) = \frac{\vec{a}\cdot\vec{b}}{\lVert \vec{a} \rVert \lVert \vec{b} \rVert} $$
import numpy as np dot=lambda a,b: sum(a[i]*b[i] for i in range(len(a))) norm=lambda a: sum(n**2 for n in a)**(1/2) cosine=lambda a,b: dot(a,b)/(norm(a)*norm(b)) with open('vettori/model10000.txt', errors="ignore") as file: lines=file.readlines() vectors={} for line in lines: line=line.split() term=line.pop(0) # term=v[0]; v=v[1:] vector=[] for number in line: vector.append(float(number)) vectors.update({term:np.array(vector)}) print("COSENO TRA 'ragazza' E 'donna':") print(cosine(vectors['ragazza'],vectors['donna'])) print("COSENO TRA 'ragazza' E 'ragazzo'") print(cosine(vectors['ragazza'],vectors['ragazzo'])) print("COSENO TRA 'ragazza' E 'ragazzo'+'donna':") print(cosine(vectors['ragazza'],vectors['ragazzo']+vectors['donna'])) print("COSENO TRA 'ragazza' E 'ragazzo'−'uomo'+'donna':") print(cosine(vectors['ragazza'],vectors['ragazzo']-vectors['uomo']+vectors['donna'])) print() print("COSENO TRA 'regina' E 'donna':") print(cosine(vectors['regina'],vectors['donna'])) print("COSENO TRA 'regina' E 're'") print(cosine(vectors['regina'],vectors['re'])) print("COSENO TRA 'regina' E 're'+'donna':") print(cosine(vectors['regina'],vectors['re']+vectors['donna'])) print("COSENO TRA 'regina' E 're'−'uomo'+'donna':") print(cosine(vectors['regina'],vectors['re']-vectors['uomo']+vectors['donna']))
Dovrebbero apparire i seguenti risultati:
COSENO TRA 'ragazza' E 'donna': 0.7884854538928904 COSENO TRA 'ragazza' E 'ragazzo' 0.8232466445406994 COSENO TRA 'ragazza' E 'ragazzo'+'donna': 0.8851789074969085 COSENO TRA 'ragazza' E 'ragazzo'−'uomo'+'donna': 0.9186331189320743 COSENO TRA 'regina' E 'donna': 0.4508957461643857 COSENO TRA 'regina' E 're' 0.6537117135508874 COSENO TRA 'regina' E 're'+'donna': 0.6945732506357085 COSENO TRA 'regina' E 're'−'uomo'+'donna': 0.7164049341283609
Come si vede, gli elementi confrontati sono via via più simili. In particolare la somiglianza tra 'regina' e 're' o tra 'ragazza' e 'ragazzo' (espressa attraverso il coseno) aumenta se a 're' o a 'ragazzo' si aggiungono le componenti di 'donna' e si sottraggono quelle di 'uomo'. Ciò significa che le relazioni tra i vettori riflettono in certa misura quelle tra i significati che tali vettori rappresentano.
dot=lambda a,b: sum(a[i]*b[i] for i in range(len(a)))
def dot(a,b): return sum(a[i]*b[i] for i in range(len(a)))
def dot(a,b): output=0 for i in range(len(a)): output+=a[i]*b[i] return output
from numpy import dot