From 3d8116e2677dfe6645b40aa7b933a3d6d7eb4adf Mon Sep 17 00:00:00 2001 From: David Lee Date: Tue, 5 Nov 2019 17:02:39 +0800 Subject: [PATCH] Assignmet 4 written part (1. g. and 2. b. remain) --- Assignments/a4/written/BLEU_Verify.ipynb | 300 +++++++++++++++++++++++ Assignments/a4/written/assignment4.pdf | Bin 0 -> 36602 bytes Assignments/a4/written/assignment4.tex | 127 +++++++++- README.md | 5 +- 4 files changed, 426 insertions(+), 6 deletions(-) create mode 100644 Assignments/a4/written/BLEU_Verify.ipynb create mode 100644 Assignments/a4/written/assignment4.pdf diff --git a/Assignments/a4/written/BLEU_Verify.ipynb b/Assignments/a4/written/BLEU_Verify.ipynb new file mode 100644 index 0000000..20502c0 --- /dev/null +++ b/Assignments/a4/written/BLEU_Verify.ipynb @@ -0,0 +1,300 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# BLEU Varify" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from nltk.translate.bleu_score import sentence_bleu\n", + "import numpy as np\n", + "import warnings\n", + "warnings.filterwarnings(\"ignore\") # ignore nltk warnings" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "references = ['love can always find a way'.split(),\n", + " 'love makes anything possible'.split()]\n", + "candidate1 = 'the love can always do'.split()\n", + "candidate2 = 'love can make anything possible'.split()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": "0.6\n0.8\n" + } + ], + "source": [ + "# Candidate1 unigram\n", + "score = sentence_bleu(references, candidate1, weights=(1, 0, 0, 0))\n", + "print(score)\n", + "# Candidate2 unigram\n", + "score = sentence_bleu(references, candidate2, weights=(1, 0, 0, 0))\n", + "print(score)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": "0.5\n0.5\n" + } + ], + "source": [ + "# Candidate1 bigram\n", + "score = sentence_bleu(references, candidate1, weights=(0, 1, 0, 0))\n", + "print(score)\n", + "# Candidate2 bigram\n", + "score = sentence_bleu(references, candidate2, weights=(0, 1, 0, 0))\n", + "print(score)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": "0.5477225575051662\n0.6324555320336759\n" + } + ], + "source": [ + "# Candidate1 unigram + bigram\n", + "score = sentence_bleu(references, candidate1, weights=(0.5, 0.5, 0, 0))\n", + "print(score)\n", + "# Candidate2 unigram + bigram\n", + "score = sentence_bleu(references, candidate2, weights=(0.5, 0.5, 0, 0))\n", + "print(score)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "reference1 = ['love can always find a way'.split()]" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": "0.49123845184678916\n0.3274923012311928\n" + } + ], + "source": [ + "# Candidate1 unigram\n", + "score = sentence_bleu(reference1, candidate1, weights=(1, 0, 0, 0))\n", + "print(score)\n", + "# Candidate2 unigram\n", + "score = sentence_bleu(reference1, candidate2, weights=(1, 0, 0, 0))\n", + "print(score)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": "0.40936537653899097\n0.20468268826949548\n" + } + ], + "source": [ + "# Candidate1 bigram\n", + "score = sentence_bleu(reference1, candidate1, weights=(0, 1, 0, 0))\n", + "print(score)\n", + "# Candidate2 bigram\n", + "score = sentence_bleu(reference1, candidate2, weights=(0, 1, 0, 0))\n", + "print(score)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": "0.448437301984003\n0.25890539701513365\n" + } + ], + "source": [ + "# Candidate1 unigram + bigram\n", + "score = sentence_bleu(reference1, candidate1, weights=(0.5, 0.5, 0, 0))\n", + "print(score)\n", + "# Candidate2 unigram + bigram\n", + "score = sentence_bleu(reference1, candidate2, weights=(0.5, 0.5, 0, 0))\n", + "print(score)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": "0.5477225575051662" + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.exp((0.5 * np.log(0.6) + 0.5 * np.log(0.5)))" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": "0.6324555320336759" + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.exp((0.5 * np.log(0.8) + 0.5 * np.log(0.5)))" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": "0.8187307530779819" + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.exp(1 - 6/5)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": "0.448437301984003" + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.exp(1 - 6/5) * np.exp((0.5 * np.log(0.6) + 0.5 * np.log(0.5)))" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": "0.25890539701513365" + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.exp(1 - 6/5) * np.exp((0.5 * np.log(0.4) + 0.5 * np.log(0.25)))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.5" + }, + "latex_envs": { + "LaTeX_envs_menu_present": true, + "autoclose": false, + "autocomplete": true, + "bibliofile": "biblio.bib", + "cite_by": "apalike", + "current_citInitial": 1, + "eqLabelWithNumbers": true, + "eqNumInitial": 1, + "hotkeys": { + "equation": "Ctrl-E", + "itemize": "Ctrl-I" + }, + "labels_anchors": false, + "latex_user_defs": false, + "report_style_numbering": false, + "user_envs_cfg": false + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file diff --git a/Assignments/a4/written/assignment4.pdf b/Assignments/a4/written/assignment4.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a9ac2e6d67e81694967ecd1260b78c20ba002944 GIT binary patch literal 36602 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 -\subsubsection{\textbf{Reference Translation}: \textit{You’ve just got to go around the block to see it as an epiphany.} \\ \textbf{NMT Translation}: \textit{ou just have to go back to the apple to see it as a epiphany.}} +\begin{itemize} + \item Error: The classic out-of-vocabulary (OOV) problem on the word \textit{Bolingbroke}. + \item Reason: Because this word didn't show up in the training data (or pre-trained embedding). + \item Fix: Maybe we can use "character-level" (smaller granularity) decoder to generate the output. (if we're not allow to modify the training data) +\end{itemize} + +\subsubsection{\textbf{Reference Translation}: \textit{You’ve just got to go around the block to see it as an epiphany.} \\ \textbf{NMT Translation}: \textit{You just have to go back to the apple to see it as a epiphany.}} + +\begin{itemize} + \item Error: Grammar errors (e.g. \textit{have just got to go} vs. \textit{just have to go}, \textit{an epiphany} vs. \textit{a eiphany}) and some word choice error (e.g. \textit{around} vs. \textit{back to}, \textit{block} vs. \textit{apple}) + \item Reason: I think it is because the lack of the training data (or epoches) that it still hasn't learned the correct grammar and word. + \item Fix: More training corpus and epoches. +\end{itemize} \subsubsection{\textbf{Reference Translation}: \textit{She saved my life by letting me go to the bathroom in the teachers’ lounge.} \\ \textbf{NMT Translation}: \textit{She saved my life by letting me go to the bathroom in the women’s room.}} +\begin{itemize} + \item Error: \textit{in the teachers’ lounge} vs. \textit{in the women’s room} + \item Reason: I think because the sentence begin with \textit{She} so in the training data the woman is more likely to be in the women's room than in teachers' lounge. + \item Fix: Fix the data bias in training data. Maybe use some data augmentation trick to make it possible for woman in any other places. +\end{itemize} + \subsubsection{\textbf{Reference Translation}: \textit{That’s more than 250 thousand acres.} \\ \textbf{NMT Translation}: \textit{That’s over 100,000 acres.}} +\begin{itemize} + \item Error: 100,000 hecta'reas is equal to 250 thousand acres. + \item Reason: NMT don't know anything about unit conversion. e.g. NTD $\rightleftharpoons$ USD + \item Fix: Maybe nowaday we can only apply some rules on that like capture the units seperately and translate it individually. +\end{itemize} + +%TODO part b \subsection{Please identify 2 different examples of errors that your model produced.} % 1. Write the source sentence in Spanish. The source sentences are in the en_es_data/test.es. % 2. Write the reference English translation. The reference translations are in the en_es_data/test.en. @@ -57,16 +94,96 @@ \subsection{Please identify 2 different examples of errors that your model produ \subsection{Please consider this example:} -\paragraph{Reference Translation $r_1$: love can always find a way Reference \\ Translation $r_2$: love makes anything possible \\ +\paragraph{Reference Translation $r_1$: love can always find a way \\ +Reference Translation $r_2$: love makes anything possible \\ NMT Translation $c_1$: the love can always do \\ NMT Translation $c_2$: love can make anything possible} \subsubsection{Compute the BLEU scores for $c_1$ and $c_2$. And answer which of the two NMT translations is considered the better translation according to the BLEU Score? Do you agree that it is the better translation?} +\begin{itemize}[topsep=0pt, partopsep=0pt] + \item For $c_1$ { + \begin{itemize} + \item unigram: $p_1 = {\min(\max(3, 1), 5) \over 5} = 0.6$ + \item bigram: $p_2 = {2 \over 4} = 0.5$ + \end{itemize} + } + \item For $c_2$ { + \begin{itemize} + \item unigram: $p_1 = {4 \over 5} = 0.8$ + \item bigram: $p_2 = {2 \over 4} = 0.5$ + \end{itemize} + } +\end{itemize} + +Because $c = 5$ is greater than $r^* = 4$ thus $BP = 1$ + +$$ +BLEU_1 = BP \times \exp(0.5 \log 0.6 + 0.5 \log 0.5) = 0.5477225575051662 +$$ + +$$ +BLEU_2 = BP \times \exp(0.5 \log 0.8 + 0.5 \log 0.5) = 0.6324555320336759 +$$ + +The score of candidate sentence 2 $c_2$ is greater than candidate sentence 1 $c_1$. + +In my opinion, I think the sentence 2 is indeed better than sentence 1. Because it describe both of the meaning of references. + \subsubsection{Recompute BLEU scores for $c_1$ and $c_2$, this time with respect to $r_1$ only. Which of the two NMT translations now receives the higher BLEU score? Do you agree that it is the better translation?} +\begin{itemize}[topsep=0pt, partopsep=0pt] + \item For $c_1$ { + \begin{itemize} + \item unigram: $p_1 = {3 \over 5} = 0.6$ + \item bigram: $p_2 = {2 \over 4} = 0.5$ + \end{itemize} + } + \item For $c_2$ { + \begin{itemize} + \item unigram: $p_1 = {2 \over 5} = 0.4$ + \item bigram: $p_2 = {1 \over 4} = 0.25$ + \end{itemize} + } +\end{itemize} + +Because $c = 5,\quad r^* = 6$ thus + +$$ +BP = \exp(1 - \frac{6}{5}) = 0.8187307530779819 +$$ + +$$ +BLEU_1 = BP \times \exp(0.5 \log 0.6 + 0.5 \log 0.5) = 0.448437301984003 +$$ + +$$ +BLEU_2 = BP \times \exp(0.5 \log 0.4 + 0.5 \log 0.25) = 0.25890539701513365 +$$ + +The score of candidate sentence 1 $c_1$ is greater than candidate sentence 2 $c_2$ now. + +I'm not agree the sentence 1 is now better than sentence 2. In my opinion, I think it is because the lack of human labeling. A sentence should be able to express in many kind of ways especially in translation. + \subsubsection{Please explain (in a few sentences) why "NMT systems are often evaluated with respect to only a single reference translation (due to data availability)" may be problematic.} +As the last exercise shows, when we have only one single reference translation, then it will probably restrict the expression. Even if we have a better translation but it will end up receives lower score. + \subsubsection{List two advantages and two disadvantages of BLEU, compared to human evaluation, as an evaluation metric for Machine Translation.} +\begin{itemize}[topsep=0pt, partopsep=0pt] + \item Advantages { + \begin{itemize} + \item Make the evaluation quick, inexpensive, and absolutely objective. + \item Scoring become language-independent (just input references and candidates, and we don't have to care about what language we use) + \end{itemize} + } + \item Disadvantages { + \begin{itemize} + \item Scoring is not flexible. There should be plenty of solution but it only evaluate based on the given references. + \item Can't evaluate too advanced translation. Because BLUE is comparison-based evaulation, it can't capture synonymous or similar phrase. Additionally, some more abstract metrics like adequacy, fidelity and fluency is even harder to scoring. (Even if evaluate by human may have different opinions.) + \end{itemize} + } +\end{itemize} + \end{document} \ No newline at end of file diff --git a/README.md b/README.md index b770827..e122697 100644 --- a/README.md +++ b/README.md @@ -279,5 +279,8 @@ Others' Answer * [handout](Assignments/a4/a4.pdf) * [Asure Guide](Assignments/AzureGuide.pdf) ([Google Drive](https://docs.google.com/document/d/1MHaQvbtPkfEGc93hxZpVhkKum1j_F1qsyJ4X0vktUDI/edit)), [Practical Guide to VMs](Assignments/PracticalVMTips.pdf) ([Google Drive](https://docs.google.com/document/d/1z9ST0IvxHQ3HXSAOmpcVbFU5zesMeTtAc9km6LAPJxk/edit)) * [directory](Assignments/a4) - * [written](Assignments/a4/a4.pdf) + * [written](Assignments/a4/a4.pdf) - [BLEU Verify](Assignments/a4/written/BLEU_Verify.ipynb) + * [A Gentle Introduction to Calculating the BLEU Score for Text in Python](https://machinelearningmastery.com/calculate-bleu-score-for-text-python/) + * `nltk.translate.bleu_score` + * [Tilde Interactive BLEU score evaluator](https://www.letsmt.eu/Bleu.aspx) - input txt * [code](Assignments/a4/code)