"- **FastText**: [rawl-300d-2M.vec.zip: 2 million word vectors trained on Common Crawl (600Btokens)](https://dl.fbaipublicfiles.com/fasttext/vectors-english/crawl-300d-2M-subword.zip)\n",
"| Modelo | Vectores pre-entrenados | Vocabulario | Dimensión de los vectores | Idioma |\n",
"| **FastText** | [rawl-300d-2M.vec.zip: 2 million word vectors trained on Common Crawl (600Btokens)](https://dl.fbaipublicfiles.com/fasttext/vectors-english/crawl-300d-2M-subword.zip) | 2 millones | 300 | Inglés |\n",
"\n",
"En el caso de los vectores de GloVe, se ha utilizado la función [*glove2word2vec*](https://radimrehurek.com/gensim/scripts/glove2word2vec.html) de la librería *gensim* para convertir el archivo al formato Word2Vec.\n"
"En el caso de los vectores de GloVe, se ha utilizado la función [*glove2word2vec*](https://radimrehurek.com/gensim/scripts/glove2word2vec.html) de la librería *gensim* para convertir el archivo al formato Word2Vec."
]
},
{
"cell_type": "code",
"execution_count": 18,
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
...
...
@@ -59,12 +61,12 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"Cargar los tres conjuntos vectores puede llevar varios minutos."
"Cargamos los tres conjuntos vectores, lo que puede llevar varios minutos."
]
},
{
"cell_type": "code",
"execution_count": 19,
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
...
...
@@ -146,19 +148,19 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"En este caso, tan solo se realiza la *tokenización/segmentación* de las oraciones y no se aplica ningún otro preprocesamiento."
"En este caso, tan solo se realiza la *tokenización/segmentación* de las oraciones y una conversión a minúscula (parámetro *lowercase* igual a True) para lograr uniformidad."
]
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"PATH_STS = './data/datasets/STS'\n",
"PATH_SICK = './data/datasets/SICK'\n",
"PATH_FREQUENCIES = './data/frequencies.tsv'\n",
"PREPROCESSING = {'lowercase': False, \n",
"PREPROCESSING = {'lowercase': True, \n",
" 'stop_words': False, \n",
" 'punctuation': False, \n",
" 'only_ascii': False, \n",
...
...
@@ -340,7 +342,7 @@
},
{
"cell_type": "code",
"execution_count": 16,
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
...
...
@@ -470,16 +472,42 @@
"### Test de Friedman"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Se plantea el siguiente contraste de hipótesis para determinar si los diferentes métodos son equivalentes:\n",
" \n",
"- H<sub>0</sub>: los métodos son equivalentes\n",
"- H<sub>1</sub>: los métodos no son equivalentes\n",
"\n",
"Para resolver este contraste de hipótesis se realiza el Test de Friedman sobre los rankings promedios. Aún sin realizar el test, estos rankings promedios proporcionan ya una buena comparación de los diferentes métodos.\n",
"El p-valor obtenido para el Test de Friedman es **0,000028**, por lo que la hipótesis nula, H<sub>0</sub>, sobre la equivalencia de los métodos se rechaza a los niveles de confianza habituales."
]
},
{
...
...
@@ -497,13 +532,15 @@
"source": [
"### Test de Nemenyi\n",
"\n",
"Calculamos la distancia crítica de Nemenyi y representamos las diferencias significativas."
"Una vez rechazada la hipótesis nula H<sub>0</sub> de la equivalencia de los métodos, se realiza el test *post-hoc* de Nemenyi para determinar entre que pares de métodos existen diferencias significativas. Considerando un nivel de confianza del 95%, alpha = 0.05, y sabiendo que el número de métodos es *k=9* y el número de conjuntos de datos es *N=6*, la distancia crítica de Nemenyi calculada es:"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
...
...
@@ -518,6 +555,13 @@
"print(\"Distancia crítica de Nemenyi (alpha = 0.05) = \", cd_nemenyi)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Representamos las diferencias significativas en base a la distancia crítica obtenida."
]
},
{
"cell_type": "code",
"execution_count": 38,
...
...
@@ -547,7 +591,7 @@
"source": [
"### Test de Bonferroni-Dunn\n",
"\n",
"Dado que el método *FT + SIF* ha obtenido la primera posición para todos los conjuntos de datos, parece razonable utiizar el Test de Bonferroni-Dunn para comparar este método con los demás."
"Dado que el método *FT + SIF* ha obtenido la primera posición para todos los conjuntos de datos, parece razonable utiizar el Test de Bonferroni-Dunn para comparar este método con los demás. El Test de Bonferroni-Dunn se basa tambien en el calculo de una distancia crıtica cuya expresión es muy similar a la distancia crítica de Nemenyi. Considerando un nivel de confianza del 95%, α= 0,05, y sabiendo que el numero de metodos es *K=9* y el numero de conjuntos de datos es *N=6*, la distancia crıtica de Bonferroni-Dunn calculada es:"
]
},
{
...
...
@@ -572,7 +616,7 @@
"cell_type": "code",
"execution_count": 40,
"metadata": {
"scrolled": true
"scrolled": false
},
"outputs": [
{
...
...
@@ -595,20 +639,32 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"### Concluiones"
"\n",
"La distancia crítica del Test de Bonferroni-Dunn es **4.3070**. Seleccionando el método *FT + SIF* como método de control, se comprueba cómo este método es significativamente mejor que *W2V + WMD*, *FT + WMD*, *GLOVE + WMD* y *GLOVE + AVG*."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"1. Para medir la similaridad semántica, los vectores pre-entrenados de FastText son una mejor opción que los vectores de Word2Vec o GloVe.\n",
"<br>\n",
"### Conclusiones"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"1. Combinar los vectores de palabras pre-entrenados de FastText realizando una media SIF es el método más preciso para medir la similaridad semántica entre pares de documentos entre los combinaciones evaluadas.\n",
" \n",
"\n",
"2. Entre los conjuntos de palabras pre-entrenados evaluados, se puede observar como el conjunto de GloVe obtiene peores resultados que el conjunto de Word2Vec o FastText, independientemente del método utilizado para calcular la similaridad semántica.\n",
"\n",
" \n",
"3. Aunque realizar una media no ponderada de los vectores de palabras es un buen punto de partida para obtener una vectorización de una oración, aplicar una ponderación SIF (\\textit{Smooth Inverse Frequency}) es una mejor alternativa. \n",
" \n",
"\n",
"2. Aunque realizar una media no ponderada de los vectores de palabras es un buen punto de partida para obtener una vectorización de una oración, SIF (*Smooth Inverse Frequency*) es una mejor alternativa. Realizar un procesamiento más elaborado, eliminando las palabras vacías y los símbolos de puntuación, puede hacer que una media no ponderada se acerque a la precisión obtenida con SIF. \n",
"<br>\n",
"\n",
"3. El inverso de la distancia \\textit{Word Mover's Distance} como medida de similaridad proporciona los peores resultados."
"4. Entre las posibilidades para medir la similaridad, el inverso de la distancia *Word Mover's Distance* como medida proporciona los peores resultados."
]
}
],
...
...
...
...
%% Cell type:markdown id: tags:
# Comparativa de Word2Vec, GloVe y FastText para medir la similaridad semántica entre pares de oraciones
## Pablo Valdunciel Sánchez
%% Cell type:markdown id: tags:
## 1. Modelos
%% Cell type:markdown id: tags:
Utilizamos el modelo *KeyedVectors* de la librería [*gesim*](https://radimrehurek.com/gensim/index.html) para cargar los vectores pre-entrenados de los diferentes modelos
%% Cell type:code id: tags:
``` python
fromgensim.modelsimportKeyedVectors
```
%% Cell type:markdown id: tags:
Cargamos los vectores pre-entrenados con modelos Word2Vec, GloVe y FastText. Los vectores pre-entrenados de cada modelo utilizados son:
-**FastText**: [rawl-300d-2M.vec.zip: 2 million word vectors trained on Common Crawl (600Btokens)](https://dl.fbaipublicfiles.com/fasttext/vectors-english/crawl-300d-2M-subword.zip)
| Modelo | Vectores pre-entrenados | Vocabulario | Dimensión de los vectores | Idioma |
| **FastText** | [rawl-300d-2M.vec.zip: 2 million word vectors trained on Common Crawl (600Btokens)](https://dl.fbaipublicfiles.com/fasttext/vectors-english/crawl-300d-2M-subword.zip) | 2 millones | 300 | Inglés |
En el caso de los vectores de GloVe, se ha utilizado la función [*glove2word2vec*](https://radimrehurek.com/gensim/scripts/glove2word2vec.html) de la librería *gensim* para convertir el archivo al formato Word2Vec.
Todas las funciones del módulo *load.py* llevan a cabo un preprocesamiento de las oraciones según los parámetros que se indiquen. Por defecto, el preprocesamiento de las oraciones se basa en realizar una *tokenización/segmentación* de las mismas. A mayores, existen las siguientes posibilidades:
-**lowercase**: hacer que todas las palabras estén en minúscula.
-**stop_words**: eliminar las palabras que no aportan casi significado semántico como determinantes, preprosiciones, etc.
-**punctuation**: elminar los símbolos de puntuación.
-**only_ascci**: eliminar las palabras que no estén formadas por caracteres ASCII.
-**lemmatization**: sustituir las palabras por su lexema.
El preprocesamiento del texto está implementado en la función *preprocess* en el módulo *utils.py*. La función *preprocess* hace uso de la librería [spaCy](https://spacy.io/) para llevar a cabo el preprocesamiento.
En este caso, tan solo se realiza la *tokenización/segmentación* de las oraciones y no se aplica ningún otro preprocesamiento.
En este caso, tan solo se realiza la *tokenización/segmentación* de las oraciones y una conversión a minúscula (parámetro *lowercase* igual a True) para lograr uniformidad.
%% Cell type:code id: tags:
``` python
PATH_STS='./data/datasets/STS'
PATH_SICK='./data/datasets/SICK'
PATH_FREQUENCIES='./data/frequencies.tsv'
PREPROCESSING={'lowercase':False,
PREPROCESSING={'lowercase':True,
'stop_words':False,
'punctuation':False,
'only_ascii':False,
'lemmatization':False
}
```
%% Cell type:markdown id: tags:
Cargamos también las frecuencias de las palabras en el corpus para poder aplicar el SIF.
Los métodos para calcular la similaridad semántica entre dos oraciones se encuentran en el módulo *methods.py* y son:
-**avg_cosine**: el vector de una oración se obtiene haciendo la media (*average*) de los vectores de las palabras de esa oración. La similaridad entre dos vectores se calcula utilizando la similitud coseno.
-**sif_cosine**: el vector de una oración se obtiene haciendo una media ponderada (*Smooth Inverse Frequency*, SIF) de los vectores de las palabras de esa oración. La similaridad entre dos vectores se calcula utilizando la similitud coseno.
-**wmd**: la similariad entre dos oraciones se calcula como el contrario de la distancia *Word Mover's Distance* entre las mismas. El modelo *KeyedVectors* de *gensim* incorpora el cálculo de esta distancia ([ver método](https://radimrehurek.com/gensim/models/keyedvectors.html#gensim.models.keyedvectors.FastTextKeyedVectors.wmdistance)). Esta distancia no está acotada y tomará el valor *infinito* cuando ninguna de las palabras de alguna de las dos oraciones este presente en el modelo, por ello se ha acotado en el intervalo [0, 100].
En el módulo *utils.py* se encuentra la función *evaluate* que calcula los coeficientes de correlación de Pearson y Spearman entre las puntuaciones *Gold Standard* de una tarea y las mediadas de similariad proporcionadas por uno o varios métodos.
Se plantea el siguiente contraste de hipótesis para determinar si los diferentes métodos son equivalentes:
- H<sub>0</sub>: los métodos son equivalentes
- H<sub>1</sub>: los métodos no son equivalentes
Para resolver este contraste de hipótesis se realiza el Test de Friedman sobre los rankings promedios. Aún sin realizar el test, estos rankings promedios proporcionan ya una buena comparación de los diferentes métodos.
El p-valor obtenido para el Test de Friedman es **0,000028**, por lo que la hipótesis nula, H<sub>0</sub>, sobre la equivalencia de los métodos se rechaza a los niveles de confianza habituales.
%% Cell type:markdown id: tags:
### Test de Nemenyi
Calculamos la distancia crítica de Nemenyi y representamos las diferencias significativas.
Una vez rechazada la hipótesis nula H<sub>0</sub> de la equivalencia de los métodos, se realiza el test *post-hoc* de Nemenyi para determinar entre que pares de métodos existen diferencias significativas. Considerando un nivel de confianza del 95%, alpha = 0.05, y sabiendo que el número de métodos es *k=9* y el número de conjuntos de datos es *N=6*, la distancia crítica de Nemenyi calculada es:
Dado que el método *FT + SIF* ha obtenido la primera posición para todos los conjuntos de datos, parece razonable utiizar el Test de Bonferroni-Dunn para comparar este método con los demás.
Dado que el método *FT + SIF* ha obtenido la primera posición para todos los conjuntos de datos, parece razonable utiizar el Test de Bonferroni-Dunn para comparar este método con los demás. El Test de Bonferroni-Dunn se basa tambien en el calculo de una distancia crıtica cuya expresión es muy similar a la distancia crítica de Nemenyi. Considerando un nivel de confianza del 95%, α= 0,05, y sabiendo que el numero de metodos es *K=9* y el numero de conjuntos de datos es *N=6*, la distancia crıtica de Bonferroni-Dunn calculada es:
La distancia crítica del Test de Bonferroni-Dunn es **4.3070**. Seleccionando el método *FT + SIF* como método de control, se comprueba cómo este método es significativamente mejor que *W2V + WMD*, *FT + WMD*, *GLOVE + WMD* y *GLOVE + AVG*.
%% Cell type:markdown id: tags:
### Conclusiones
%% Cell type:markdown id: tags:
1. Para medir la similaridad semántica, los vectores pre-entrenados de FastText son una mejor opción que los vectores de Word2Vec o GloVe.
<br>
1. Combinar los vectores de palabras pre-entrenados de FastText realizando una media SIF es el método más preciso para medir la similaridad semántica entre pares de documentos entre los combinaciones evaluadas.
2. Entre los conjuntos de palabras pre-entrenados evaluados, se puede observar como el conjunto de GloVe obtiene peores resultados que el conjunto de Word2Vec o FastText, independientemente del método utilizado para calcular la similaridad semántica.
3. Aunque realizar una media no ponderada de los vectores de palabras es un buen punto de partida para obtener una vectorización de una oración, aplicar una ponderación SIF (\textit{Smooth Inverse Frequency}) es una mejor alternativa.
2. Aunque realizar una media no ponderada de los vectores de palabras es un buen punto de partida para obtener una vectorización de una oración, SIF (*Smooth Inverse Frequency*) es una mejor alternativa. Realizar un procesamiento más elaborado, eliminando las palabras vacías y los símbolos de puntuación, puede hacer que una media no ponderada se acerque a la precisión obtenida con SIF.
<br>
3. El inverso de la distancia \textit{Word Mover's Distance} como medida de similaridad proporciona los peores resultados.
4. Entre las posibilidades para medir la similaridad, el inverso de la distancia *Word Mover's Distance* como medida proporciona los peores resultados.