├── .gitignore ├── LICENSE ├── README.md ├── presentation ├── cbow.pdf ├── emb_size.png ├── ner.pdf ├── presentation.pdf ├── presentation.tex ├── simple_model.pdf ├── skip-gram.pdf └── tree.pdf └── src ├── Script_presentation.ipynb ├── data └── basic_pt.txt ├── datareader.py ├── download_wiki_pt.sh ├── eval.py ├── evaluation ├── questions-phrases.txt ├── questions-words-ptbr.txt └── questions-words.txt ├── tests ├── datareader_test.py └── word2vec_test.py ├── tunning ├── batch_size.py ├── emb_size.py ├── init_param.py ├── learning_rate.py ├── num_sampled.py ├── skip_window.py └── std_param.py ├── util.py └── word2vec.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | src/data/baby.txt 7 | src/data/pt96.txt 8 | vocab_1000.tsv 9 | 10 | 11 | # C extensions 12 | *.so 13 | 14 | # Distribution / packaging 15 | .Python 16 | env/ 17 | build/ 18 | develop-eggs/ 19 | dist/ 20 | downloads/ 21 | eggs/ 22 | .eggs/ 23 | lib/ 24 | lib64/ 25 | parts/ 26 | sdist/ 27 | var/ 28 | *.egg-info/ 29 | .installed.cfg 30 | *.egg 31 | 32 | # PyInstaller 33 | # Usually these files are written by a python script from a template 34 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 35 | *.manifest 36 | *.spec 37 | 38 | # Installer logs 39 | pip-log.txt 40 | pip-delete-this-directory.txt 41 | 42 | # Unit test / coverage reports 43 | htmlcov/ 44 | .tox/ 45 | .coverage 46 | .coverage.* 47 | .cache 48 | nosetests.xml 49 | coverage.xml 50 | *,cover 51 | .hypothesis/ 52 | 53 | # Translations 54 | *.mo 55 | *.pot 56 | 57 | # Django stuff: 58 | *.log 59 | local_settings.py 60 | 61 | # Flask stuff: 62 | instance/ 63 | .webassets-cache 64 | 65 | # Scrapy stuff: 66 | .scrapy 67 | 68 | # Sphinx documentation 69 | docs/_build/ 70 | 71 | # PyBuilder 72 | target/ 73 | 74 | # IPython Notebook 75 | .ipynb_checkpoints 76 | 77 | # pyenv 78 | .python-version 79 | 80 | # celery beat schedule file 81 | celerybeat-schedule 82 | 83 | # dotenv 84 | .env 85 | 86 | # virtualenv 87 | venv/ 88 | ENV/ 89 | 90 | # Spyder project settings 91 | .spyderproject 92 | 93 | # Rope project settings 94 | .ropeproject 95 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Felsal 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Word2vec-pt 2 | 3 | This repository holds an implementation of the Skipgram model for training word embeddings. The corpus and the evaluation test are set up for Portuguese. 4 | 5 | 6 | 7 | ### Requirements 8 | * Tensorflow 9 | * Numpy 10 | * Matplotlib 11 | 12 | ## Usage 13 | 14 | ``` 15 | $ python3 word2vec.py -h 16 | usage: word2vec.py [-h] [-f FILE] [-s NUM_STEPS] [-v VOCAB_SIZE] 17 | [-b BATCH_SIZE] [-e EMBED_SIZE] [-k SKIP_WINDOW] 18 | [-n NUM_SKIPS] [-S NUM_SAMPLED] [-l LEARNING_RATE] 19 | [-w SHOW_STEP] [-B VERBOSE_STEP] [-V VALID_SIZE] 20 | [-W VALID_WINDOW] 21 | 22 | optional arguments: 23 | -h, --help show this help message and exit 24 | -f FILE, --file FILE text file to apply the model (default=basic_pt.txt) 25 | -s NUM_STEPS, --num_steps NUM_STEPS 26 | number of training steps (default=100000) 27 | -v VOCAB_SIZE, --vocab_size VOCAB_SIZE 28 | vocab size (default=50000) 29 | -b BATCH_SIZE, --batch_size BATCH_SIZE 30 | batch size (default=128) 31 | -e EMBED_SIZE, --embed_size EMBED_SIZE 32 | embeddings size (default=128) 33 | -k SKIP_WINDOW, --skip_window SKIP_WINDOW 34 | skip window (default=1) 35 | -n NUM_SKIPS, --num_skips NUM_SKIPS 36 | number of skips, number of times a center word will be 37 | re-used (default=2) 38 | -S NUM_SAMPLED, --num_sampled NUM_SAMPLED 39 | number of negativ samples(default=64) 40 | -l LEARNING_RATE, --learning_rate LEARNING_RATE 41 | learning rate (default=1.0) 42 | -w SHOW_STEP, --show_step SHOW_STEP 43 | show result in multiples of this step (default=2000) 44 | -B VERBOSE_STEP, --verbose_step VERBOSE_STEP 45 | show similar words in multiples of this step 46 | (default=10000) 47 | -V VALID_SIZE, --valid_size VALID_SIZE 48 | number of words to display similarity(default=16) 49 | -W VALID_WINDOW, --valid_window VALID_WINDOW 50 | number of words to from vocab to choose the words to 51 | display similarity(default=100) 52 | 53 | 54 | ``` 55 | 56 | 57 | ## Example 58 | 59 | ``` 60 | $ source download_wiki_pt.sh 61 | $ python3 word2vec.py -f ./data/pt96.txt -s 2001 -w 200 -B 1000 62 | 63 | &&&&&&&&& For TensorBoard visualization type &&&&&&&&&&& 64 | 65 | tensorboard --logdir=./graphs/22-03-2017_14-36-06 66 | 67 | 68 | &&&&&&&&& And for the 3d embedding visualization type && 69 | 70 | tensorboard --logdir=./processed 71 | 72 | Nearest to apenas: Basco, Pocono, 820, Round, Medalha, cânones, Semanas, raparigas, 73 | Nearest to e: ousava, Bardeen, Roadrunner, 1642, Tinha, amargura, garagem, meiotermo, 74 | Nearest to foram: Epicuro, Ruído, manifestada, Duty, belos, Warwick, recémchegados, Destacamse, 75 | Nearest to as: gênios, Joana, Nickelodeon, Duques, Trentino, Ptolomeu, resistir, dispensando, 76 | Nearest to mesmo: nono, calorífico, Reinmuth, Dren, contasse, preocupado, 21ª, declararam, 77 | Nearest to nos: botões, Nação, Raimundo, 1545, credores, Voltaire, Hizashi, n°, 78 | Nearest to pode: Whatever, obtiveram, Pacto, software, bala, levante, escondia, partilhava, 79 | Nearest to sua: 234, Féria, verossímil, sucessoras, Lin, cabra, estofada, ramificação, 80 | Nearest to vez: Barragem, negligência, Azog, escolhe, Titan, analítica, enviada, relacionadas, 81 | Nearest to O: contraditórias, Amizade, Bloomberg, folhagem, palcos, oriundo, ordenado, Irlanda, 82 | Nearest to das: also, musica, 1510, cameo, templários, dedicam, Grão, festejado, 83 | Nearest to Igreja: colaborador, vulcânicos, repensar, ocorrida, terrorista, restauracionistas, racista, verdadeiras, 84 | Nearest to sem: Gill, Linnaeus, relutância, cortesã, Theatre, carnal, excedente, envolveuse, 85 | Nearest to cidade: MaryClaire, interinstitucional, 564, adereços, adverte, circula, Wakulla·, inseparável, 86 | Nearest to uma: marinhas, Olímpia, legítimos, 47, LP, Botan, bestseller, repúblicas, 87 | Nearest to seus: mansões, dála, mosquito, Chipre•, Sociedade, Dolph, Tirion, colecionáveis, 88 | Average loss at step 200 : 5.54808126211 89 | Average loss at step 400 : 4.55995755911 90 | Average loss at step 600 : 4.17230512619 91 | Average loss at step 800 : 3.98659612417 92 | Average loss at step 1000 : 4.02160902023 93 | Nearest to apenas: Basco, 820, cânones, Pocono, 692, juridicamente, raparigas, Falava, 94 | Nearest to e: UNK, amargura, Roadrunner, meiotermo, converteria, terceiro, Tinha, ousava, 95 | Nearest to foram: Ruído, Epicuro, manifestada, Duty, belos, Warwick, Destacamse, Security, 96 | Nearest to as: gênios, Excel, resistir, Trentino, Nickelodeon, vaginal, Joana, Duques, 97 | Nearest to mesmo: deportadas, semanalmente, enfermo, pontifício, preocupado, Freedman·, civil, declararam, 98 | Nearest to nos: botões, Nação, Raimundo, agreste, executivo, Blink, nostalgia, Renascimento, 99 | Nearest to pode: Whatever, software, Pacto, bala, partilhava, Aranha, chuva, obtiveram, 100 | Nearest to sua: 234, Féria, passavam, lho, ramificação, fiqh, temperamentos, esteve, 101 | Nearest to vez: Barragem, negligência, Titan, Azog, enviada, relacionadas, escolhe, Iniciase, 102 | Nearest to O: Amizade, Bloomberg, 1975·, contraditórias, folhagem, Neutron, EU, Karatedo, 103 | Nearest to das: also, musica, templários, 1510, Kroemer, festejado, noivos, Bernhard, 104 | Nearest to Igreja: colaborador, vulcânicos, repensar, ocorrida, terrorista, restauracionistas, racista, verdadeiras, 105 | Nearest to sem: relutância, Gill, cortesã, Theatre, tomarem, porteiro, ambições, pontapé, 106 | Nearest to cidade: interinstitucional, 564, 1810, adereços, adverte, Orleans, circula, góticas, 107 | Nearest to uma: marinhas, a, Botan, bestseller, LP, Olímpia, CF, medidas, 108 | Nearest to seus: mansões, dála, Chipre•, Rennais, Gelo, Sociedade, colecionáveis, firmas, 109 | Average loss at step 1200 : 3.84192966342 110 | Average loss at step 1400 : 3.78012679935 111 | Average loss at step 1600 : 3.79607671261 112 | Average loss at step 1800 : 3.78329489589 113 | Average loss at step 2000 : 3.69324924827 114 | Nearest to apenas: cânones, 820, 692, raparigas, juridicamente, Basco, Falava, DERSP, 115 | Nearest to e: que, meiotermo, mas, Home, amargura, ou, 451, de, 116 | Nearest to foram: Ruído, Epicuro, manifestada, Warwick, Duty, Destacamse, belos, imutável, 117 | Nearest to as: Trentino, resistir, Nickelodeon, Excel, gênios, herética, Joana, vaginal, 118 | Nearest to mesmo: enfermo, deportadas, pontifício, preocupado, Freedman·, semanalmente, que, civil, 119 | Nearest to nos: botões, Nação, Renascimento, agreste, executivo, Raimundo, Blink, duquesa, 120 | Nearest to pode: Whatever, partilhava, bala, software, devia, Aranha, Pacto, caseiros, 121 | Nearest to sua: 234, lho, Féria, fiqh, melhoramento, passavam, esteve, shōji, 122 | Nearest to vez: Barragem, negligência, Titan, Iniciase, enviada, Azog, relacionadas, gêmeos, 123 | Nearest to O: o, Amizade, 1975·, Neutron, secretamente, Bloomberg, Karatedo, manso, 124 | Nearest to das: also, festejado, musica, noivos, Bernhard, dedicam, Pontifícios, Kroemer, 125 | Nearest to Igreja: colaborador, vulcânicos, repensar, ocorrida, terrorista, restauracionistas, racista, verdadeiras, 126 | Nearest to sem: Kwan, ambições, relutância, Eu, Chicago, Gill, Kuroshio, receberem, 127 | Nearest to cidade: interinstitucional, 564, 1810, adereços, Orleans, adverte, sans, Wakulla·, 128 | Nearest to uma: a, marinhas, Botan, Progress, LP, deduz, CF, Stand, 129 | Nearest to seus: mansões, dála, Chipre•, Gelo, Rennais, colecionáveis, Malaca, dançando, 130 | 131 | ========================================== 132 | 133 | The emmbedding vectors can be found in 134 | ./pickles/pt96.pickle 135 | 136 | ``` 137 | -------------------------------------------------------------------------------- /presentation/cbow.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LIAMF-USP/Word2vec-pt/d3e705762de0f72d0e4ac0ccdde2a94ed897789c/presentation/cbow.pdf -------------------------------------------------------------------------------- /presentation/emb_size.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LIAMF-USP/Word2vec-pt/d3e705762de0f72d0e4ac0ccdde2a94ed897789c/presentation/emb_size.png -------------------------------------------------------------------------------- /presentation/ner.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LIAMF-USP/Word2vec-pt/d3e705762de0f72d0e4ac0ccdde2a94ed897789c/presentation/ner.pdf -------------------------------------------------------------------------------- /presentation/presentation.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LIAMF-USP/Word2vec-pt/d3e705762de0f72d0e4ac0ccdde2a94ed897789c/presentation/presentation.pdf -------------------------------------------------------------------------------- /presentation/presentation.tex: -------------------------------------------------------------------------------- 1 | \documentclass{beamer} 2 | \usepackage[english]{babel} 3 | \usepackage[utf8]{inputenc} 4 | \usepackage{times} 5 | \usepackage[T1]{fontenc} 6 | \usepackage{lmodern} 7 | \usepackage{tikz} 8 | \usepackage{minted} 9 | \usemintedstyle{borland} 10 | \usetikzlibrary{arrows} 11 | \usepackage{graphicx} 12 | \usepackage{amssymb} 13 | \usepackage{amsthm} 14 | \usepackage{amsmath} 15 | \usepackage{csquotes} 16 | \usepackage{bbm} 17 | \newcommand{\wo}{\mathbbm{w}} 18 | \usetheme{Warsaw} 19 | \usepackage{array,colortbl,xcolor} 20 | 21 | 22 | \setbeamertemplate{bibliography item}[text] 23 | \setbeamertemplate{navigation symbols}{} 24 | 25 | 26 | 27 | \title[Word2Vec] 28 | {Word2vec} 29 | 30 | 31 | \author[F.Salvatore] 32 | {Felipe~Salvatore} 33 | 34 | 35 | 36 | 37 | \date[USP 2015] 38 | {USP, 06/04/2017} 39 | 40 | \begin{document} 41 | 42 | 43 | \begin{frame} 44 | \titlepage 45 | \end{frame} 46 | 47 | 48 | 49 | 50 | 51 | \begin{frame}{Introdução} 52 | Word2vec é um nome que abarca dois modelos: 53 | \begin{itemize} 54 | \item \textbf{Skip-gram} 55 | \item \textbf{Continuous Bag-of-Words (CBOW)} 56 | \end{itemize} 57 | 58 | \vspace{0.1cm} 59 | \textbf{Tarefa:} Apreender de modo eficiente uma representação vetorial de palavras a partir de um corpus grande e não-estruturado.\\ 60 | 61 | Esse aprendizado é feito atraves das estatística de co-ocorrência das palavras em algum corpus. A ideia em si não é nova: 62 | \vspace{0.1cm} 63 | 64 | \begin{center} 65 | {\color{blue!89}"You shall know a word by the company it keeps" (J.R Firth, 1957)} 66 | \end{center} 67 | \end{frame} 68 | 69 | 70 | \begin{frame}[fragile]{Versão simplificada de CBOW: modelo (i)} 71 | Dado um corpus, escolhemos: 72 | \begin{itemize} 73 | \item um vocabulário $V$. 74 | \item um tamanho $N$ para a representação vetorial das palavras. 75 | \end{itemize} 76 | \vspace{0.1cm} 77 | Vamos usar as matrizes $W \in \mathbb{R}^{|V|,N}$ e $W^{\prime} \in \mathbb{R}^{N,|V|}$ para criar \textbf{duas} representações vetoriais de cada palavra $\wo$: 78 | \vspace{0.1cm} 79 | \begin{itemize} 80 | \item \textbf{input vector}: $v_\wo$ (linha de $W$). 81 | \vspace{0.1cm} 82 | \item \textbf{output vector}: $v^{\prime}_\wo$ (coluna de $W^{\prime}$). 83 | \end{itemize} 84 | \end{frame} 85 | 86 | \begin{frame}[fragile]{Versão simplificada de CBOW: modelo (ii)} 87 | A tarefa do modelo vai ser prever uma palavra de centro dada uma palavra de contexto: 88 | 89 | \begin{center} 90 | {\color{red!89}O} {\color{blue!89}primeiro} {\color{red!89}rei} de Portugal nasceu em ... 91 | \end{center} 92 | \vspace{0.1cm} 93 | Observação $\Rightarrow$ (rei, primeiro)\\ 94 | 95 | \vspace{0.1cm} 96 | 97 | {\color{white!89}Observacao } $\Rightarrow$ (input word, output word)\\ 98 | 99 | \vspace{0.1cm} 100 | 101 | {\color{white!89}Observacao } $\Rightarrow$ ($\wo_{I}$, $\wo_{o}$) 102 | \end{frame} 103 | 104 | \begin{frame}[fragile]{Versão simplificada de CBOW: modelo (iii)} 105 | \includegraphics[scale=0.8]{simple_model.pdf} 106 | \end{frame} 107 | 108 | \begin{frame}[fragile]{Versão simplificada de CBOW: modelo (iv)} 109 | Dado ($x_{\wo_I}$, $x_{\wo_O}$) one-hot de ($\wo_{I}$, $\wo_{o}$) e $x=x_{\wo_I}$ o modelo é: 110 | 111 | \begin{equation}\label{eq:1} 112 | h_i = \sum_{s=1}^{|V|}w_{si} x_{s} \; {\small \text{ com }i = 1, \dots, N} 113 | \end{equation} 114 | \begin{equation}\label{eq:2} 115 | u_j = \sum_{s=1}^{N}w^{\prime}_{sj} h_{s} \; {\small \text{ com }j = 1, \dots, |V|} 116 | \end{equation} 117 | \begin{equation}\label{eq:3} 118 | y_j = p(\wo_{j}|\wo_{I}) = \frac{\exp(u_j)}{\sum_{j^{\prime}=1}^{|V|} \exp(u_{j^{\prime}})} \;\; {\small \text{ com }j = 1, \dots, |V|} 119 | \end{equation} 120 | \begin{equation}\label{eq:4} 121 | E = CE(x_{\wo_O},y) = -\sum_{s=1}^{|V|} {x_{\wo_O}}_s \log(y_s) 122 | \end{equation} 123 | \end{frame} 124 | 125 | \begin{frame}[fragile]{Versão simplificada de CBOW: modelo (v)} 126 | Pela configuração de $x_{\wo_I}$ e $x_{\wo_O}$ podemos simplificar (\ref{eq:1}), (\ref{eq:2}), (\ref{eq:3}) e (\ref{eq:4}): 127 | 128 | \begin{equation}\label{eq5} 129 | h = v_{\wo_{I}} 130 | \end{equation} 131 | \begin{equation}\label{eq:6} 132 | u_j = v^{\prime}_{\wo_{j}} .^{T} v_{\wo_{I}} 133 | \end{equation} 134 | \begin{equation}\label{eq:7} 135 | y_j =\frac{\exp(v^{\prime}_{\wo_{j}} .^{T} v_{\wo_{I}})}{\sum_{j^{\prime}=1}^{|V|} \exp(v^{\prime}_{\wo_{{j^\prime}}} .^{T} v_{\wo_{I}})} 136 | \end{equation} 137 | \begin{equation}\label{eq:8} 138 | E = - u_{j^{*}} + \log (\sum_{j^{\prime}=1}^{|V|} \exp (u_{j^{\prime}})) 139 | \end{equation} 140 | 141 | onde $j^{*}$ é o índice de $\wo_{o}$. 142 | \end{frame} 143 | 144 | \begin{frame}[fragile]{Versão simplificada de CBOW: atualização (i)} 145 | Usando o algorítimo de back propagration e SGD temos que a atualização dos pesos da camada mais externa é: 146 | \begin{equation}\label{eq:9} 147 | {w_{ij}^{\prime}}^{(new)} = {w_{ij}^{\prime}}^{(old)} - \eta \, e_{j} \, h_{i} 148 | \end{equation} 149 | em notação vetorial: 150 | \begin{equation}\label{eq:10} 151 | {v^{\prime}_{\wo_{j}}}^{(new)} = {v^{\prime}_{\wo_{j}}}^{(old)} - \eta \, e_{j} \, v_{\wo_{I}} 152 | \end{equation} 153 | onde $e=y -x_{\wo_{o}}$ 154 | \end{frame} 155 | 156 | 157 | \begin{frame}[fragile]{Versão simplificada de CBOW: atualização (ii)} 158 | \begin{itemize} 159 | \item $\wo_{j}\neq \wo_{o} \Rightarrow -\eta \, e_{j} <0\Rightarrow$ subtraímos de $v^{\prime}_{\wo_{j}}$ uma proporção de $v_{\wo_{I}}\Rightarrow$ aumentamos a distância cosseno entre $v_{\wo_{I}}$ e $v^{\prime}_{\wo_{j}}$. 160 | \vspace{0.3cm} 161 | \item $\wo_{j}= \wo_{o} \Rightarrow -\eta \, e_{j} >0\Rightarrow$ adicionamos uma proporção de $v_{\wo_{I}}$ em $v^{\prime}_{\wo_{j}} \Rightarrow$ diminuímos a distância cosseno entre $v_{\wo_{I}}$ e $v^{\prime}_{\wo_{j}}$. 162 | \end{itemize} 163 | \end{frame} 164 | 165 | \begin{frame}[fragile]{Versão simplificada de CBOW: atualização (iii)} 166 | Continuando com o back propagation: 167 | 168 | \vspace{0.1cm} 169 | 170 | \begin{equation}\label{eq:11} 171 | W^{(new)} = W^{(old)} - \eta \, x EH^{T} 172 | \end{equation} 173 | 174 | \vspace{0.1cm} 175 | 176 | \begin{equation}\label{eq:12} 177 | {v_{\wo_{I}}}^{(new)} = {v_{\wo_{I}}}^{(old)} - \eta \, x EH^{T}_{(k_{I},.)} 178 | \end{equation} 179 | 180 | \vspace{0.2cm} 181 | 182 | Onde $EH = e {(W^{\prime})}^{T}$ e $k_{I}$ é o índice de $\wo_{I}$. 183 | \end{frame} 184 | 185 | \begin{frame}[fragile]{Versão simplificada de CBOW} 186 | Repetindo esse processo com diferentes exemplos extraídos do corpus o efeito vai acumular e como resultado {\color{blue!89} palavras com contexto similar vão ficar próximas entre si}.\\ 187 | 188 | \vspace{0.3cm} 189 | \begin{center} 190 | \textbf{O que o modelo faz é capturar as estatísticas de co-ocorrência usando a distância cosseno.} 191 | \end{center} 192 | 193 | \end{frame} 194 | 195 | 196 | \begin{frame}[fragile]{CBOW} 197 | Agora, partindo de uma janela arbitrária de tamanho $C$, vamos construir observações do tipo $([\wo_{I_{1}},\dots, \wo_{I_{C}}], \wo_{O})$.\\\ 198 | Por exemplo com $C=2$: 199 | \vspace{0.2cm} 200 | 201 | \begin{center} 202 | Nunca me acostumei {\color{red!89} com o} {\color{blue!89}cantor} {\color{red!89}dessa banda}, e nem ... 203 | \end{center} 204 | 205 | \vspace{0.2cm} 206 | \[ 207 | ([com, o, dessa, banda], cantor) 208 | \] 209 | \end{frame} 210 | 211 | \begin{frame}[fragile]{CBOW: modelo (i)} 212 | \includegraphics[scale=0.65]{cbow.pdf} 213 | \end{frame} 214 | 215 | \begin{frame}[fragile]{CBOW: modelo (ii)} 216 | \begin{equation}\label{eq:13} 217 | {\color{blue!89}x = x_{\wo_{I_{1}}} + \dots + x_{\wo_{I_{C}}}} 218 | \end{equation} 219 | \begin{equation}\label{eq:14} 220 | {\color{blue!89}h = \frac{1}{C}(v_{\wo_{I_{1}}} + \dots + v_{\wo_{I_{C}}}) } 221 | \end{equation} 222 | \begin{equation}\label{eq:15} 223 | u_j = \sum_{s=1}^{N}w^{\prime}_{sj} h_{s} 224 | \end{equation} 225 | \begin{equation}\label{eq:16} 226 | y_j = p(\wo_{j}|\wo_{I_{1}},\dots, \wo_{I_{C}}) = \frac{\exp(v^{\prime}_{\wo_{j}} .^{T} h)}{\sum_{j^{\prime}=1}^{|V|} \exp(v^{\prime}_{\wo_{{j^\prime}}} .^{T} h)} 227 | \end{equation} 228 | \begin{equation}\label{eq:17} 229 | E = - u_{j^{*}} + \log (\sum_{j^{\prime}=1}^{|V|} \exp (u_{j^{\prime}})) 230 | \end{equation} 231 | \end{frame} 232 | 233 | 234 | \begin{frame}[fragile]{CBOW: atualização} 235 | 236 | \begin{equation}\label{eq:18} 237 | {v^{\prime}_{\wo_{j}}}^{(new)} = {v^{\prime}_{\wo_{j}}}^{(old)} - \eta \, e_{j} \, h 238 | \end{equation} 239 | 240 | \vspace{0.3cm} 241 | 242 | \begin{equation}\label{eq:19} 243 | {v_{\wo_{I_{c}}}}^{(new)} = {v_{\wo_{I_{c}}}}^{(old)} - \frac{1}{C} \, \eta \, x EH^{T}_{(k_{I_{c}},.)} 244 | \end{equation} 245 | 246 | \vspace{0.3cm} 247 | 248 | para $c = 1, \dots, C$. Onde $k_{I_{1}}, \dots, k_{I_{C}}$ são os índices de $\wo_{I_{1}},\dots, \wo_{I_{C}}$ respectivamente. 249 | \end{frame} 250 | 251 | \begin{frame}[fragile]{Skip-Gram} 252 | \begin{center} 253 | Skip-gram é o "contrário" do CBOW. 254 | \end{center} 255 | 256 | \vspace{0.3cm} 257 | 258 | \textbf{Com esse modelo vamos tentar prever o contexto dado a palavra de centro.}\\ 259 | 260 | \vspace{0.3cm} 261 | 262 | Observação $\Rightarrow$ $(\wo_{I},[\wo_{O_{1}},\dots, \wo_{O_{C}}])$\\ 263 | 264 | \vspace{0.1cm} 265 | 266 | {\color{white!89}Observação } $\Rightarrow$ (cantor, [com, o, dessa, banda]) 267 | \end{frame} 268 | 269 | \begin{frame}[fragile]{Skip-Gram: modelo (i)} 270 | \includegraphics[scale=0.65]{skip-gram.pdf} 271 | \end{frame} 272 | 273 | \begin{frame}[fragile]{Skip-Gram: modelo (ii)} 274 | As definições de $x$, $h$, $u$, e $y$ são as mesmas que em (\ref{eq:1}), (\ref{eq:2}) e (\ref{eq:3}). Nesse modelo queremos minimizar a soma da entropia cruzada que é o mesmo que maximizar $p(\wo_{o_{1}}, \dots, \wo_{o_{C}}\;|\;\wo_I)$: 275 | 276 | \begin{align*} 277 | E & = \sum_{c=1}^{C}(-\sum_{s=1}^{V} {\wo_{o_{c}}}_s \log(y_s)) \\ 278 | & = - \sum_{c=1}^{C} \log(y_{j^{*}_{c}})\\ 279 | & = - \log(\prod_{c=1}^{C}y_{j^{*}_{c}})\\ 280 | & = - \log(\prod_{c=1}^{C}p(\wo_{o_{c}}\;|\;\wo_I))\\ 281 | & = - \log p(\wo_{o_{1}}, \dots, \wo_{o_{C}}\;|\;\wo_I)\\ 282 | \end{align*} 283 | \end{frame} 284 | \begin{frame}[fragile]{Skip-Gram: modelo (iii)} 285 | Simplificando a equação de erro: 286 | \begin{equation}\label{eq:20} 287 | E = - \sum_{c=1}^{C} u_{j^{*}_{c}} + C \log (\sum_{j^{\prime}=1}^{V} \exp (u_{j^{\prime}})) 288 | \end{equation} 289 | \end{frame} 290 | 291 | \begin{frame}[fragile]{Skip-Gram: atualização} 292 | \begin{equation}\label{eq:21} 293 | {v^{\prime}_{\wo_{j}}}^{(new)} = {v^{\prime}_{\wo_{j}}}^{(old)} - \eta \, e_{j} \, v_{\wo_{I}} 294 | \end{equation} 295 | 296 | \vspace{0.3cm} 297 | 298 | \begin{equation}\label{eq:22} 299 | {v_{\wo_{I}}}^{(new)} = {v_{\wo_{I}}}^{(old)} - \eta \, x EH^{T}_{(k_{I},.)} 300 | \end{equation} 301 | 302 | \vspace{0.3cm} 303 | 304 | Onde $e = (Cy - \sum_{c=1}^{C}x_{\wo_{c}})$ e $EH = e {(W^{\prime})}^{T}$. 305 | \end{frame} 306 | 307 | 308 | \begin{frame}[fragile]{Otimização} 309 | \[ 310 | y_j = \frac{\exp(u_j)}{\sum_{j^{\prime}=1}^{|V|} \exp(u_{j^{\prime}})} 311 | \] 312 | \begin{center} 313 | \textbf{Muito custoso se for fazer isso para cada instância de treinamento} 314 | \end{center} 315 | \vspace{0.3cm} 316 | 317 | \begin{itemize} 318 | \item Amostragem negativa 319 | \vspace{0.2cm} 320 | \item Softmax hierárquico 321 | \end{itemize} 322 | 323 | 324 | \end{frame} 325 | 326 | \begin{frame}[fragile]{Otimização} 327 | Vamos nos concentrar no modelo Skip-gram. 328 | 329 | \vspace{0.2cm} 330 | 331 | \textbf{Note}: podemos implementar esse modelo de modo a prever apenas uma palavra de contexto:\\ 332 | 333 | \[ 334 | (cantor, [com, o, dessa, banda]) 335 | \] 336 | \[ 337 | (cantor,com), (cantor,o), (cantor,dessa), (cantor,banda) 338 | \] 339 | 340 | \textbf{Note} 341 | \begin{itemize} 342 | \item Skip-gram $\Rightarrow h = v_{\wo_I}$ 343 | \vspace{0.1cm} 344 | \item CBOW $\Rightarrow h = \frac{1}{C}\sum_{c=1}^{C}v_{\wo_{I_{c}}}$ 345 | \end{itemize} 346 | 347 | \end{frame} 348 | 349 | 350 | 351 | \begin{frame}[fragile]{Amostragem negativa} 352 | Vamos manter $x$, $W$ e $W^{\prime}$ e $h$ como antes. Para calcular a função erro vamos usar uma distribuição $P_{n}(\wo)$ sobre as palavras do corpus. Exemplo:\\ 353 | \[ 354 | P_{n}(\wo) = \frac{U(\wo)^{\frac{3}{4}}}{Z} 355 | \] 356 | \vspace{0.1cm} 357 | Usando $P_{n}(\wo)$ vamos amostrar $\wo_{i_{1}}, \dots , \wo_{i_{K}}$; garantindo que $\wo_{o}$ não está entre elas. 358 | \end{frame} 359 | \begin{frame}[fragile]{Amostragem negativa} 360 | \[ 361 | {\color{blue!89}(\wo_{I},\wo_{O})} 362 | \] 363 | \begin{center} 364 | {\color{blue!89}Exemplo positivo} 365 | \end{center} 366 | 367 | \[ 368 | {\color{red!89}(\wo_{I},\wo_{i_{1}}), \dots, (\wo_{I},\wo_{i_{K}})} 369 | \] 370 | \begin{center} 371 | {\color{red!89}Exemplos negativos} 372 | \end{center} 373 | 374 | 375 | \end{frame} 376 | \begin{frame}[fragile]{Amostragem negativa: o modelo (i)} 377 | \[ 378 | p(D=1 \;|\; \wo_I,\wo) = \sigma(v_{\wo}^{\prime} \; .^{T} \;h) 379 | \] 380 | \begin{center} 381 | probabilidade do par $(\wo_{I},\wo)$ ocorrer no corpus 382 | \end{center} 383 | \[ 384 | p(D=0 \;|\; \wo_I,\wo) 385 | \] 386 | \begin{center} 387 | probabilidade do par $(\wo_{I},\wo)$ não ocorrer no corpus 388 | \end{center} 389 | \vspace{0.3cm} 390 | O objetivo de treinamento agora é maximizar as probabilidades 391 | \[ 392 | {\color{blue!89}p(D=1 \;|\; \wo_I,\wo_{O}),\; p(D=0 \;|\; \wo_I,\wo_{i_{1}}), \dots , \; p(D=0 \;|\; \wo_I,\wo_{i_{K}})} 393 | \] 394 | \end{frame} 395 | 396 | \begin{frame}[fragile]{Amostragem negativa: o modelo (ii)} 397 | Assim, vamos minimizar a seguinte função erro: 398 | \begin{align*} 399 | E & = -\log (p(D=1 \;|\; \wo_I,\wo_{O}) \, .\, \prod_{s=1}^{K} p(D=0 \;|\; \wo_I,\wo_{i_{s}})) \\ 400 | & = - (\log p(D=1 \;|\; \wo_I,\wo_{O}) + \log(\prod_{s=1}^{K} p(D=0 \;|\; \wo_I,\wo_{i_{s}})))\\ 401 | & = - (\log p(D=1 \;|\; \wo_I,\wo_{O}) + \sum_{s=1}^{K}\log(p(D=0 \;|\; \wo_I,\wo_{i_{s}})))\\ 402 | & = - \log \sigma(v_{\wo_O}^{\prime} \; .^{T} \; h) - \sum_{s=1}^{K}\log(\sigma(- v_{\wo_{i_{s}}}^{\prime} \; .^{T} \; h))\\ 403 | \end{align*} 404 | \end{frame} 405 | 406 | \begin{frame}[fragile]{Amostragem negativa: atualização} 407 | 408 | \begin{equation}\label{eq:23} 409 | {v^{\prime}_{\wo_{O}}}^{(new)} = {v^{\prime}_{\wo_{O}}}^{(old)} - \eta \, (\sigma( v_{\wo_{O}}^{\prime} \; .^{T} \; h) -1) \, h 410 | \end{equation} 411 | 412 | \begin{equation}\label{eq:24} 413 | {v^{\prime}_{\wo_{i_{s}}}}^{(new)} = {v^{\prime}_{\wo_{i_{s}}}}^{(old)} - \eta \, \#(i_{s}) \, \sigma(v_{\wo_{i_{s}}}^{\prime} \; .^{T} \; h) \, h 414 | \end{equation} 415 | 416 | \begin{equation}\label{eq:25} 417 | W^{(new)} = W^{(old)} - \eta \, x EH^{T} 418 | \end{equation} 419 | 420 | \vspace{0.3cm} 421 | Onde 422 | \[ 423 | EH = (\sigma(v_{\wo_{O}}^{\prime} \; .^{T} \; h) -1) \, v_{\wo_{O}}^{\prime} + \sum_{s=1}^{K}\sigma(v_{\wo_{i_{s}}}^{\prime} \; .^{T} \; h)v_{\wo_{i_{s}}}^{\prime} 424 | \] 425 | e $\#(i_{s})$ é a contagem de $i_{s}$. 426 | \end{frame} 427 | 428 | 429 | \begin{frame}[fragile]{Softmax hierárquico: motivação} 430 | \begin{displayquote} 431 | \textit{The basic idea is to form a hierarchical description of a word as a sequence of $O(\log |V|)$ decisions, and to learn to take these probabilistic decisions instead of directly predicting each word's probality.}(Morin and Bengio 2005, p.247) 432 | \end{displayquote} 433 | 434 | 435 | \end{frame} 436 | 437 | \begin{frame}[fragile]{Softmax hierárquico: árvore de Huffman} 438 | [(de, $24480774$), (repreendeu, $401$), (eróticas, $424$), (adesões, $400$)] 439 | 440 | \begin{center} 441 | \includegraphics[scale=0.5]{tree.pdf} 442 | \end{center} 443 | $\{$ de:$1$, eróticas: $00$, adesões:$010$, repreendeu:$011 \}$. 444 | 445 | \end{frame} 446 | 447 | \begin{frame}[fragile]{Softmax hierárquico: notação} 448 | \begin{itemize} 449 | \item Dado um vocabulário $V$, temos $|V|-1$ vértices que não são folhas (\textit{nós internos}). 450 | \item O caminho da raiz até a folha vai ser usado para estimar a probabilidade da palavra representada pela folha. 451 | \item Dado a palavra $\wo$, $L(\wo)$ é o comprimento do caminho da raiz até $\wo$ e $n(\wo,1), \dots, n(\wo, L(\wo)-1)$ são todos os nós internos no caminho da raiz até $\wo$.\ 452 | \item $H(\wo)_j$ vai denotar o $j$-ésimo número de código de $\wo$. $1$ vai codificar esquerda e $-1$ vai codificar direita. 453 | \end{itemize} 454 | $\{$ de:$-1$, eróticas: $11$, adesões:$1-11$, repreendeu:$1-1-1 \}$. 455 | \end{frame} 456 | 457 | \begin{frame}[fragile]{Softmax hierárquico: o modelo} 458 | 459 | Dado uma observação $(\wo_I,\wo_O)$ os cálculos de $x$ e $h$ vão ser os mesmos; $W$ ainda guarda os \textit{input vectors}. No lugar dos \textit{output vectors} temos: 460 | 461 | \vspace{0.2cm} 462 | 463 | \[ 464 | v^{\prime}_{n(\wo,j)} 465 | \] 466 | 467 | \vspace{0.2cm} 468 | 469 | para cada nó interno $n(\wo,j)$. 470 | 471 | \end{frame} 472 | 473 | \begin{frame}[fragile]{Softmax hierárquico} 474 | Dado $\wo_I$, cada nó interno tem uma probabilidade associada de ir para a esquerda ou para a direita: 475 | \begin{equation}\label{eq:26} 476 | p(n(\wo,j), esquerda) = \sigma(v^{\prime}_{n(\wo,j)} \; .^{T} \; h) 477 | \end{equation} 478 | \begin{equation}\label{eq:27} 479 | p(n(\wo,j), direita) = \sigma(- v^{\prime}_{n(\wo,j)} \; .^{T} \; h) 480 | \end{equation} 481 | Desse modo, temos que dado a ocorrência de $\wo_I$ a probabilidade da palavra $\wo$ ser $\wo_O$ é: 482 | \begin{equation}\label{eq:28} 483 | p(\wo = \wo_O\; |\; \wo_I) = \prod_{j=1}^{L(\wo_{O})-1} \sigma(H(\wo_O)_j . v^{\prime}_{n(\wo_{O},j)} \; .^{T} \; h) 484 | \end{equation} 485 | \end{frame} 486 | 487 | \begin{frame}[fragile]{Softmax hierárquico} 488 | Como queremos maximizar $p(\wo = \wo_O\; |\; \wo_I) $ a função de erro que queremos minimizar é 489 | 490 | \begin{equation}\label{eq:29} 491 | E = - \log p(\wo = \wo_O\; |\; \wo_I) 492 | \end{equation} 493 | 494 | \end{frame} 495 | 496 | \begin{frame}[fragile]{Softmax hierárquico: atualização} 497 | \begin{equation}\label{eq:30} 498 | {v^{\prime}_{n(\wo_{O},j)}}^{(new)} = {v^{\prime}_{n(\wo_{O},j)}}^{(old)} - \eta \, (\sigma( v^{\prime}_{n(\wo_{O},j)} \; .^{T} \; h) -t_{j}) \,h 499 | \end{equation} 500 | 501 | \vspace{0.1cm} 502 | 503 | \begin{equation}\label{eq:31} 504 | W^{(new)} = W^{(old)} - \eta \, x EH^{T} 505 | \end{equation} 506 | 507 | \vspace{0.1cm} 508 | 509 | \vspace{0.3cm} 510 | Onde, 511 | \[ 512 | t_{j}= 513 | \begin{cases} 514 | 1, \text{ se } H(\wo)_{j} =1\\ 515 | 0, \text{ se } H(\wo)_{j} =-1 516 | \end{cases} 517 | \] 518 | 519 | \vspace{0.2cm} 520 | 521 | \[ 522 | EH = \sum_{j=1}^{L(\wo_O) -1} (\sigma(v_{n(\wo,j)}^{\prime} \; .^{T} \; h) - t_j) {v_{n(\wo,j)}^{\prime}} 523 | \] 524 | \end{frame} 525 | 526 | 527 | 528 | \begin{frame}[fragile]{Exemplo de aplicação: NER} 529 | \textbf{NER: named entity recognition} (extração de entidades nomeadas). 530 | Dada uma sentença queremos saber quais entidades ocorrem nela, assim temos de um lado sentenças e de outro categorias (pessoa, localização, organização). 531 | 532 | \vspace{0.1cm} 533 | 534 | \textbf{Modelo de janela :} observações do tipo 535 | 536 | \[ 537 | ([\wo_{t-m}, \dots, \wo_{t}, \dots, \wo_{t+m}],c) 538 | \] 539 | \begin{center} 540 | ("A comissão europeia discorda do tratado proposto", ORG) 541 | \end{center} 542 | \end{frame} 543 | 544 | \begin{frame}[fragile]{Exemplo de aplicação: NER} 545 | \includegraphics[scale=0.57]{ner.pdf} 546 | \end{frame} 547 | 548 | \begin{frame}[fragile]{Como avaliar o modelo?} 549 | \begin{itemize} 550 | \item \textbf{avaliação intrínseca :} avaliação rápida feita numa tarefa intermediaria: e.g., predição de analogias semânticas. 551 | \vspace{0.3cm} 552 | \item \textbf{avaliação extrínseca :} avaliação feita numa tarefa real de NLP: e.g., NER. 553 | \end{itemize} 554 | \end{frame} 555 | 556 | \begin{frame}[fragile]{Como avaliar o modelo? Avaliação intrínseca} 557 | \begin{center} 558 | \textbf{$\wo_{a}$ está para $\wo_{b}$ assim como $\wo_{c}$ está para $\_$}\\ 559 | rapaz moça irmãos irmãs\\ 560 | trabalhou trabalham gerar geram\\ 561 | homem mulher rei rainha 562 | \end{center} 563 | \[ 564 | \wo_{a}:\wo_{b} \rightarrow \wo_{c}: ? 565 | \] 566 | \begin{equation}\label{eq:32} 567 | \wo_{d} = arg max_{x} \; \frac{(b-a +c).^{T}x}{||b-a +c||} 568 | \end{equation} 569 | 570 | \begin{equation}\label{eq:33} 571 | \wo_{d} = arg max_{x} \; b.^{T}x -a.^{T}x +c.^{T}x 572 | \end{equation} 573 | \begin{center} 574 | \textbf{ Qual a palavra cuja representação é similar a $\wo_{b}$ e $\wo_{c}$ e dissimilar de $\wo_{a}$?} 575 | \end{center} 576 | 577 | \end{frame} 578 | 579 | \begin{frame}[fragile]{Avaliação intrínseca} 580 | \includegraphics[scale=0.69]{emb_size} 581 | \end{frame} 582 | 583 | \begin{frame}[fragile]{Implementação: https://github.com/felipessalvatore/Word2vec-pt} 584 | \begin{center} 585 | \small{Corpus em português} 586 | \end{center} 587 | \small{ 588 | \begin{figure} 589 | \begin{center} 590 | \begin{tabular}{|c|c|c|} 591 | \hline 592 | \cellcolor{blue!40}Categoria & \cellcolor{blue!40}Word2vec-pt & \cellcolor{blue!40}Gensim \\ \hline 593 | \cellcolor{blue!10}capital-common-countries & \cellcolor{green!20}(15/306) & \cellcolor{green!20}(8/90) \\ \hline 594 | \cellcolor{blue!10}capital-world & \cellcolor{green!20}(7/1155) & \cellcolor{green!20} (4/173) \\ \hline 595 | \cellcolor{blue!10}curency & \cellcolor{green!20} (0/106) & \cellcolor{green!20}(0/54) \\ \hline 596 | \cellcolor{blue!10}city-in-state & \cellcolor{green!20} (1/1171) & \cellcolor{green!20}(1/208) \\ \hline 597 | \cellcolor{blue!10}family & \cellcolor{red!20}(41/342) & \cellcolor{red!20}(132/306) \\ \hline 598 | \cellcolor{blue!10}gram1-adjective-to-adverb & \cellcolor{red!20}(1/552) & \cellcolor{red!20}(5/380) \\ \hline 599 | \cellcolor{blue!10}gram2-opposite & \cellcolor{red!20}(0/182) &\cellcolor{red!20}(3/90) \\ \hline 600 | \cellcolor{blue!10}gram3-comparative & \cellcolor{red!20}(5/30) & \cellcolor{red!20}(12/30) \\ \hline 601 | \cellcolor{blue!10}gram4-superlative & \cellcolor{red!20}(3/20) & \cellcolor{red!20}(4/6) \\ \hline 602 | \cellcolor{blue!10}gram5-present-participle & \cellcolor{red!20} (0/702) & \cellcolor{red!20}(61/462) \\ \hline 603 | \cellcolor{blue!10}gram6-nationality-adjective & \cellcolor{red!20}(0/412) & \cellcolor{red!20}(37/739) \\ \hline 604 | \cellcolor{blue!10}gram7-past-tense & \cellcolor{red!20}(8/1056) & \cellcolor{red!20}(124/506) \\ \hline 605 | \cellcolor{blue!10}gram8-plural & \cellcolor{red!20} (1/992) &\cellcolor{red!20} (25/380) \\ \hline 606 | \cellcolor{blue!10}gram9-plural-verbs & \cellcolor{red!20}(9/552) & \cellcolor{red!20}(29/306) 607 | \end{tabular} 608 | \end{center} 609 | \end{figure} 610 | } 611 | \end{frame} 612 | 613 | \begin{frame}[fragile]{Implementação: https://github.com/felipessalvatore/Word2vec-pt} 614 | 615 | % EUUUUUUUU 616 | % family: 13.5% (46/342) 617 | % gram1-adjective-to-adverb: 0.6% (6/930) 618 | % gram2-opposite: 0.0% (0/506) 619 | % gram3-comparative: 2.7% (36/1332) 620 | % gram4-superlative: 0.7% (5/756) 621 | 622 | % gram5-present-participle: 1.4% (15/1056) 623 | % gram7-past-tense: 1.5% (22/1482) 624 | % gram8-plural: 1.4% (17/1190) 625 | % gram9-plural-verbs: 1.0% (8/812) 626 | \begin{center} 627 | \small{Corpus em inglês} 628 | \end{center} 629 | 630 | \small{ 631 | \begin{figure} 632 | \begin{center} 633 | \begin{tabular}{|c|c|c|} 634 | \hline 635 | \cellcolor{blue!40}Categoria & \cellcolor{blue!40}Word2vec-pt & \cellcolor{blue!40}Gensim \\ \hline 636 | \cellcolor{blue!10}family & \cellcolor{green!20}(46/342) & \cellcolor{green!20}(1/306) \\ \hline 637 | \cellcolor{blue!10}gram1-adjective-to-adverb & \cellcolor{green!20}(6/930) & \cellcolor{green!20}(0/756) \\ \hline 638 | \cellcolor{blue!10}gram2-opposite & \cellcolor{green!20}(0/506) &\cellcolor{green!20}(0/306) \\ \hline 639 | \cellcolor{blue!10}gram3-comparative & \cellcolor{green!20}(36/1332) & \cellcolor{green!20}(0/1260)\\ \hline 640 | \cellcolor{blue!10}gram4-superlative & \cellcolor{green!20}(5/756) & \cellcolor{green!20}(0/506) \\ \hline 641 | \cellcolor{blue!10}gram5-present-participle & \cellcolor{green!20} (15/1056) & \cellcolor{green!20}(0/992) \\ \hline 642 | \cellcolor{blue!10}gram7-past-tense & \cellcolor{green!20}(22/1482) & \cellcolor{green!20}(0/1332) \\ \hline 643 | \cellcolor{blue!10}gram8-plural & \cellcolor{green!20} (17/1190) &\cellcolor{green!20} (0/992) \\ \hline 644 | \cellcolor{blue!10}gram9-plural-verbs & \cellcolor{green!20}(8/812) & \cellcolor{green!20}(0/650) 645 | \end{tabular} 646 | \end{center} 647 | \end{figure} 648 | } 649 | \end{frame} 650 | 651 | 652 | \begin{frame}[fragile]{Bibliografia} 653 | 654 | \begin{itemize} 655 | \item Mikolov, T., Chen, K., Corrado, G., and Dean, J. (2013). Efficient estimation of word representation in vector space. \textit{arXiv preprint arXiv:1301.3781}. 656 | \item Mikolov, T., Sutskever, I., Chen, K., Corrado, G., and Dean, J. (2013). Distributed representations of words and phrases and their compositionality. In \textit{Advances in Neural Information Processing Systems}, pages 3111-3119. 657 | \item Morin, F., Bengio, Y. (2005). Hierarchical probabilistic neural network language model. In \textit{AISTATS}, pages 246-252. 658 | \item Rong, X. (2016). Word2vec Parameter Learning Explained. \textit{arXiv preprint arXiv:1411.2738}. 659 | 660 | 661 | \end{itemize} 662 | 663 | \end{frame} 664 | 665 | 666 | 667 | 668 | 669 | \end{document} 670 | -------------------------------------------------------------------------------- /presentation/simple_model.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LIAMF-USP/Word2vec-pt/d3e705762de0f72d0e4ac0ccdde2a94ed897789c/presentation/simple_model.pdf -------------------------------------------------------------------------------- /presentation/skip-gram.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LIAMF-USP/Word2vec-pt/d3e705762de0f72d0e4ac0ccdde2a94ed897789c/presentation/skip-gram.pdf -------------------------------------------------------------------------------- /presentation/tree.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LIAMF-USP/Word2vec-pt/d3e705762de0f72d0e4ac0ccdde2a94ed897789c/presentation/tree.pdf -------------------------------------------------------------------------------- /src/data/basic_pt.txt: -------------------------------------------------------------------------------- 1 | Donkey Kong Country é um jogo de plataforma em 2D desenvolvido pela Rare e publicado pela Nintendo para o Super Nintendo Entertainment System. Foi lançado em Novembro de 1994, sob o nome Super Donkey Kong (スーパードンキーコング, Sūpā Donkī Kongu?) no Japão. Estrelando o personagem Donkey Kong, o jogo se passa em "Donkey Kong Island" onde é explorado seis regiões com ambientes diferentes, e o enredo gira em torno de Donkey Kong e seu sobrinho Diddy Kong, que devem recuperar seu tesouro de bananas roubado por King K. Rool e os Kremlings. 2 | Após uma intensa campanha publicitária, a versão original para o SNES vendeu mais de 9 milhões de cópias, fazendo deste o segundo jogo mais bem vendido da plataforma.[1] O jogo foi uma revolução em termos gráficos para sua época, sendo o primeiro a conter 32 megabits no cartucho de Super Nintendo,[2] com texturas pré-renderizadas em modelos 3D e uma ótima trilha sonora, provando que o SNES ainda era um forte concorrente no mercado.[3] 3 | Este foi o primeiro jogo Donkey Kong a não ser produzido e nem dirigido por Shigeru Miyamoto, o criador do personagem; ao invés, o jogo foi produzido por Tim Stamper e Gregg Mayles, embora Miyamoto ainda estivesse envolvido no projeto.[4] Donkey Kong Country foi posteriormente adaptado ao Game Boy Color em 2000, e ao Game Boy Advance em 2003. Além disso, o foi disponibilizado para download no Wii Virtual Console em 2006, Wii U Virtual Console em 2014 e um sucessor do jogo para o New Nintendo 3DS em 2016 com um modo de pixel perfeito. 4 | 5 | 6 | O objetivo de Donkey Kong Country é passar por 40 fases diferentes (41 na versão para Game Boy Color) e recuperar as bananas dos Kongs, que foram roubadas pelos Kremlings.[5][6] Cada fase possui um tema único e consiste em variadas tarefas como nadar, correr em vagonetas, se lançar em canhões, ou se agitar entre cipós.[6] O jogador perde uma vida se é atingido por um inimigo ou cai em um abismo. Para derrotar um inimigo, o jogador pode rolar e saltar sobre ele, ou mesmo bater no chão (um movimento reservado apenas a Donkey Kong). Porém, alguns inimigos não são derrotados dessa maneira, exigindo que o jogador arremesse um barril ou use a ajuda de um animal. Os inimigos variam em dificuldade, tipicamente se tornando mais complicados conforme o jogo avança. O jogo termina quando o jogador tiver perdido todas as suas vidas. É possível, porém, obter mais vidas colecionando itens distribuídos no decorrer das fases, tais como bananas, letras K-O-N-G, balões de vida extra, e moedas animais douradas que abrem caminho a fases de bônus.[7] Há também várias passagens secretas que levam a jogos de bônus, onde o jogador pode ganhar vidas adicionais ou outros itens.[8] 7 | O jogador de Donkey Kong Country controla um dos dois personagens: Donkey Kong, ou seu sobrinho Diddy. O jogador pode alternar entre personagens caso ambos estejam na tela. Donkey Kong é o maior dos dois, e pode derrotar inimigos mais facilmente. Diddy Kong é mais rápido e ágil, mas, em contrapartida, não tão poderoso.[9] Nas diversas fases, o jogador obtém assistência de vários animais, encontrados dentro de caixas. Esses assistentes incluem Rambi o Rinoceronte, Expresso o Avestruz, Enguarde o Peixe-espada, Winky o Sapo, e Squawks o Papagaio. Cada animal é encontrado em uma fase de tema apropriado: por exemplo, Enguarde só pode ser encontrado em fases subaquáticas, enquanto que Squawks pode ser visto nas cavernas.[6][10] Alguns animais também dão acesso aos jogadores a acessar fases de bônus.[9] 8 | O jogo pode ser jogado solo ou por dois jogadores. No modo para dois jogadores, há dois modos de jogos: "Concurso" e "Equipe". No modo Concurso, os jogadores alternam entre rodadas para terminar cada fase o mais rápido possível; o objetivo é concluir o maior número de fases em menos tempo. Em Equipe, os jogadores jogam cooperativamente, cada um controlando um personagem. De acordo com o manual de instruções do jogo, este é um bom meio para que jogadores inexperientes joguem ao lado de jogadores ávidos.[11] 9 | Donkey Kong Country usa uma série de telas de mapa para acompanhar o progresso do jogador. Entre cada fase, o jogador controla o seu personagem na tela de mapa, navegando à próxima fase que deseja jogar. Cada fase no mapa é marcada por um ícone: fases inacabadas são marcadas por Kremlings (os principais inimigos do jogo), enquanto que áreas concluídas são marcadas por membros da família Kong.[11] Cada tela de mapa possui um chefe ao final da trajetória, que deve ser derrotado para que então o jogador possa voltar à tela do mapa-múndi, que cobre toda a ilha. É possível acessar mapas anteriores sem ter derrotado o chefe encontrando Funky Kong, que permite que o jogador use seu avião. O jogador usa está função para selecionar o mundo a partir da tela principal, e então a fase dentro dele. Durante o jogo, a interface oculta a maioria das informações pertinentes ao jogo, tal como o número de bananas, letras e moedas animais colecionadas, e também o número de vidas restantes. Quando um item é obtido, a informação pertinente aparece na tela por um breve período de tempo.[12] 10 | Em Donkey Kong Country, Donkey Kong, ao lado de seu sobrinho e companheiro inseparável Diddy Kong, devem recuperar as bananas roubadas por King K. Rool e seus capangas, os Kremlings. Após verificar o vazio esconderijo de bananas, localizado logo abaixo de sua casa em Kongo Jungle, Donkey Kong embarca em uma aventura em sua terra nativa, a Ilha Donkey Kong. Enquanto coleta as bananas nas diferentes regiões da ilha, Donkey Kong deve derrotar vários inimigos, incluindo os repteis Kremlings, além de outras perigosas criaturas nativas da ilha. Ajudando-o em sua missão estão alguns dos outros Kongs da família: Diddy acompanha Donkey Kong em sua aventura, Cranky providencia dicas (e alívio cômico), Candy opera os pontos de gravação ao redor da ilha, e Funky oferece meio de transporte. Também apoiando Donkey Kong em certas ocasiões estão vários 'colegas animais' (o rinoceronte Rambi, a avestruz Expresso, o peixe-espada Enguarde, o sapo Winky, e o papagaio Squawks), cada um com habilidades diferentes. Após superar as diferentes áreas da ilha, Donkey Kong finalmente chega ao navio pirata Gangplank Galleon, onde o arquirrival de Donkey Kong e líder dos Kremlings, King K. Rool, o aguarda. Após derrotá-lo, o jogo termina, com a cena final mostrando o esconderijo de bananas de Donkey Kong em toda sua antiga glória, cheia de bananas novamente.[13] 11 | Antes do início da produção de Donkey Kong Country, Chris e Tim Stamper, da Rare, haviam programado experimentos com uma estação de trabalho Silicon Graphics, com foco inicial em um jogo de boxe. Após impressionar a Nintendo com seu progresso, Genyo Takeda foi enviado ao Japão para avisar ao então-presidente da Nintendo, Hiroshi Yamauchi. Após conversas entre Yamauchi e a Rare, a Nintendo adquiriu 25% da companhia, culminando na produção de um novo título utilizando tecnologia SGI. Os Stampers demonstraram interesse em fazer um novo jogo baseado no personagem Donkey Kong, e receberam consentimento da Nintendo para fazê-lo. 12 | O personagem Donkey Kong foi redesenhado com uma aparência distinta e tridimensional. Embora ainda com a gravata vermelha introduzida na versão de 1994 para Game Boy de Donkey Kong, o personagem apresentava um novo visual que passaria a ser o padrão utilizado até hoje no Nintendo GameCube, no Wii, e em outras plataformas da Nintendo.[14] 13 | Como parte da campanha publicitária da Nintendo, um vídeo VHS de 15 minutos intitulado Donkey Kong Country: Exposed foi enviado aos assinantes da Nintendo Power. Apresentado pelo comediante Josh Wolf, o vídeo exibia um breve tour pela sede da Nintendo of America em Redmond, Washington, mostrando também filmagens do jogo em suas etapas finais de desenvolvimento. Vários testadores de jogo deram dicas sobre como acessar fases de bônus e desempenhar truques no jogo. Várias entrevistas promovem o nível de complexidade gráfica como revolucionário ao padrão dos sistemas de jogos da época. Um segmento ao final do vídeo lembra à audiência que o jogo está disponível apenas no console de 16-bit da Nintendo, o Super Nintendo Entertainment System, e não em suas plataformas rivais de 32-bit ou que utilizavam CD-ROM (isto é, Sega 32X e Sega CD), que se enalteciam por possuir maior poder de processamento. Em uma seção "escondida" ao final do vídeo, o apresentador abre uma porta e descobre os testadores da Nintendo of America jogando uma versão inicial do arcade Killer Instinct. Um personagem similar a Chief Thunder é exibido com diferenças notáveis. 14 | O jogo foi revolucionário em ser um dos primeiros jogos entre os principais sistemas de videogame da época a utilizar gráficos pré-modelados em 3D. Era uma técnica visual que foi utilizada também no jogo Killer Instinct, da Rare. Mais tarde, vários jogos também passariam a utilizar 3D pré-modelado com objetos em 3D completo. A Rare assumiu sérios riscos financeiros ao adquirir o caro equipamento de SGI utilizado para modelar os gráficos. Uma nova técnica de compressão desenvolvida localmente permitiu que fossem incorporados mais detalhes e animação a cada sprite em um determinado trecho da memória do que em outros jogos para SNES, melhor representando os gráficos pré-modelados. Tanto a Nintendo como a Rare se referem a esta técnica de animação como "ACM" ("Advanced Computer Modeling", ou "Modelagem Avançada por Computador"). 15 | Donkey Kong Country contou também com uma trilha sonora popular lançada em CD sob o título DK Jamz. Os compositores Robin Beanland, Eveline Fischer e David Wise colaboraram neste conjunto de jungle music. A composição diversa consiste em mais de 20 faixas. 16 | A trilha sonora também foi o foco de uma colaboração na OverClocked ReMix intitulada Kong in Concert, que foi elogiada por Wise.[15] 17 | Donkey Kong Country teve muito sucesso em seu lançamento, recebendo clamor crítico e alcançando a marca de 8 milhões de cópias vendidas.[18] Mais tarde, o jogo foi relançado como um título incluso ao Super Nintendo no "Donkey Kong Set" (que continha o console, um controle, conexões, e o jogo). Isto ocasionou nas vendas de mais um milhão de cópias, resultando em um relançamento Player's Choice em meados de 1998. A versão para SNES recebeu uma classificação de 90%, enquanto que as versões para Game Boy Color e Game Boy Advance receberam 78% do Game Rankings.[19] 18 | O jogo recebeu vários prêmios da Electronic Gaming Monthly em sua premiação de jogos de 1994, incluindo Melhor Jogo para Super NES, Melhor Animação, Melhor Dupla (de Personagens) em um Jogo, e Jogo do Ano.[20] Porém, ele também foi considerado pela revista por ser um dos 10 mais superestimados de todos os tempos antes de seu 200º exemplar de aniversário em 2005.[21] O jogo também alcançou a 9ª posição na lista dos 25 jogos mais superestimados de todos os tempos pela GameSpy em 2003.[22] Apesar disso, ele foi considerado o 90º melhor jogo já feito em uma plataforma da Nintendo na lista dos 200 maiores jogos pela Nintendo Power em 2006.[23] O título recebeu um Prêmio Nintendo Power por Melhor Jogo em 1994 e duas condecorações Kid's Choice por Jogo Favorito em 1994 e 1995, respectivamente. 19 | Em 2000, uma versão de Donkey Kong Country foi lançada no Game Boy Color. A versão para GBC tem uma nova fase em Chimp Caverns, "Necky Nutmare", e a fase "Winky’s Walkway" foi alongada e reformada. Candy possui vários mini-jogos na versão para GBC onde Donkey e Diddy tem de recolher moeda dourada de banana em todos os mini-jogos dos mundos excluindo Galeão da Prancha. O jogo salva automático na versão para GBC depois de completar nível. A versão para GBC teve algumas das faixas descartas e outras, substituídas, tipicamente por músicas que apareceram em Donkey Kong Land. Em 2003, outra versão do jogo foi lançada no Game Boy Advance. Esta versão tinha mais brilho ao custo de contraste e saturação de cores, para tornar o jogo mais visível na tela apagada de LCD do portátil. Ambos os jogos possuíam novos recursos, incluindo minigames, imagens escondidas, e um modo de corrida contra o tempo; adicionalmente, a versão para GBA possuía jogos multiplayer. Ambas as versões tinham menor fidelidade de som e uma série de pequenas alterações. Candy Kong não mais possui pontos de gravação, de forma que jogadores podem salvar o jogo em qualquer lugar. 20 | A versão 1.1 para Super Nintendo foi lançada no Virtual Console para Wii na Oceania no dia 7 de dezembro de 2006, no dia 8 de dezembro de 2006 na Europa, e no dia 19 de fevereiro de 2007 na América do Norte e foi excluída na Europa e na América do Norte, mas foi reintegrado para o Wii U Virtual Console em 2014. Na Europa, Donkey Kong Country foi lançado no Wii U Virtual Console em 16 de outubro de 2014 e no Japão em 26 de novembro do mesmo ano.[24] Em 26 de Fevereiro de 2015, os três primeiros jogos Donkey Kong Country foram liberados no Wii U Virtual Console, e foram restabelecidos para o Virtual Console Wii nos Estados Unidos.[25] Em 24 de março de 2016, Donkey Kong Country foi lançado para o New Nintendo 3DS Virtual Console.[26] 21 | 22 | O Malzoni GT é um automóvel esportivo brasileiro produzido entre 1964 e 1966, em uma fazenda chamada CHIMBO em Dobrada-SP, idealizado inicialmente apenas para competições, utilizando chassis e mecânica DKW (representada no Brasil pela Vemag) e carroceria em fiberglass. Este veículo foi produzido em duas versões: uma espartana, para as pistas de corrida, e outra de passeio, que deu origem ao Puma GT (conhecido também como "Puma DKW") e à marca Puma. Estima-se que tenham sido produzidos aproximadamente 35 exemplares. 23 | Usualmente, a denominação GT, que significa "grã turismo" ou "grand touring", aparece após o nome do automóvel, mas o Malzoni GT foi tratado como "GT Malzoni" (ou ainda como "GT Malzoni DKW") em algumas reportagens de revistas especializadas de sua época. Além disso, o emblema que apresenta seu nome, na traseira do veículo, tem forma triangular e nele aparece o "GT" acima do nome "Malzoni". 24 | Os exemplares da versão de passeio e alguns exemplares da versão espartana foram produzidos em fiberglass. Os primeiros modelos entretanto foram produzidos com carroceria metálica. Quando seu projetista, Rino Malzoni, ofereceu um dos primeiros exemplares, ainda metálico, para teste por uma revista especializada, ele foi designado como "DKW Vemag GT". 25 | 26 | 27 | Durante a década de 1960 os fabricantes de automóveis do Brasil utilizavam como parte de sua estratégia de Marketing as corridas. A DKW-Vemag dispunha para estes eventos o Belcar modificado, que apresentava um bom desempenho a pesar de seu elevado peso. 28 | A partir deste cenário Jorge Lettry, (departamento de competições da Vemag), Genaro "Rino" Malzoni (que tinha experiência em carrocerias próprias utilizando chassises existentes), Anísio Campos (designer e piloto), entre outros criaram um pequeno protótipo esportivo em metal (os exemplares seguintes foram confeccionados em fibra de vidro) com desenho de inspiração italiana. 29 | Em 1964 estréia nas competições.[1] 30 | Em 1965, [2] o modelo ganha cinco provas e seu principal concorrente é o Interlagos (versão brasileira do Renault Alpine A-108) produzido pela Willys. 31 | Em 1967 é substituido pelo Puma DKW [3]. 32 | A empresa Lumimari, posteriormente renomeada para Puma Veículos e Motores Ltda., foi criada para produzir o veículo. 33 | As características apresentadas correspondem ao DKW Vemag GT e ao Malzoni GT, testados pela Revista Quatro Rodas. 34 | DKW-Vemag, ciclo de dois tempos, três cilindros em linha com 74mm de diâmetro e 76mm de curso, volume de 981cm³ (1000cc), taxa de compressão de 7,25:1, potência de 50CV SAE a 4500rpm, torque de 8,5kg.m a 2250rpm. 35 | Umas das características desse motor, é possuir 7 peças móveis, sendo elas 3 pistões, 3 bielas e 1 virabrequim e não utilizar bomba d'água(é utilizado termo sifão). Sistema usado, no Brasil, no Belcar, na Vemaguet, no Fissore e no Candango. 36 | No Malzoni GT e em seu sucessor, o Puma GT, era utilizada uma bomba d'água coaxial com o dínamo. Nesses carros, devido à baixa altura do capô do motor, não era possível utilizar o sistema de termo sifão, onde o radiador situa-se em nível superior ao do motor. 37 | Câmbio com quatro marchas à frente, sincronizadas, e uma à ré, com comando no assoalho, com embreagem de um único disco seco e com roda livre idêntica a dos veículos da Vemag, acionada por cabo sob o painel. As relações de redução são 3,82; 2,22; 1,31 e 0,915 para 1. A relação da ré é 4,58:1 e a do diferencial é de 5,14:1. 38 | Idêntico ao dos veículos da Vemag, sendo entretanto encurtado para proporcionar menor distância entre eixos, com suspensão por molas transversais semi elípticas com separadores de polietileno e amortecedores. 39 | Direção por pinhão e cremalheira. 40 | Freios a tambor, com área de frenagem ativa nos freios de serviço de 715cm². Rodas de 5,5 polegadas e pneus 560x15. 41 | Entre eixos, 2,45 m; 42 | bitola dianteira, 1,29 m; bitola traseira, 1,35 m; 43 | altura livre do solo, 15cm; 44 | peso, vazio, 915kg; 45 | carga útil, 410kg; 46 | comprimento total, 4,08 m; largura, 1,69 m; altura, 1,28 m. 47 | O tanque de combustível tem capacidade para aproximadamente 45 litros, incluindo cerca de 8 litros para reserva. O reservatório do Lubrimat tem capacidade para pouco menos de 2 litros. A caixa de câmbio tem capacidade para 2,5 litros, sendo 2,25 litros no reabastecimento. O sistema de arrefecimento tem capacidade para cerca de 8 litros de água. 48 | Velocidade máxima estimada em 145km/h, 49 | velocidade obtida no teste efetuado pela Quatro Rodas, 138km/h, 50 | consumo de combustível (segundo a Norma DIN 70030) igual a 11,43km/l. 51 | DKW-Vemag S, o motor do Fissore; 52 | ciclo de dois tempos, três cilindros em linha com 74mm de diâmetro e 76mm de curso, volume de 981cm³ (1000cc), taxa de compressão de 8:1, potência de 60CV SAE a 4500rpm, torque de 9kg.m a 2500rpm, com carburador Brosol 40 CIB descendente, sistema Lubrimat para lubrificação automática(com uma polia dupla aclopada ao alternador). 53 | Umas das características desse motor, é possuir 7 peças móveis, sendo elas 3 pistões, 3 bielas e 1 virabrequim e não utilizar bomba d'água(é utilizado sifão). 54 | As versões para competição tinham pistões de diâmetro maior, 77,5mm de diâmetro, com volume de 1080cm³. 55 | Câmbio com quatro marchas à frente, sincronizadas, e uma à ré, com comando no assoalho, com embreagem de um único disco seco. As relações de redução são 3,82; 2,22; 1,39 e 0,97 para 1. Essas relações são tradicionais das caixas da Vemag, com a segunda "curta". Opcionalmente, eram fornecidas caixas adequadas ao motor instalado. A roda livre é idêntica a dos veículos da Vemag, mas é permanente, por se tratar de veículo esportivo. 56 | Idêntico ao dos veículos da Vemag, sendo entretanto encurtado para proporcionar menor distância entre eixos, com suspensão por molas transversais semi elípticas com separadores de polietileno e amortecedores. 57 | Direção por pinhão e cremalheira, com relação de 19,2 para 1. 58 | Freios a tambor, com freios dianteiros a disco opcionais. A área de frenagem ativa nos freios de serviço é de 715cm². Rodas de 5,5 polegadas e pneus Pirelli 560x15 Spalla. 59 | Entre eixos, 2,22 m; 60 | bitola dianteira, 1,29 m; bitola traseira, 1,35 m; 61 | altura livre do solo, 17cm; 62 | peso em condições de marcha, 800kg na versão de passeio, 720 a 750kg na versão espartana; 63 | comprimento total, 3,85 m; largura máxima, 1,6m; altura, 1,2m. 64 | Velocidade máxima estimada em 145km/h. 65 | Podem ser identificados quatro modelos do Malzoni GT. O Malzoni I foi o primeiro automóvel fabricado por Rino Malzoni. Era um cupê três volumes metálico construído sobre o chassis dos veículos da Vemag. Foi alvo do teste da Revista Quatro Rodas, então denominado como "DKW-Vemag GT". O Malzoni II, por sua vez, era uma berlineta com formas mais aerodinâmicas e mais apropriadas para pistas de competição. O Malzoni III era uma evolução desse segundo modelo, também em aço, e serviu como molde para as fôrmas do modelo em fiberglass, o Malzoni IV. Este último, com o tempo, foi denominado como Malzoni GT (também testado pela Revista Quatro Rodas) e deu origem ao Puma DKW. 66 | Puma 67 | Malzoni GT | Puma DKW | Puma GT | Puma GT4R | Puma GTE | Puma Spyder | Puma GTS | Puma GTB | Puma GTI | Puma GTC | Puma AM1 | Puma AM2 | Puma AM3 | Puma AM4 | Puma AMV 68 | Prototipos | Caminhões 69 | Coordenadas: 56° N 10° E 70 | Dinamarca (em Inglês e dinamarquês: Denmark, [ˈd̥ɛnmɑɡ̊]), oficialmente Reino da Dinamarca, é um país nórdico da Europa setentrional e membro sênior do Reino da Dinamarca. É o mais meridional dos países nórdicos, a sudoeste da Suécia e ao sul da Noruega, delimitado no sul pela Alemanha. As fronteiras da Dinamarca estão no Mar Báltico e no Mar do Norte. O país é composto por uma grande península, a Jutlândia, e 443 ilhas, das quais 78 habitadas, com destaque para a Zelândia (Sjælland), Funen (Fyn), Vendsyssel-Thy, Lolland, Falster e Bornholm, assim como centenas de ilhas menores, muitas vezes referidas como o Arquipélago Dinamarquês.[6] A Dinamarca há muito tempo controla a entrada e a saída do mar Báltico, já que isso só pode acontecer por meio de três canais, que também são conhecidos como os "Estreitos Dinamarqueses". 71 | A língua nacional, o dinamarquês, é próxima do sueco e do norueguês. A Dinamarca compartilha fortes laços históricos e culturais com a Suécia e com a Noruega. 82,0% dos habitantes da Dinamarca e 90,3% da etnia dinamarquesa são membros da Igreja Estatal Luterana. Cerca de 9% da população tem nacionalidade estrangeira, sendo que uma grande parte deles são provenientes de outros países escandinavos. 72 | O país é uma monarquia constitucional com um sistema parlamentar de governo. Possui um governo central e outros locais em 98 municípios. O país é membro da União Europeia desde 1973, embora não tenha aderido ao euro, e um dos membros fundadores da Organização do Tratado do Atlântico Norte e da Organização para a Cooperação e Desenvolvimento Económico. 73 | A Dinamarca, com uma economia mista capitalista e um estado de bem-estar social,[7] possui o mais alto nível de igualdade de riqueza do mundo, sendo considerado em 2011, o país com menor índice de desigualdade social do mundo. A Dinamarca tem o melhor clima de negócios no mundo, segundo a revista estadunidense Forbes.[8] De 2006 a 2008, pesquisas[9] classificaram a Dinamarca como "o lugar mais feliz do mundo", com base em seu princípio de saúde, bem-estar, assistência social e educação universal; O Índice Global da Paz de 2009 classificou a Dinamarca como o segundo país mais pacífico do mundo, depois da Nova Zelândia.[10] A Dinamarca também foi classificada como o país menos corrupto do mundo em 2008, pelo Índice de Percepção de Corrupção,[11] compartilhando o primeiro lugar com a Suécia e a Nova Zelândia. 74 | 75 | 76 | A etimologia da palavra Dinamarca e, especialmente, a relação entre os dinamarqueses e a Dinamarca e a unificação do país como um único reino, ainda são assuntos que atraem debate.[12][13] Esta discussão é centrada principalmente no prefixo "Dan" e se refere aos danos ou uma pessoa histórica chamada Dan. A questão é ainda mais complicada por uma série de referências a vários danos na Escandinávia ou em outros lugares na Europa em fontes gregas e romanas (como Ptolomeu, Jordanes e Gregório de Tours), bem como na literatura medieval (como Adão de Bremen, Beowulf, Widsith e Edda em verso). 77 | A maioria dos manuais consideram a origem da primeira parte da palavra,[14] bem como o nome das pessoas, de uma palavra que significa "terra plana" , relacionada com as palavras em alemão tenne e em sânscrito dhanus (धनुस्; "deserto"). O sufixo marca provavelmente significa "floresta" ou "fronteira", com referências prováveis ​​para as florestas de fronteira no sul do Schleswig.[15] 78 | A origem da Dinamarca está perdida na pré-história. Sua fortaleza mais velha é datada do século VII, ao mesmo tempo que o novo alfabeto rúnico. A Dinamarca foi unida por Haroldo Dente-Azul por volta 456. 79 | Após o século XI, os dinamarqueses ficaram conhecidos como vikings, colonizando, invadindo e negociando em toda a Europa.[16] 80 | Em vários momentos da história, a Dinamarca controlou a Inglaterra, Noruega, Suécia, Islândia, parte das Ilhas Virgens, partes da costa Báltica e o que é agora o norte da Alemanha. A Escânia foi parte da Dinamarca na maior parte de sua história, mas foi perdida para a Suécia em 1658. 81 | A união com a Noruega foi dissolvida em 1814, quando Noruega entrou em uma nova união com a Suécia (até 1905). O movimento liberal e nacional dinamarquês teve seu momento culminante em 1830, e após as revoluções europeias de 1848, a Dinamarca tornou-se uma monarquia constitucional em 1849. O ducado de Schleswig tornou-se propriedade pessoal do rei da Dinamarca em 1460. As tentativas feitas a partir de 1846 pela Dinamarca para anexar o ducado de Schleswig, assim como também o ducado de Holstein, fracassaram durante a guerra dos Ducados (1864). Depois da guerra austro-prussiana em 1866, a Prússia, vitoriosa na guerra, anexou ambos os ducados e aproveitou para dissolvê-los transformando-os numa única unidade a província do Schleswig-Holstein. Estes ducados sempre fizeram parte do Sacro Império Romano Germânico até Napoleão dissolver este Império em 1806. 82 | Derrotado Napoleão, após o Congresso de Viena em 1815, os ducados Schleswig e Holstein passaram a fazer parte da Confederação Germânica, herdeira natural do Sacro Império Romano Germânico, visto que estes ducados nunca pertenceram à Dinamarca, mas eram apenas propriedade pessoal dos seus soberanos simultaneamente reis da Dinamarca. (Em 1920, mediante plebiscito realizado devido à derrota da Alemanha na Primeira Guerra Mundial, uma das regiões plebiscitárias o norte do Schleswig (Abstimmungsgebiet) foi cedida à Dinamarca, onde ainda hoje há alguns núcleos populacionais maioritariamente de língua alemã, cujos direitos como minoria nacional estão reconhecidos internacionalmente.) Depois da segunda guerra de Schleswig em 1864, o rei da Dinamarca teve que ceder os ducados de Schleswig e Holstein à Prússia em resultado da sua derrota pessoal, este episódio por simbiose marcou profundamente a identidade nacional dinamarquesa. 83 | Após a derrota frente à Prússia, a Dinamarca adotou uma política de neutralidade, permanecendo neutra na Primeira Guerra Mundial. Em 9 de abril de 1940, a Dinamarca foi invadida pela Alemanha Nazista (operação Weserübung) e permaneceu ocupada durante toda a Segunda Guerra Mundial, apesar de alguma pequena resistência interna. O país tentou ser o mais neutro possível e não ceder o seu poder interno ao controle nazista, sendo socialista na época, tentando inclusive persuadir dinamarqueses a não se afiliarem ao exército alemão, que ao fim da guerra, começou a intensificar este. Ao fim de 1944, poucos dinamarqueses apoiavam o regime de Hitler - ainda menos do que em 1940, justificando assim o aumento da resistência interna com atentados a soldados nazistas. 84 | A mudança constitucional em 1953 levou a um parlamento de câmara única eleito por representação proporcional, a adesão feminina ao trono dinamarquês, e da Groenlândia se tornando parte integrante da Dinamarca. Os social-democratas lideraram uma série de governos de coalizão pela maior parte da segunda metade do século XX em um país geralmente conhecida por suas tradições liberais. 85 | Após a Segunda Guerra Mundial, a Dinamarca tornou-se um dos membros fundadores da Associação Europeia de Livre Comércio (EFTA), da Organização do Tratado do Atlântico Norte (OTAN) e das Nações Unidas. Durante os anos 1960 , os países da EFTA eram muitas vezes referidos como os Sete Exteriores, ao contrário dos Seis Interiores do que era então a Comunidade Econômica Europeia (CEE).[17] 86 | Em 1973, juntamente com o Reino Unido e a Irlanda, a Dinamarca aderiu à Comunidade Econômica Europeia, que posteriormente iria formar a União Europeia (UE) após um referendo público. O Tratado de Maastricht, que envolvia uma maior integração europeia, foi rejeitado pelo povo dinamarquês em 1992; ele só foi aceito depois de um segundo referendo, em 1993, e pela adição de certas disposições para a Dinamarca. Os dinamarqueses rejeitaram o Euro como moeda nacional em um referendo em 2000. A Groenlândia ganhou governo próprio em 1979 e foi premiada com a autodeterminação em 2009. A Groenlândia e as Ilhas Faroé não são membros da UE; as Ilhas Faroé saíram da CEE em 1973 e a Groenlândia em 1986, em ambos os casos por causa de políticas de pesca. 87 | A Dinamarca compartilha uma fronteira de 68km com a Alemanha no sul e é cercada por 7314km de mar (incluindo pequenas baías e enseadas).[18] Possui área total de 43094km². Desde 2000, a Dinamarca está ligada à Suécia pela Ponte do Øresund. A Dinamarca consiste na península da Jutlândia (Jylland) e de 443 ilhas com nome, das quais 76 são habitadas, e entre as quais as mais importantes são Fiónia e a Zelândia (Sjælland) onde localiza-se Copenhaga a capital do país. A ilha de Bornholm localiza-se um pouco para leste do resto do país, no mar Báltico. Muitas das ilhas estão ligadas por pontes.[19] 88 | O país é, em geral, plano e com poucas elevações, os pontos mais elevados são o Møllehøj, o Ejer Baunehøj e o Yding Skovhøj, todos com altitude apenas uns centímetros acima dos 170 m. O clima é temperado, com invernos suaves e verões frescos. As cidades principais são a capital, Copenhague (na Zelândia), Aarhus (na Jutlândia) e Odense (em Fyn).[carecede fontes?] 89 | A Dinamarca encontra-se na zona de clima temperado. O inverno não é muito frio, com temperaturas médias em janeiro e fevereiro de 0°C, e o verão é fresco, com uma temperatura média em agosto de 15,7°C.[18] A Dinamarca tem uma média de 712mm de precipitação por ano; o outono é a estação do ano mais chuvosa e a primavera é a mais seca. Devido à sua localização geográfica, a duração dos dias varia muito na Dinamarca.[carecede fontes?] 90 | De acordo com estatísticas de 2012 do governo dinamarquês, 89,6% da população de mais de 5580516 habitantes da Dinamarca é de ascendência dinamarquesa (definido como tendo pelo menos um pai que nasceu na Dinamarca e tem nacionalidade dinamarquesa). Muitos dos 10,4% restantes são imigrantes ou descendentes de imigrantes recentes de países vizinhos, além de Turquia, Iraque, Somália, Bósnia e Herzegovina, Sul da Ásia e do Oriente Médio.[20] 91 | A idade média é de 41,4 anos, com 0,97 homens por mulher. 99% da população (acima de 15 anos) é alfabetizada. A taxa de fecundidade é de 1,73 filhos por mulher (est. 2013). Apesar da baixa taxa de natalidade, a população continua a crescer a uma taxa média anual de 0,23%.[21] 92 | As línguas dinamarquesa, feroesa e groenlandesa são as línguas oficiais da Dinamarca continental, das Ilhas Faroé e da Gronelândia, respectivamente. O alemão é uma língua minoritária oficial no antigo condado sul de Jutlândia, perto da fronteira com a Alemanha. O dinamarquês é falado em todo o reino e é a língua nacional da Dinamarca. O inglês e alemão são as línguas estrangeiras mais faladas.[22] 93 | A Dinamarca é frequentemente classificada como o país mais feliz do mundo em estudos internacionais sobre níveis de felicidade entre a população.[23][24][25][26][27] 94 | De acordo com censos de 2009, 90,5% da população da Dinamarca era descentente da etnia dinamarquesa. O restante eram imigrantes — ou descententes de imigrantes — vindos da Bósnia e Herzegovina, países vizinhos e Ásia. A população da Dinamarca é de 5475791 pessoas, com uma densidade demográfica de 129,16 habitantes por km².[18] Grande parte da população encontra-se no litoral, principalmente em áreas próximas a capital Copenhague. 95 | O dinamarquês é falado em todo o país, embora um pequeno grupo perto da fronteira alemã também fale alemão. 96 | De acordo com as estatísticas oficiais de janeiro de 2014, 78,4% da população da Dinamarca é composta por membros da Igreja Nacional da Dinamarca, a denominação religiosa oficialmente estabelecida, que é luterana na tradição.[28][29] Isto representa uma queda de 0,7% em relação ao ano anterior e 1,3% inferior em relação a dois anos antes. Apesar dos valores elevados de adesão, apenas 3% da população religiosa afirmam frequentar regularmente os cultos dominicais.[30][31] 97 | A Constituição do país estabelece que os membros da família real devem ser seguidores da Igreja Nacional da Dinamarca, que é a igreja do estado, embora o restante da população seja livre para aderir a outras religiões.[29][32] Em 1682, o Estado concedeu o reconhecimento limitado a três grupos religiosos dissidentes da Igreja Estabelecida: o catolicismo romano, a Igreja Reformada e o Judaísmo,[32] embora a conversão desses grupos vista pela Igreja da Dinamarca permaneceu ilegal inicialmente. Até os anos 1970, o Estado reconhecia formalmente as "sociedades religiosas" por intermédio de um decreto real. Atualmente, os grupos religiosos não precisam de reconhecimento oficial do governo na Dinamarca, podendo ser concedido a estes o direito de realizar casamentos e outras cerimônias, sem este reconhecimento.[32] 98 | Os muçulmanos na Dinamarca compõem cerca de 3% da população e formam a segunda maior comunidade religiosa do país, além da maior minoria religiosa.[33][34] Desde 2009, há dezenove comunidades muçulmanas reconhecidas na Dinamarca.[34] De acordo com o Ministério das Relações Exteriores dinamarquês, outros grupos religiosos correspondem a menos de 1% da população individualmente e cerca de 2%, quando considerados em conjunto.[35] 99 | Conforme uma pesquisa feita pelo Eurobarómetro, em 2010, 28% dos cidadãos dinamarqueses entrevistados responderam que "acreditam que existe um Deus", 47% responderam que "acreditam que existe algum tipo de espírito ou força vital" e 24% responderam que "não acreditam que haja qualquer tipo de espírito, Deus ou força vital". Outra pesquisa, realizada em 2009, constatou que 25% dos dinamarqueses acreditam que Jesus Cristo é o filho de Deus, e 18% acreditam que ele é o salvador do mundo.[36][37] 100 | Em 1849, o Reino da Dinamarca passou a ser uma monarquia constitucional com a adaptação de uma nova constituição. O monarca (A Rainha Margarida II da Dinamarca) é efectivamente o chefe de estado, a sua função é essencialmente de representação máxima do Estado e do povo. É, à semelhança da generalidade dos chefes de estado das monarquias do norte da Europa, titular de um papel cerimonial que representa a tradição e cultura enraizada do respectivo povo. O poder executivo é exercido pelos ministros, sendo o primeiro-ministro um primeiro entre iguais (primus inter pares). Os tribunais da Dinamarca são funcional e administrativamente independentes dos poderes executivo e legislativo. A atual monarca da Dinamarca é a Rainha Margarida II. Seu filho, o Príncipe Frederico é o herdeiro do trono. 101 | O Folketing é o parlamento nacional, o órgão legislativo supremo do reino. Em teoria, ele tem a autoridade legislativa suprema de acordo com a doutrina da soberania parlamentar. O parlamento é capaz de legislar sobre qualquer assunto e não é vinculado às decisões de seus antecessores. Entretanto questões sobre soberania têm sido antecipadas por causa da entrada da Dinamarca na União Europeia. Parlamento é composto por 175 membros eleitos por maioria proporcional, além de dois membros da Groenlândia e das Ilhas Faroé cada.[38] As eleições parlamentares são realizadas pelo menos a cada quatro anos, mas está dentro dos poderes do primeiro-ministro pedir ao monarca para chamar para uma eleição antes do prazo decorrido. Em um voto de confiança, o parlamento pode forçar um único ministro ou todo o governo a demitir-se.[39] 102 | O sistema político dinamarquês tradicionalmente tem gerado coligações A maioria dos governos dinamarqueses do pós-guerra foram coalizões minoritárias governando com o apoio dos partidos não-governamentais.[40] 103 | A política externa dinamarquesa é baseada na sua identidade como uma nação soberana na Europa. Como tal, o seu principal foco na política externa é em suas relações com outras nações como uma nação independente. A Dinamarca há muito tempo tem boas relações com outras nações. O país esteve envolvido na coordenação da ajuda ocidental para os países bálticos (Estônia,[41] Letônia e Lituânia).[42] 104 | Após a Segunda Guerra Mundial, a Dinamarca terminou com a sua política de neutralidade de mais de duzentos anos. A Dinamarca tem sido um membro da Organização do Tratado do Atlântico Norte (OTAN) desde a sua fundação, em 1949, e a participação na aliança militar continua a ser altamente popular.[43] Houve vários confrontos sérios entre os Estados Unidos e a Dinamarca sobre a política de segurança entre 1982 e 1988, quando uma maioria parlamentar alternativa forçou o governo a adotar posições nacionais específicas sobre as questões nucleares e de controle de armas. Com o fim da Guerra Fria, no entanto, a Dinamarca tem apoiado os objetivos da política dos Estados Unidos dentro da OTAN.[43] 105 | As forças armadas da Dinamarca são conhecidos como a "Defesa Dinamarquesa". Durante tempos de paz, o Ministério da Defesa emprega cerca de 33 mil soldados no total. Os principais ramos militares empregam quase 27 mil: 15.460 no Exército Real Dinamarquês, 5.300 na Marinha Real Dinamarquesa e 6050 na Força Aérea Real Dinamarquesa (todos, incluindo recrutas). 106 | A Agência de Gerenciamento de Emergências Dinamarquês (Beredskabsstyrelsen) emprega 2.000 (incluindo recrutas) e cerca de quatro mil estão em serviços não-específicos de cada ramo militar, como o Comando de Defesa Dinamarquês. Além disso em torno de 55.000 servem como voluntários no Guarda Caseira Real Dinamarquesa (Hjemmeværnet). 107 | O país é um forte defensor da manutenção da paz internacional. A Defesa Dinamarquesa tem em torno de 1400[44] soldados em missões internacionais, não incluindo as contribuições permanentes da OTAN. As três maiores contribuições estão no Afeganistão (ISAF), Kosovo (KFOR) e no Líbano (UNIFIL). Entre 2003 e 2007, havia cerca de 450 soldados dinamarqueses no Iraque.[45] 108 | A Dinamarca divide-se em cinco regiões (regioner, singular region, em dinamarquês) nas quais se distribuem 98 municípios. As regiões foram criadas em 1 de janeiro de 2007 como parte da Reforma Municipal Dinamarquesa de 2007 e substituem os treze antigos condados (amter). Na mesma data, os 270 municípios foram consolidados em 98.[carecede fontes?] 109 | A Groenlândia e as ilhas Faroé integram o Reino da Dinamarca, mas gozam de autonomia e uma grande medida de auto-governo; ambas possuem dois membros, cada, no parlamento dinamarquês.[carecede fontes?] 110 | Segundo dados de 2011, a Dinamarca figura como a 31ª maior economia do mundo se considerarmos seu Produto Interno Bruto (PIB) nominal (estimado nesse mesmo ano em US$349,1 bilhões/mil milhões)[46], enquanto seu PIB medido de acordo com sua Paridade de Poder de Compra foi considerado o 52º maior do mundo em 2011 (calculado nesse período em US$208,8 bilhões/mil milhões)[47]. 111 | A economia da Dinamarca é dependente dos intercâmbios comerciais com os outros países e da capacidade de influência nas conjunturas internacionais e nos fatores econômicos. O valor das exportações e importações compõe cerca de um 1/3 do PIB do país. Grande parte dos intercâmbios comerciais são feitos com demais países da União Europeia. O sócio de comércio bilateral mais importante é a Alemanha, tendo uma boa interação económica com a Suécia e a Grã-Bretanha. Fora da UE, a Dinamarca mantém relações comerciais com a Noruega, os Estados Unidos e o Japão.[carecede fontes?] 112 | Desde a Segunda Guerra Mundial, as exportações dinamarquesas têm-se expandido. A venda de produtos industriais ultrapassou a exportação agrária, ocupando um lugar cada vez mais importantes dentro da pauta de exportações da Dinamarca. No final dos anos 90, a exportação industrial constituiu aproximadamente 80% do valor total das vendas ao exterior, enquanto as vendas de produtos agrários representaram 11%. As áreas de ferramentas e maquinaria formam 26% do total das exportações industriais, os produtos químicos representam 12% e os produtos da indústria agroalimentícia, incluída carne de conserva, atendem a 4%. O forte crescimento económico da Dinamarca entre as décadas de 1960 e 1980 não refletiu num bom desempenho nos anos 90, o que influenciou numa ligeira queda na exportação na área de serviços.[carecede fontes?] 113 | Na pauta de importações, os principais produtos comprados são matérias-primas e produtos semi-fabricados, incluindo a energia. A compra de maquinaria e equipamentos de produção para indústria e comércio representa 67% do valor total de importações. Nos anos 80, a importação de energia caiu significativamente, devido ao aumento da produção interna de petróleo. Os outros 33% de importações são de produtos de consumo, especificamente automóveis. 114 | A Dinamarca tem fontes consideráveis ​​de petróleo e gás natural no Mar do Norte e classificada como o 32ª maior exportador líquido de petróleo bruto do mundo[48] e estava produzindo 259.980 barris de petróleo por dia em 2009.[49] A maioria electricidade é produzida a partir de carvão, mas, no final de 2015, 42% da demanda de eletricidade é fornecida através de turbinas eólicas.[50] 115 | A Dinamarca é um líder de longa data em energia eólica e, em maio de 2011, a Dinamarca investia 3,1% do seu produto interno bruto em tecnologias de eficiência energética e em fontes de energias renováveis (limpas), algo em torno de 6,5 bilhões de euros.[51] A Dinamarca é interligada por linhas de transmissão de energia elétrica para outros países europeus. Em 6 de setembro de 2012, o país construiu a maior turbina eólica do mundo e vai acrescentar mais quatro nos próximos quatro anos. 116 | O setor elétrico Dinamarca integrou fontes de energia como a energia eólica para a rede nacional. Dinamarca agora pretende se concentrar em sistemas de baterias inteligentes (V2G) e em veículos elétricos no setor dos transportes.[52][53] 117 | A Dinamarca, como seus vizinhos escandinavos, tem sido historicamente uma das culturas mais socialmente progressistas do mundo. Em 1969, o país foi o primeiro a legalizar a pornografia[54] e, em 2012, a Dinamarca substituiu suas leis de "parceria registrada", que tinha sido o primeiro país a introduzir, em 1989,[55][56] o casamento igualitário.[57][58] A modéstia, a pontualidade, mas acima de tudo, a igualdade, são aspectos importantes da maneira de viver dos dinamarqueses.[59] 118 | As descobertas astronômicas de Tycho Brahe (1546-1601), a articulação negligenciada de Ludwig A. Colding (1815-1888) do princípio da conservação de energia e as contribuições para a física atômica de Niels Bohr (1885-1962) indicam a gama de realizações científicas dinamarquesas. Os contos de fadas de Hans Christian Andersen (1805-1875), os ensaios filosóficos de Søren Kierkegaard (1813-1855), os contos de Karen Blixen (pseudônimo Isak Dinesen, (1885-1962) , as peças de Ludvig Holberg (1684 -1754) e a densa poesia aforística de Piet Hein (1905-1996), ganharam reconhecimento internacional, assim como as sinfonias de Carl Nielsen (1865-1931). A partir de meados da década de 1990, os filmes dinamarqueses têm atraído a atenção internacional , especialmente aqueles associados com Dogma 95 como os de Lars von Trier. 119 | O dinamarquês mais conhecido é provavelmente Hans Christian Andersen, um escritor famoso principalmente devido aos seus contos de fadas, como As Roupas Novas do Imperador e O Patinho Feio. 120 | O esporte mais popular na Dinamarca é o futebol.[60] Vela e outros desportos aquáticos são populares, assim como golfe e desportos indoor, como badmínton, handebol, e várias formas de ginástica. O piloto de maior sucesso de todos os tempos nas 24 Horas de Le Mans, com 8 primeiros lugares, é Tom Kristensen. 121 | Outros desportistas notáveis da Dinamarca são: o artilheiro de futebol americano da National Football League Morten Andersen, os ciclistas Bjarne Riis, Rolf Sørensen, e Michael Rasmussen, os jogadores de badminton Peter Gade e Camilla Martin, o mesatenista Michael Maze, os jogadores de futebol Michael Laudrup, Brian Laudrup e Peter Schmeichel. A tenista Caroline Wozniacki, que já foi a número 1 do ranking da WTA. A Dinamarca é também a casa e o local de nascimento do ex-campeão mundial da WBA e WBC, Mikkel Kessler, e da golfista Thomas Bjorn, que ganhou vários eventos internacionais.[carecede fontes?] 122 | Em 1992, a Seleção dinamarquesa de futebol venceu o Campeonato Europeu. Em Copas do Mundo, a melhor colocação da Dinamarca foram as quartas-de-final de 1998. 123 | O baterista da banda Metallica, Lars Ulrich é dinamarquês e filho do tenista e também dinamarquês Torben Ulrich. 124 | República Turca de Chipre do Norte • Transnístria • Abecásia • Ossétia do Sul • Alto Carabaque 125 | A DKW é uma marca histórica de automóveis e de motocicletas, associada em todo o mundo a motores com ciclo de dois tempos, que teve seus automóveis fabricados sob licença no Brasil pela Vemag entre 1956 e 1967. Aqui, a marca ficou conhecida popularmente como “DKV”. A DKW foi uma fábrica alemã fundada em 1916 pelo engenheiro dinamarquês Jørgen Skafte Rasmussen que, em 1932, com a Grande Depressão, se uniu por sugestão do Saxon National Bank a outras três fábricas, a Audi, a Horch e a Wanderer, para formar a Auto Union. Em 1938, o grupo ganhou a participação da NSU. Em 1957, a Auto Union foi adquirida pela Daimler-Benz e, em 1964, pela Volkswagen, passando então a ser denominada Audi. 126 | A sigla DKW significava inicialmente "Dampf-Kraft-Wagen", carro de força a vapor, já que os primeiros produtos oferecidos pela empresa foram pequenos motores a vapor. Com o tempo, a empresa passou a oferecer motores a gasolina com ciclo de dois tempos, mas a denominação DKW foi mantida. Esses primeiros modelos de motor de dois tempos foram adaptados para brinquedos e foram denominados "Des Knaben Wunsch", o desejo do menino. Outra versão foi adaptada para motocicletas e denominada "Das Kleine Wunder", a pequena maravilha. Esta última denominação permaneceu ao longo do tempo e apareceu em vários textos promocionais da marca em todo o mundo. 127 | A DKW utilizava como símbolo o brasão mostrado na figura à esquerda, com um tom vibrante de verde como cor associada à marca. A Auto Union adotou como símbolo quatro argolas entrelaçadas, representando as quatro empresas que se uniram no início dos anos 30. A argola mais à esquerda representa a Audi, a segunda representa a DKW, a terceira a Horch e a última, mais a direita, representa a Wanderer. Quando a DKW passou a fazer parte da Auto Union, seus símbolos sempre apareceram juntos. 128 | Atualmente, milhares de saudosistas por todo o mundo colecionam motocicletas e automóveis fabricados pela DKW, que foi um marco na história automobilística. 129 | 130 | 131 | Em 1916, o engenheiro dinamarquês Jørgen Skafte Rasmussen funda a "Dampf Kraft Wagen" (ou carro de força a vapor), DKW, na Saxônia, na Alemanha. 132 | Em 1928 a DKW já era a maior fabricante de motocicletas do mundo. 133 | Em 1932, o Saxon National Bank sugere que a Audi, a DKW, a Horch e a Wanderer se unam para formar a Auto Union. 134 | Em 1938, a Auto Union ganha a participação da NSU. 135 | Em 1939 é testado um prototipo do F9, com motor de dois tempos com três cilindros, que seria produzido apenas após a Segunda Grande Guerra e equiparia grande parte dos automóveis da DKW até o final de suas atividades. 136 | A partir de 1939 e até o final da Segunda Grande Guerra, a Auto Union se torna o maior fornecedor de autopeças e de automóveis para as forças armadas da Alemanha, valendo-se inclusive de mão-de-obra escrava fornecida pela SS. 137 | Em 1949, é retomada a produção na Alemanha Ocidental com o lançamento da van F800 Schnellaster e do sedã F89. Este sedã tinha a carroceria do F9 e o motor de dois tempos com dois cilindros do F8, ambos anteriores à Segunda Grande Guerra. 138 | Em 1953, é lançado o F91, com motor de três cilindros. 139 | Em 1956, são lançados o F93 e o Munga. Nesse ano, a Vemag começa a montar no Brasil uma camioneta derivada da família F91. 140 | Em 1957, é lançado o cupê esportivo 2+2 1000Sp, produzido até 1964 e que teve uma versão conversível a partir de 1962. Nesse ano, a Auto Union é adquirida pela Daimler-Benz. 141 | Em 1958, a Vemag começa a fabricar no Brasil sedãs e camionetas derivadas da família F94 e um jipe baseado no Munga, com crescente índice de nacionalização. 142 | Em 1964, no Brasil, é lançado o Fissore, um sedã duas portas com carroceria projetada pela Carrocerias Fissore, da Itália, sobre mecânica e chassis DKW. 143 | Em 1964 é lançado o último DKW, o F102. Nesse mesmo ano, a Auto Union é adquirida pela Volkswagen, passando então a ser denominada Audi. A Volkswagen pretende encerrar a produção de motores de dois tempos, comercialmente antiquados, e incentivar a produção de motores de quatro tempos. 144 | Em 1965, a Auto Union passa a ser definitivamente denominada como Audi e o F102, o último modelo em produção da DKW, passa a ser comercializado com o símbolo da Audi, enquanto não estiver disponível o novo carro da marca, agora com motor de quatro tempos. 145 | Em 1966, é encerrada a produção do F102 e a fabricação de automóveis com motores de dois tempos. A Audi passa a comercializar automóveis derivados do F102 com motores de quatro tempos, dando início a uma bem sucedida linha de automóveis de alto desempenho. 146 | Em 1967, no Brasil, é produzido o Puma DKW, com carroceria em fiberglass e mecânica e chassis DKW-Vemag. O Puma DKW foi o primeiro dos Pumas e é uma versão esteticamente melhorada do Malzoni GT. Nesse mesmo ano, no Brasil, a Volkswagen adquire a Vemag e no final do ano encerra a fabricação de automóveis com motores de dois tempos. 147 | DKW Júnior de 1966. 148 | Um DKW F5 Meisterklasse Limousine de 1935, equipado com motor de 700cc. 149 | O DKW F102 era tudo que se poderia esperar na década de 60. 150 | Um IFA F8 conversível. 151 | Antes da Segunda Grande Guerra, a DKW foi a maior fabricante de motocicletas e de bicicletas motorizadas, durante os anos 20 e 30. Também encontrou algum sucesso em corridas utilizando motores com aspiração forçada. Após a guerra, produziu os modelos RT125, RT175, RT250 e RT350. 152 | A DKW deve uma boa parte de sua imagem à sua produção de motocicletas e aos seus modelos da RT125 anterior e posterior à guerra. Como reparação aos danos provocados pela participação dos alemães na guerra, os desenhos da RT125 foram passados à Harley-Davidson, nos Estados Unidos, e à BSA, na Inglaterra. A primeira produziu a Hummer, enquanto os ingleses lançaram a Bantam. Os modelos produzidos pela IFA e pela MZ permaneceram em produção até os anos 90, quando finalmente foram encerradas as linhas de produção dos motores de dois tempos. Outros fabricantes também copiaram a concepção da DKW, que aparece em vários outros modelos de motocicletas com motores de dois tempos dos anos 50, como produtos da japonesa Yamaha, da russa Voskhod e da polonesa WSK. 153 | A DKW produziu automóveis em duas fases distintas, antes e depois da Segunda Grande Guerra. 154 | Os modelos mais conhecidos produzidos antes da Segunda Grande Guerra foram os modelos F1 a F8. Esses modelos tinham motores frontais, daí o F da denominação, com tração frontal e dois cilindros, com colocação dos cilindros transversalmente ao eixo das rodas. Os motores tinham 600cc ou 700cc e potências entre 18hp e 20hp. Esses modelos também apresentavam como inovação o sistema Dynastar, no qual o gerador, que também atuava como motor de partida, era colocado solidário ao eixo de manivelas do motor. 155 | A DKW também produziu modelos menos conhecidos, conhecidos como Schwebeklasse e Sonderklasse, com motor de dois tempos com tração traseira e quatro cilindros com disposição em V. Inicialmente esses motores tinham 1.000cc, passando depois para 1.100cc, e contavam com dois cilindros extras para injeção forçada de ar no cilindros. 156 | Quanto às denominações em alemão, Schwebeklasse significa "categoria lenta" e Sonderklasse significa "categoria especial". Havia também os Meisterklasse, cujo nome significa algo como "categoria de mestre". 157 | Em 1939 foi testado o primeiro prototipo do motor de dois tempos da DKW com três cilindros. Esse motor seria produzido apenas após a Segunda Grande Guerra, tanto na Alemanha Oriental quanto na Alemanha Ocidental pela própria DKW. Esse motor também foi utilizado pela Saab como ponto de partida para o desenvolvimento do motor de dois tempos utilizado em seus automóveis. 158 | Antes das atividades civis serem encerradas e a Auto Union dedicar-se exclusivamente ao fornecimento de automóveis e de autopeças para as forças armadas da Alemanha na Segunda Grande Guerra, chegou a ser testado um protótipo do que seria o F9. Esse prototipo era diferente de seus antecessores e era equipado com o novo motor de três cilindros, que tinha 900cc e 30hp e impulsionava o prototipo a cerca de 115km/h. 159 | Depois da guerra, houve produção na Alemanha Oriental, onde estavam originalmente instaladas as fábricas, e na Alemanha Ocidental. onde ocorreu uma reestruturação da empresa. 160 | As instalações físicas da DKW e da Auto Union estavam localizados no território que coube ao controle soviético após a Segunda Grande Guerra e que passou a ser denominado como Alemanha Oriental. O acervo tecnológico da DKW foi utilizado para a formação da Industrieverband Fahrzeugbau, ou Associação Industrial para Construção de Veículos. A IFA produziu ao longo de sua existência bicicletas, motocicletas, veículos comerciais leves, automóveis, vans e caminhões pesados e iniciou suas atividades produzindo o F8 e o F9. 161 | A foto à direita mostra um F9 produzido pela IFA e fica evidente a sua semelhança com o F89, produzido com a carroceria do prototipo do F9 anterior à guerra, e com seus descendentes, o F91, o F93, o F94 e o AU1000 e o AU1000S. 162 | A Auto Union estava originalmente sediada na Saxônia, que após o final da guerra passou a fazer parte da Alemanha Oriental. Desse modo, foi necessário algum tempo para que a empresa se reestruturasse. A empresa então foi registrada novamente na Alemanha Ocidental, em 1949, inicialmente para fornecer autopeças e em seguida para fabricar a motocicleta RT125 e a van F800 Schnellaster. Essa van utilizava o mesmo motor do último modelo do F8 produzido antes da Segunda Grande Guerra. 163 | O primeiro automóvel de passageiros foi o F89, idealizado com o motor de dois tempos, com dois cilindros, do F8 e a carroceria do prototipo do F9. O F89 foi produzido até 1953, quando foi lançado o F91, equipado com o motor de dois tempos e três cilindros. Entre 1953 e 1956 e entre 1956 e 1959 foram produzidos respectivamente o F91 e o F93, equipados com motor de dois tempos, três cilindros, com 900cc e respectivamente 34hp e 38hp. Esse modelo de motor tinha sistema de ignição com três bobinas e três velas, uma para cada cilindro, e sistema de refrigeração por convecção livre, sem bomba de água, assistido por um ventilador montado sobre a tampa do bloco do motor. Esse mesmo modelo foi utilizado nos automóveis brasileiros produzidos pela Vemag, com capacidades de 900cc e posteriormente de 1.000cc. 164 | Em 1959 entrou em produção o F94, também denominado como Auto Union 1000, ou AU1000. Esse automóvel tinha motor de dois tempos, com três cilindros, com 1.000cc, com as opções de 44hp ou a versao S com 50hp. Durante a produção desse modelo a fábrica da DKW passou de Dusseldorf para Ingolstadt, onde a Audi já tinha sua linha de produção. Desde 1957, os modelos da DKW ofereciam como opcional um sistema de embreagem semi automático denominado como Saxomat e em seu tempo constituíam os únicos modelos de pequeno porte com essa possibilidade. O último modelo do AU1000, o AU1000S, também oferecia freios a disco como opcional. 165 | Uma perua derivada da família F91 foi montada no Brasil pela Vemag no final dos anos 50 e, entre 1958 e 1967, um sedã e uma perua derivados da família F94 foram fabricados pela Vemag com crescente índice de nacionalização. No último ano, quando a Volkswagen já era proprietária da empresa, juntamente com uma reestilização efetuada apenas no Brasil, os automóveis tinham praticamente a totalidade de suas peças produzidas no país. 166 | O AU1000S, um cupê de duas portas, tinha párabrisas maior com desenho envolvente, diferente do AU1000. As extremidades inferiores do párabrisas se projetavam para trás, alterando o desenho das portas e o tamanho das ventarolas, e permitindo melhor visibilidade ao motorista. 167 | Entre 1956 e 1958 foi produzido um automóvel esportivo com carroceria de fiberglass sobre chassis e mecânica da DKW denominado inicialmente como Solitude. Foram produzidos entre 230 e 240 unidades no total e atualmente os exemplares remanescentes são muito disputados por colecionadores. Pelo sucesso obtido e pelos recordes estabelecidos principalmente na pista de Monza, na Itália, acabou ficando conhecido como DKW Monza. Entre os recordes estão o de desenvolver 140,961km/h de velocidade média ao longo de 48 horas, o de desenvolver 139,459km/h de velocidade média ao longo de 72 horas e o de percorrer 10.000km com a velocidade média de 139,453km/h. 168 | Entre 1957 e 1964 foi produzido um automóvel com forte apelo esportivo e baseado no Ford Thunderbird americano, o AU1000Sp, inicialmente como cupê e a partir de 1962 também como conversível. O AU1000Sp tinha o mesmo motor e os opcionais do AU1000, além de um sistema de lubrificação automática do motor de dois tempos. Esse sistema, denominado como Lubrimat e que também foi incluído nos automóveis brasileiros produzidos pela Vemag a partir de 1964, era acionado através de uma correia diretamente pelo eixo de manivelas do motor e injetava óleo lubrificante na medida adequada no carburador. 169 | Uma família de automóveis de passeio que fez muito sucesso foi a do DKW Júnior e de seu sucessor, o DKW F12, produzida entre 1959 e 1965. O modelo básico, o Júnior, foi comercializado entre 1959 e 1961. Depois veio o Júnior de Luxe, com alguns melhoramentos, comercializado entre 1961 e 1963. O F11 e o F12 eram um pouco maiores e eram equipados com um motor com maior potência e foram produzidos entre 1963 e 1965, acompanhados a partir de 1964 pelo F12 Roadster. Esses modelos foram produzidos em quantidade razoável, vendidos dentro e fora da Alemanha e chegaram a ser montados em uma fábrica da Irlanda. Essa montadora foi a única fábrica da DKW fora da Alemanha na Europa. 170 | O AU1000 foi substituído pelo F102, em 1964, que foi produzido até 1966 e foi o último automóvel produzido pela DKW e o último com motor de dois tempos. O F102 tinha uma concepção diferente dos modelos anteriores e era bastante refinado em uma época em que o motor de dois tempos tinha sua popularidade em decadência. O modelo vendeu menos do que o esperado e serviu como ponto de partida para a transição concretizada pela Volkswagen, a nova proprietária da empresa. A DKW saiu de cena e a Auto Union se transformou em Audi, e o F102 recebeu um motor de quatro tempos e se transformou no prototipo F103, que deu origem aos modernos automóveis da Audi. 171 | Os motores de dois tempos apresentam bom potencial esportivo e vários carros da DKW equipados com o motor de três cilindros venceram muitos rallies e grandes prêmios durante os anos 50 e o início dos anos 60. No Brasil, durante muitos anos nessa época a equipe de corridas da Vemag, que fabricava sob licença os automóveis da DKW, era a equipe a ser vencida. 172 | A van F800 foi produzida entre 1949 e 1962 e tinha várias inovações para sua época, além do motor frontal e da tração frontal, mas tinha um motor realmente muito fraco para o que ela se propunha. No início, o motor tinha 700cc e apenas 20hp e, em 1952, passou para 22hp. Depois, em 1955, recebeu o motor de 900cc com três cilindros, que rendia 32hp. 173 | O Munga, um veículo para todo tipo de terreno, foi produzido entre outubro de 1956 e dezembro de 1968. O nome Munga, aliás, vem da expressão em alemão "Mehrzweck UNiversal Geländewagen mit Allradantrieb", que significa "veículo de uso universal para todo tipo de terreno com tração nas quatro rodas". O Munga fez muito sucesso em aplicações militares, tendo sido adotado por várias forças armadas da OTAN, a Organização Tratado do Atlântico Norte, em aplicações civis, em atividades no campo e em florestas. Foram produzidas cerca de 46.750 unidades. 174 | Alguns modelos DKW foram produzidos pela Vemag no Brasil. Inicialmente, a Vemag montava uma camioneta derivada da F91 e, em seguida, passou a fabricar sob licença um sedã e uma camioneta baseados na família F94. O sedã era denominado inicialmente como "Grande DKW-Vemag" e a partir de 1961 passou a ser conhecido como Belcar. A camioneta era conhecida como "Camioneta DKW-Vemag" ou "Perua DKW-Vemag" e a partir de 1961 passou a ser conhecida como Vemaguet, que teve duas versões populares: a Caiçara e a Pracinha, financiadas pela Caixa Econômica Federal. Também foi lançado no Brasil uma versão do jipe Munga, denominado como Candango, e um cupê idealizado pelos Fissore, da Itália. O motor de dois tempos e três cilindros em linha da DKW também foi utilizado na produção dos modelos esportivos Malzoni e Puma GT DKW e no protótipo Carcará. 175 | Os modelos da DKW, foram efetivamente o segundo automóvel de fabricação brasileira (o primeiro, fora lançado em 5 de setembro de 1956, o Romi Isetta), o DKW-Vemag obteve, no entanto, o primeiro certificado de aprovação de produção expedido pelo GEIA, o Grupo Executivo da Indústria Automobilística, órgão executivo criado pelo governo de Juscelino Kubitschek para estimular a produção automobilística no Brasil. Este certificado garantiu à Vemag incentivos para a produção dos veículos da marca no País e o fato do Romi Isetta ter apenas uma porta foi ponto decisivo para sua permissão. 176 | 177 | Donkey Kong Country 2: Diddy's Kong Quest (Super Donkey Kong 2 no Japão) é o segundo jogo da série Donkey Kong Country. Foi desenvolvido pela Rare e publicado pela Nintendo em novembro de 1995 para o Super Nintendo Entertainment System. O jogo segue o mesmo estilo plataforma com elementos de aventura de seu antecessor. A história de Diddy's Kong Quest gira em torno de seu novo protagonista, Diddy Kong, e de sua namorada, Dixie Kong, a nova personagem na série, eles devem resgatar Donkey Kong depois que ele é sequestrado por King K. Rool. 178 | O jogo se passa em "Crocodile Isle", em que há oito mundos de ambientes diferentes, num total de 47 fases. Diddy's Kong Quest utiliza a mesma tecnologia gráfica de Donkey Kong Country, que apresenta o uso de imagens pré-renderizadas em modelos 3D.[3] O jogo ganhou destaque pelos seus gráficos, jogabilidade e trilha sonora, vendendo mais de 5 milhões de cópias, e se tornando o quinto jogo mais vendido no SNES.[4] 179 | Diddy's Kong Quest também foi relançado para o Game Boy Advance em 2004. Além disso, o jogo foi disponibilizado para download no Virtual Console do Wii em 2007,[5] e para o Virtual Console do Wii U em 2015.[6] Ele foi seguido por uma sequência, Donkey Kong Country 3: Dixie Kong's Double Trouble! em 1996. 180 | 181 | 182 | Diddy's Kong Quest é um jogo de plataforma side-scrolling 2D no qual o jogador controla tanto Diddy Kong ou Dixie Kong através de 47 níveis variáveis com oito mundos diferentes. O jogo apresenta uma grande quantidade de inimigos, que incluem répteis terrestres chamados Kremlings, ratos, abelhas e abutres. Inimigos em fases subaquáticas incluem baiacus, enguias e tubarões. Cada mundo culmina em uma luta contra um chefe, que é necessário para ser derrotado a fim de progredir para o próximo mundo. Semelhante à Donkey Kong Country, os personagens-jogadores podem neutralizar a maioria dos inimigos saltando sobre suas cabeças, dando cambalhotas, ou jogando barris. Quando atingido por um inimigo, o personagem ativo deixa a tela, assim, o controle irá mudar imediatamente para o outro personagem. O jogador pode recuperar o seu parceiro com barris marcados com "DK" durante o jogo. Se os dois personagens morrem, o jogador perderá uma vida e vai reiniciar a partir do último checkpoint, que vêm na forma de um barril pintado com estrelas. Se o jogador perde todas as suas vidas, o jogo terminará.[3][7] 183 | O jogador também pode pegar o outro personagem e jogá-lo em qualquer direção para alcançar áreas mais elevadas. Além disso, o jogo apresenta "amigos animais", que retorna de seu jogo antecessor. Animais jogáveis ​​incluem Squitter a aranha, Glimmer o tamboril, Rambi o rinoceronte, Rattly a cobra cascavel, Clapper a foca, Enguarde o peixe-espada e Squawks o papagaio.[5] Estes animais possuem habilidades únicas que o jogador pode utilizar, como a nova capacidade de Rambi e Enguarde para carregar ataques contra os inimigos, a capacidade de Squawks' de voo, e a capacidade de Rattly para saltar em alturas extremas.[8][9] 184 | A jogabilidade em si é um pouco mais variada do que a do jogo anterior, que conta com várias inovações e mais controles: 185 | Após derrotar o Rei K. Rool, os Kongs voltam para as Ilhas DK com a reserva de bananas de Donkey Kong. Logo depois DK estava relaxando, quando uma aeronave chamada Flying Krock se aproxima da ilha. K. Rool (agora como Capitão K. Rool) envia os Kremlings para a ilha e seqüestra Donkey Kong. Ele só irá libertá-lo se a família Kong entregar a reserva de bananas de Donkey Kong para ele.[9] 186 | Então, Diddy e sua namorada (que não é sua prima) Dixie, encontram uma nota afirmando o sequestro de Donkey Kong por Capitão K. Rool no convés de um navio pirata, os dois partem juntos para a Crocodile Isle (o lar dos Kremlings) para resgatá-lo, mas para isso Diddy e Dixie precisam atravessar uma série de lugares da ilha, incluindo o Gangplank Galleon, o Crocodile Caudron, a Krazy Kremland e muitos outros. Durante a jornada, Diddy e Dixie são ajudados por uma variedade de animais para salvar Donkey Kong e derrotar K. Rool.[9][5] 187 | É o navio de K. Rool que encalhou na praia da Crocodile Isle. O mundo apresenta 5 Fases e seu chefe é Krow. Dificuldade: 1.5 188 | É uma área vulcânica que tem minas de diamante e ouro, além de um barco no centro partido ao meio. O mundo apresenta 5 fases e seu chefe é Kleever. Dificuldade: 2.5 189 | É uma espécie de cais, ele tem pântanos, um navio partido ao meio e um espinheiro. O mundo apresenta 6 fases e seu chefe é Kudgel. Dificuldade: 3.0 190 | É o ninho das Zingers, onde tem colmeias, o parque de diversões dos Kremlings, além de contar com um pântano e um espinheiro. O mundo apresenta 6 fases e seu chefe é King Zing. Dificuldade: 4.0 191 | É uma floresta assombrada que contém uma biblioteca e uma colmeia. O mundo apresenta 5 fases e seu chefe é o fantasma de Krow. Dificuldade: 5.5 192 | É o castelo de K. Rool, onde apresenta geleiras e uma mina de esmeraldas. O mundo apresenta 6 fases e não tem chefe. Dificuldade: 6.0 193 | É a aeronave de K. Rool, onde ainda tem um espinheiro. O mundo apresenta apenas 1 fase e seu chefe é K. Rool. Dificuldade: 8.0 194 | É uma área onde apresenta algumas selvas, além de ter uma geleira, um vulcão e o núcleo da ilha. O mundo apresenta 5 fases e seu chefe é K. Rool. Dificuldade: 8.0 195 | Krow: É um abutre gigante que os Kongs o derrotam com 4 ataques de ovos que o chefe joga na arena. 196 | Kleever: É uma espada possuída que ataca os Kongs com bolas de fogo ou tentando esfaqueá-los. Os Kongs o derrotam com 6 ataques de balas de canhão que caem na arena de um lado pro outro, sendo necessários ganchos para pegar as bolas de canhão. 197 | Kudgel: É o irmão de Klubba e um Kremling que ataca os Kongs causando pequenos terremotos na arena ao pular de um lado para o outro. Os Kongs o derrotam com 6 ataques de barris TNT que caem na arena. 198 | King Zing: É um rei das Zingers. Os Kongs se transformam em Squawks para derrotá-lo, onde que primeiramente os Kongs atacam o ferrão dele 6 vezes, depois o chefe se transforma numa abelha vermelha rodeada por abelhas amarelas, ao matar as amarelas, King Zing, se transforma numa abelha comum, onde que com mais 3 ataques de Squawks ele morre. 199 | Kreepy Krow: Krow volta dos mortos sendo um fantasma, onde ataca os Kongs com abutres fantasmas e vivos e com ovos também. Os kongs o derrotam com 3 ataques de barris que caem na arena quando um abutre vivo é morto. 200 | Kaptain K. Rool (Round 1): A primeira batalha contra K. Rool é em sua aeronave, onde ele usa sua arma para atacar os Kongs com bolas espinhosas e bolas de fumaça com 3 cores distintas que causam diferentes reações aos Kongs (azul paralisa, vermelho deixa lento e roxo inverte o controle) quando atingidos. Os Kongs o derrotam com 9 ataques de balas de canhão que surgem na arena por influência do chefe ou não. 201 | Kaptain K. Rool (Round 2): A segunda batalha contra K. Rool é um pouco mais simples que a anterior, onde após desviar de uma sequência de ataques, os Kongs o derrotam com apenas um 1 ataque com uma bala de canhão que sai da arma do chefe. 202 | A trilha sonora (com base na vertente da Trance Music) é considerada pelos críticos como uma das trilhas sonoras mais belas criadas para o SNES. A trilha sonora foi composta inteiramente por David Wise e foi lançada no mesmo ano do lançamento do jogo em 1 de outubro de 1995.[11] 203 | Além disso, a trilha sonora do jogo foi o foco de uma colaboração OverClocked ReMix intitulado Serious Monkey Business.[12] A faixa final, "Donkey Kong Rescued", foi remixada pelo próprio David Wise, com Grant Kirkhope na guitarra elétrica e Robin Beanland no trompete.[13] Tal como acontece com o seu antecessor, as músicas foram produzidas pelo chip SPC700 do SNES para o jogo com um som semelhante ao sintetizador Korg Wavestation.[14] As músicas de Diddy's Kong Quest foram muito bem recebida criticamente, com elogios de críticos as chamando de "hipnotizantes" e "um dos pontos mais altos do jogo".[10] 204 | O jogo foi recebido com elogios da crítica. Detendo uma pontuação total de 90% na GameRankings, o sétimo jogo melhor ranqueado do SNES;[15] ao passo que o relançamento no Virtual Console e a versão Game Boy Advance têm ambas uma pontuação de 80% na GameRankings e Metacritic, respectivamente.[16][17] Diddy's Kong Quest vendeu 5,15 milhões de cópias no mundo todo pelo SNES; o número total de cópias vendidas no Japão foi de 2,20 milhões e 2,10 milhões nos Estados Unidos.[18] Foi também o segundo jogo mais vendido de 1995,[19] após Yoshi's Island,[20] e o quinto jogo mais vendido no SNES.[4] 205 | Além da trilha sonora, os gráficos também foram um dos aspectos elogiados do jogo. Aaron Kosydar da allgame pensou que os gráficos de Diddy Kong Quest foram superiores do que a de seu antecessor, afirmando que o jogo "parece tão legal quanto ele desempenha" e também disse que "a qualidade que a Rare colocou nele o torna um verdadeiro clássico".[21] Frank Provo da GameSpot definiu os gráficos como "mais detalhados", apesar de admitir que parecia estilisticamente semelhante ao primeiro jogo.[22] Em uma revisão retrospectiva, Mark Birnbuam da IGN afirmou que, embora o original "vangloriou-se de alguns dos mais belos gráficos" no momento do SNES, Diddy's Kong Quest ofereceu uma experiência superior devido ao seu detalhe, animação suave e variação das paletas de cores.[23] Os usuários do site GameFAQs elegeram como o 9º melhor jogo de SNES.[24] 206 | Donkey Kong Country: Tropical Freeze é um jogo eletrônico de plataforma side-scrolling desenvolvido pela Retro Studios que foi publicado pela Nintendo para o Wii U em 21 de fevereiro de 2014 nos Estados Unidos. O décimo-sétimo jogo da série, e o primeiro em alta definição, segue o jogo de 2010 Donkey Kong Country Returns, também pela Retro Studios. Foi anunciado durante a pre-conferência E3 2013 da Nintendo em 11 de junho de 2013. 207 | A historia do jogo foca num grupo de criaturas viking, como morsas, corujas e pinguins, que invadem a Donkey Kong Island,[2] forçando o protagonista Donkey Kong lutar contra eles com a ajuda de seus amigos Diddy Kong e Dixie Kong, a última fazendo sua primeira aparição na série desde Donkey Kong Country 2: Diddy's Kong Quest, lançado em 1995. 208 | Como nos jogos anteriores da série, será possível duas pessoas jogarem cooperativamente. Tropical Freeze também marca o retorno das fases aquáticas para a franquia, uma característica não presente em Returns.[3] O compositor original da série David Wise retornará para gravar a trilha sonora. 209 | 210 | 211 | Um grupo de animais Vikings antropomórficos invade a ilha DK, perseguindo seus habitantes até outra ilha distante. Junto de seus parceiros Diddy Kong e Dixie Kong, Donkey Kong e Cranky Kong viaja através de cinco ilhas, lutando contra vários inimigos para recuperar seu lar. Passando por 63 fases no jogo. 212 | O jogo foi anunciado durante o Nintendo Direct da apresentação de 11 de junho de 2013 da Nintendo na E3 2013. O jogo está sendo produzido por Kensuke Tanabe que, já tendo trabalhado anteriormente em Super Mario Bros. 2, incorporou alguns elementos desse jogo. Foi anunciado que David Wise, o compositor dos três primeiros Donkey Kong Country, assim como de alguns spin-off titles como Diddy Kong Racing, retornará para compor a trilha de Tropical Freeze.[4] 213 | 214 | O F103 é um automóvel alemão produzido pela Audi em 1965 com base no DKW F102, logo após a aquisição da Auto Union pela Volkswagen. A denominação F103 designa também os seus derivados, produzidos entre 1965 e 1972, que se constituíram nos primeiros veículos da nova fase da Audi. 215 | O Audi F103 foi produzido com a carroceria de um DKW F102 e um motor de quatro tempos, recebendo posteriormente outras adaptações. O motor de quatro tempos inicialmente empregado já vinha sendo desenvolvido anteriormente à aquisição pela Volkswagen, quando a Auto Union estava sob controle acionário da Daimler-Benz. 216 | O F102 sucedeu a família F94 e AU1000 e era equipado com motor de dois tempos. O mercado de automóveis dos anos 1960 conferiu a esse motor uma imagem de algo antigo e ultrapassado, condenando-o a vendas aquém do esperado. Mesmo assim, ele continuou ainda sendo comercializado, mesmo já sem a marca DKW, enquanto o desenvolvimento do F103 não estava concluído. 217 | O corpo do F103 teve o cofre do motor alongado, para alojar um motor de quatro tempos, tipicamente maior que os motores de dois tempos com volume de cilindrada equivalente, e recebeu revisões estéticas em seu interior e em seu exterior. Desde o início, a Volkswagen tinha intenção de produzir sob a marca Audi automóveis luxuosos e de desempenho superior. 218 | Logo surgiram, como seus derivados, os modelos comerciais Audi 72, Audi 80, Audi Super 90, Audi 60 e Audi 75, do final dos anos 1960 e início dos 70. O primeiro foi o próprio F103, inicialmente designado apenas como Audi e depois como Audi 72, em referência à potência de seu motor. 219 | A denominação continuou dizendo respeito à potência do motor empregado. O Audi 72 foi produzido já em 1965, seguido do Audi 80, em 1966, ambos produzidos até 1969. Eles foram substituídos pelo Audi 75, produzido de 1969 a 1972. Também foram produzidos o Audi 60, de 1968 a 1972, e o Audi Super 90, de 1966 a 1972. Todos tiveram versões com duas e com quatro portas e, com exceção do Audi Super 90, também tiveram versões station wagon. 220 | 221 | 222 | DK Jamz é o nome da trilha sonora original do Donkey Kong Country. Foi composta por Robin Beanland, Eveline Fischer e David Wise. Foi muito popular, e a qualidade da música é considerada por muitos como sendo alguns dos melhores do seu gênero. A trilha sonora foi, além disso, totalmente reorganizada na OverClocked ReMix, com o nome do álbum Kong in Concert, em homenagem aos artistas originais. A trilha sonora é conhecida por sua música atmosférica, misturando sons naturais do ambiente com acompanhamento melódico e percussivo proeminente. Possui uma grande variedade de estilos musicais diferentes que tentam ser evocativa dos ambientes que aparecem. Isso varia de acordo com as áreas diferentes do jogo, e inclui músicas de níveis fixados na inspirado selvas da África, cavernas, recifes oceânicos, paisagens geladas e fábricas industriais. 223 | Todas as faixas compostas por David Wise, exceto onde indicado. 224 | A RT125 é uma motocicleta alemã com motor de dois tempos produzida pela DKW antes e depois da Segunda Grande Guerra, nos anos 30 (em Zschopau) e nos anos 50 e 60 (em Ingolstadt). A RT125 também foi produzida pela IFA e pela MZ anos anos 50 e no início dos anos 60. A denominação RT vem do alemão "Reichstyp", que significa "modelo nacional". 225 | Na verdade, a RT125 é provavelmente a motocicleta mais copiada em todo o mundo. Após a guerra, como reparação, os soviéticos levaram desenhos, ferramentas e mesmo pessoal técnico para a MMZ produzir uma versão. Os desenhos também foram levados pelos ingleses para a produção da BSA "Bantam" e pelos americanos para o lançamento da Harley-Davidson "Hummer". Mais tarde, a Yamaha também se baseou na RT125 para lançar a YA-1. 226 | No início do século XXI, a MZ ainda se utilizou da concepção da RT125 para lançar uma motocicleta com motor de quatro tempos inteiramente nova. 227 | 228 | O Belcar é um automóvel brasileiro produzido pela Vemag, sob licença da fábrica alemã DKW, entre 1958 e 1967. Foram produzidas 51072 unidades.[1] Era derivado do sedã DKW F94, e, em seu tempo, foi saudado por oferecer boa estabilidade, conforto interno e espaço para até seis passageiros, além de uma mecânica bastante robusta e apropriada às precárias estradas brasileiras. 229 | Inicialmente era conhecido simplesmente como "Grande DKW-Vemag", recebendo a denominação de Belcar, de "beautiful car", apenas em 1961. Foi lançado em 1958, juntamente com a reestilização da "perua DKW-Vemag", alcançando ambos pouco mais de 50% de nacionalização em peso, na esteira das atividades do GEIA, o Grupo Executivo da Indústria Automobilística. Quando sua produção foi encerrada, tinha praticamente todos os seus componentes nacionalizados. 230 | 231 | 232 | Em 1958 a Vemag lança o "Grande DKW-Vemag" e a "Perua DKW-Vemag", derivados do DKW F-94 alemão e produzidos sob licença da Auto Union. Ambos são equipados com um motor de 900cm³. Em 1959, passa a ser equipado com o motor de 1000cm³. 233 | Em 1961 o "Grande DKW-Vemag" passa a ser denominado de Belcar, de "beautiful car". Além disso, foram retirados os frisos da tampa do portamalas e o párachoques e as calotas são redesenhados. 234 | É o primeiro automóvel a passar por um teste pela Revista Quatro Rodas. 235 | Em 1964 as rodas passam a ter doze janelas de ventilação para os freios, que perduraria até o final da produção. 236 | Em 1964, a segunda série de produção, denominada 1001, passou a ter portas com abertura no sentido tradicional, a favor da segurança, e as maçanetas foram redesenhadas. 237 | Em 1965 foi lançada a série Rio, em homenagem aos quatrocentos anos de fundação da cidade do Rio de Janeiro. O Belcar e a Vemaguet passam a ser equipados com o Lubrimat, lançado meses antes juntamente com o Fissore. 238 | Em 1967 o Belcar passa por modificações estéticas que lhe conferem quatro faróis e uma grade que os envolve de um lado ao outro na dianteira. A instalação e os equipamentos elétricos passam a operar em 12V. Em setembro é lançada a série S, que recebe o motor S, do Fissore, e em dezembro sua produção é encerrada. 239 | As características apresentadas correspondem ao Belcar 67,[2] aproximadamente as mesmas para todas as unidades equipadas com o motor de 1000cc. Os modelos até 1966 tinham instalação e equipamentos elétricos em 6V. As características são idênticas, com exceção de dimensões e pesos e de desempenho, às características da Vemaguet. As informações de desempenho foram obtidas principalmente com os testes realizados pela Revista Quatro Rodas.[3][4][5][6] 240 | DKW-Vemag com ciclo de dois tempos, resfriado a água por termo-sifão (sem bomba de água), três cilindros em linha com 74mm de diâmetro e 76mm de curso, volume de 981cm³ (1000cc), taxa de compressão de 7,1:1 a 7,3:1, potência de 50CV SAE a 4500rpm, torque de 8,5kg.m a 2250rpm, com sistema Lubrimat para lubrificação automática. 241 | Carburador descendente Brosol 40 CIB, com gicleur principal 132,5, gicleur de combustível de marcha lenta g-50, corretor de ar da marcha lenta 1,7, corretor de ar principal 110, gicleur de combustível do afogador 160, corretor de ar do afogador 3,5, venturi 32, emulsionador 46, agulha da bóia 1,5 e parafuso de ajuste da mistura da marcha aberto 3 a 4 meias voltas. 242 | Umas das características desse motor, é possuir 7 peças móveis, sendo elas, 3 pistões, 3 bielas e 1 virabrequim e não possuir bomba d'água(utiliza sifão). 243 | Caixa de câmbio com 4 marchas a frente, todas sincronizadas, uma a ré com roda livre desligável por cabo abaixo do painel. 244 | Embreagem tipo monodisco a seco, com embreagem semi-automática Saxomat opcional. Folga da embreagem na borboleta de ajuste de aproximadamente 4mm, não aplicável para a embreagem semi-automática Saxomat. 245 | O Belcar S e Vemaguet S (Última série de 1967) usavam o mesmo motor fornecido para o Fissore; ciclo de dois tempos, resfriado a água por termo-sifão (sem bomba de água), três cilindros em linha com 74mm de diâmetro e 76mm de curso, volume de 981cm³ (1000cc), taxa de compressão de 8:1, potência (declarada) de 60CV SAE a 4500rpm, torque de 9kg.m a 2500rpm, com sistema Lubrimat para lubrificação automática. Apesar da controvérsia sobre a real potência (e até sobre a real existência) do "motor S", O Belcar S testado pela Revista Quatro Rodas apresentou desempenho nitidamente superior ao normal. 246 | Chassis construído em perfis de caixa fechada. 247 | Suspensão dianteira com mola transversal com fitas de polietileno, acima, e braços de suspensão triangulares, abaixo; 248 | suspensão traseira em eixo flutuante da Auto Union. 249 | Molas transversais com fitas de polietileno em conjunto com dois amortecedores telescópicos em ação dupla, uma na dianteira e outra na traseira. 250 | Direção com pinhão e cremalheira, com barra de união de duas partes; 251 | relação da direção 19,2:1; 252 | diâmetro de viragem 11,5m. 253 | Rodas 4½J x 15; pneus 560 x 15 com quatro lonas, com ombro de segurança; 254 | pressões dos pneus dianteiros 19 a 21 psi, pressões dos pneus traseiros 19 a 24 psi. 255 | Distância entre eixos 2,45 m; 256 | bitola dianteira 1,29 m; bitola traseira, 1,35 m. 257 | Convergência (carregado) 0 a 2mm. 258 | Freio de pé hidráulico, efetivo nas quatro rodas, sendo Duplex nas rodas dianteiras e Simplex nas rodas traseiras. Freio de mão mecânico, efetivo nas rodas traseiras. 259 | Diâmetros dos tambores de freio dianteiros e traseiros 230mm; 260 | largura das lonas de freio dianteiros e traseiros 50mm; 261 | superfície ativa do freio de pé 715cm²; 262 | superfície ativa do freio de mão 339cm². 263 | Óleo de motor SAE 20, API Serviço MS-DG, para o motor; óleo de motor SAE 40 ou 30, para o purificador de ar; SAE 90 mineral puro, para a caixa de câmbio; graxa fluida para engrenagens, para a direção; graxa lubrificante multi uso, para o chassis, a articulação de tração e os rolamentos; graxa Bosch FT 1-V 4 ou outra graxa resistente ao calor, para o eixo excêntrico dos platinados. 264 | Comprimento, 4,402m; 265 | largura, 1,695m; 266 | altura, 1,488m; altura livre do solo, 20,7cm. 267 | Peso, vazio, 940kg; 268 | carga útil, 410kg. 269 | Peso total admissível no eixo dianteiro, 620kg; 270 | peso total admissível no eixo traseiro, 730kg; 271 | peso total geral admissível, 1350kg. 272 | O tanque de combustível tem capacidade para aproximadamente 45 litros, incluindo cerca de 8 litros para reserva. O reservatório do Lubrimat tem capacidade para aproximadamente 3,5 litros. A caixa de câmbio tem capacidade para 2,5 litros, sendo 2,25 litros no reabastecimento. O sistema de arrefecimento tem capacidade para cerca de 8 litros de água. 273 | Belcar até 1a Série de 1967 (Motor 1000): 274 | Velocidade máxima estimada, 120 a 125km/h. 275 | Aceleração de 0 a 80km/h em 17,1s; 276 | aceleração de 0 a 100km/h em 31,3s. 277 | Belcar S (Última série de 1967 com motor 1000S de 60 HP): 278 | Velocidade Máxima 128km/h (melhor passagem a 133km/h) Aceleraçao de 0 a 100km/h em 25,5s. 279 | Consumo de combustível na cidade, média de 6,7km/l; consumo na estrada, média de 8,5km/l; 280 | consumo de 11,9km/l a velocidade constante de 40km/h em terceira marcha e de 12,9km/l em quarta marcha; 281 | consumo de 13,3km/l a velocidade constante de 60km/h; 282 | consumo de 11,8km/l a velocidade constante de 80km/h; 283 | consumo de 9,5km/l a velocidade constante de 100km/h; 284 | consumo de 8,5km/l a velocidade constante de 120km/h. 285 | Uma curiosidade muito grande, é que simplesmente rebaixando o cabeçote, o motor pode andar a mais de 130km/h. 286 | 287 | Donkey Kong Country 3: Dixie Kong's Double Trouble! é um jogo eletrônico de plataforma desenvolvido pela Rare e publicado pela Nintendo para o Super Nintendo Entertainment System em 1996 288 | 289 | 290 | Para comemorar a derrota de K. Rool no jogo anterior, Donkey e Diddy saem numa viagem para conseguir bananas em novas terras, como Northern Kremisfer por exemplo, mas demoram muito a voltar. Logo então, os Kongs descobrem que uma figura misteriosa de nome "Kaos" (que é na verdade um robô secretamente controlado por K. Rool, conhecido como Barão K. Roolenstein neste jogo) sequestrou os dois. Então Dixie (mais tarde seguida pelo seu primo Kiddy) vai rumo ao Kremisfério Norte para resgatá-los. Passando por 48 fases 291 | O mundo apresenta um rio com uma ilha no meio, ele tem duas pontes, duas serralherias e uma montanha de neve. O seu chefe é Belcha. Dificuldade: 1.5 292 | O mundo é cercado por sequóias (árvores gigantescas), além de ter uma serralheria depois de um rio. O seu chefe é Arich. Dificuldade: 2.5 293 | O mundo é uma área aquática, com três cachoeiras. O seu chefe é Squirt. Dificuldade: 3.5 294 | É uma área industrial cheia de fábricas, encanamentos e poluição, além de ter algumas sequóias que estão sendo serradas. O seu chefe é Kaos. Dificuldade: 4.5 295 | É uma área cercada pela neve, com uma cachoeira, uma fábrica e um desfiladeiro; o mundo faz referência à segunda maior montanha de neve do mundo de nome K2. O seu chefe é Bleak. Dificuldade: 5.0 296 | O mundo é uma área que tem desfiladeiros, cavernas e rios, além de ter dois teleféricos controlados pelos ursos Benny e Bjorn. O seu chefe é Barbos. Dificuldade: 6.0 297 | É uma área que tem um rio no centro, além de florestas, uma caverna, uma tempestade elétrica próxima de um lago, uma rede de encanamentos e o castelo de K. Rool. Os seus chefes são Kaos e K. Rool. Dificuldade: 7.5 298 | É um vulcão que está inativo no fundo do mar (até os Kongs o reativarem), ele tem uma floresta, desfiladeiros, uma caverna e algumas sequóias, além de ter um rio no centro. O seu chefe é K. Rool. Dificuldade: 8.0 299 | Belcha: É um barril enorme que ataca os Kongs os empurrando para um buraco. Os Kongs o derrotam quando o jogarem em um buraco que está atrás dele, fazendo com que ele coma besouros que ele mesmo joga pela boca. 300 | Arich: É uma aranha grande que ataca os Kongs com venenos que ela joga na arena. Os Kongs a derrotam com 4 ataques de barris que aparecem num galho acima do cenário. 301 | Squirt: É um chefe que fica preso numa cachoeira e ataca os Kongs com jatos de água que ele cospe de um lado para o outro. Os Kongs o derrotam usando a elefante Ellie com 6 ataques de jatos de água que ela solta pela tromba acertando os olhos do chefe. 302 | Kaos (Round 1): É um robô construído por K. Rool que sequestrou Donkey e Diddy. Na primeira batalha contra ele, o robô ataca os Kongs com uma chama que fica embaixo dele e com tiros de laser que saem da sua primeira cabeça. Os Kongs o derrotam com 3 ataques na sua primeira cabeça e com mais 3 ataques na segunda cabeça dele, mas os Kongs só destroem a primeira cabeça dele, pois após ser derrotado o chefe foge. 303 | Bleak: É um boneco de neve robótico que ataca os kongs com bolas de neve. Os Kongs o derrotam com 6 ataques de bolas de neve no botão piscando dele que fica pendurado em seu pescoço. 304 | Barbos: É um ouriço enorme que ataca os Kongs com ouriços menores, ferrões e espinhos. Os kongs o derrotam usando o Enguarde com 5 ataques quando o chefe estiver aberto. 305 | Kaos (Round 2): A segunda batalha contra o robô ocorre no castelo de K. Rool, ele ataca os Kongs com uma chama que fica embaixo dele. Os Kongs o derrotam com 2 ataques, sendo um na segunda cabeça e outro na terceira cabeça dele usando barris. 306 | Baron K. Rooleinstein (Round 1): A primeira batalha contra K. Rool acontece em seu castelo. Ele ataca os Kongs andando de um lado para o outro e também com raios elétricos. Os Kongs o derrotam com 9 ataques (usando barris que caem na arena quando os Kongs puxam alavancas que ficam em cima do cenário) na mochila que fica nas costas do chefe. 307 | Baron K. Rooleinstein (Round 2): A segunda batalha contra K. Rool é em seu submarino. Ele ataca os kongs com raios elétricos e disparos de bolas de fogo. Os kongs o derrotam com 10 ataques (usando barris metálicos que aparecem na arena) na mochila que fica nas costas do chefe. 308 | Ao contrário do jogo anterior, que possuía um tema de piratas, este apresenta um tema que mistura ficção científica com a jogabilidade do primeiro jogo da série. Porém, ao contrário de DKC1, DKC3 apresenta cenários de jogo mais baseados nos das regiões do norte da Europa, tendo inclusive a presença de ursos que na verdade são irmãos. Espalhadas pelas fases, há "Moedas de Urso", que desempenham as mesmas funções das Moedas de Banana do jogo anterior. As Moedas de Bônus desempenham a função das Kremkoins de DKC2, mas desta vez as Moedas DK possuem função diferente: pegue todas para poder habilitar um veículo novo no aluguel de barcos de Funky. 309 | A trilha sonora foi composta por Eveline Fischer e David Wise[1] 310 | Curiosidade: os nomes dos ursos Benny e Björn, são os mesmos dos integrantes da banda sueca ABBA 311 | 312 | O Candango é um automóvel brasileiro produzido pela Vemag, sob licença da fábrica alemã DKW, entre 1958 e 1963. Foram produzidas 5607 unidades,[1] mas algumas fontes falam em 7868 unidades [2] ou em 4400 unidades.[3] 313 | O nome foi dado em homenagem aos operários que participaram da construção de Brasília, inaugurada em 1960, chamados de candangos. 314 | Era derivado do off road alemão Munga, que fora produzido entre outubro de 1956 e dezembro de 1968. O nome Munga foi criado a partir da expressão em alemão: "Mehrzweck UNiversal Geländewagen mit Allradantrieb", que significa "automóvel de uso universal para qualquer terreno com tração nas quatro rodas". 315 | O Munga foi vendido para a polícia alemã e para as forças armadas de vários países integrantes da OTAN, a Organização do Tratado do Atlântico Norte, além de ter feito sucesso em aplicações ligadas à agricultura e a todo tipo de atividade que exigisse movimentação em estradas de baixa qualidade. O mesmo sucesso foi esperado no Brasil, mas a produção do Candango foi prematuramente encerrada devido principalmente à falta de interesse por parte dos militares. Ao total, foram produzidos cerca de 46.750 exemplares do Munga. 316 | 317 | 318 | Em outubro de 1956 é iniciada a produção do DKW Munga na fábrica da Auto Union em Ingolstadt, na Alemanha. 319 | Em 1957 o Munga é oficialmente lançado no 38th International Motor Show, em Frankfurt. 320 | Em 1958 são apresentados o sedã (o "Grande DKW Vemag"), a camioneta (a "perua DKW"), derivados do F-94 alemão, e o jipe Candango, derivado do jipe alemão Munga, com grande índice de nacionalização. Esses modelos eram equipados com o motor de 900cm³. A partir de 1959 passam a ser equipados com o motor de 1000cm³. 321 | Em 1961 o "Grande DKW-Vemag" e a "Perua DKW-Vemag" passam a ser denominados como Belcar e Vemaguet. 322 | Em 1963 a produção do Candango é encerrada, principalmente porque os militares não demonstraram interesse em sua aquisição. 323 | Em setembro de 1967, a Volkswagen do Brasil adquire a Vemag prometendo não encerrar a produção de seus veículos. Em dezembro, entretanto, seguindo uma tendência mundial de retirada do motor dois tempos do mercado, a linha de produção é encerrada. 324 | Em dezembro de 1968 é encerrada a produção do Munga, após o fornecimento de cerca de 46.750 unidades. 325 | O Candango, uma cópia sob licença do Munga 4 alemão, que aparece na foto à esquerda, foi comercializado no Brasil com poucas variações basicamente em dois modelos: o Candango 4 e o Candango 2. A diferença está na quantidade de rodas tracionadas pelo motor. O Candango 4 tinha tração nas quatro rodas, enquanto o Candango 2 tinha tração apenas nas duas rodas dianteiras. 326 | Como o Candango 4 tinha tração permanente e apresentava um desempenho inferior ao dos seus concorrentes no asfalto, a Vemag teve que acompanhar as necessidades de seus compradores e oferecer também um modelo com tração em apenas duas rodas. Muitos proprietários que utilizavam o Candango predominantemente no asfalto, retiravam o eixo cardã para deixar o utilitário "mais solto".[2] 327 | No Candango 4 o freio de estacionamento está localizado ao lado direito do motorista, entre os dois bancos dianteiros, e aciona um pequeno tambor na entrada do diferencial traseiro, imobilizando portanto o eixo cardã. No Candango 2 o freio de estacionamento foi deslocado para o lado esquerdo do motorista e aciona, por meio de cabos, os freios traseiros.[2] O "Candango 2", possuía um desempenho bastante satisfatório no asfalto, comportando-se como um carro de passeio. (contribuição Allan Wagner Breder). 328 | Houve ainda uma terceira versão do Candango, o Praiano, muito menos numerosa em termos de produção, que na verdade era uma simplificação do Candango 2. Era um modelo para uso na cidade e no litoral em atividades de lazer, fornecida apenas na cor azul claro, com rodas com aro 15, sem portas enm capota.[2] 329 | A Vemag não produzia a capota de aço e entregava o Candango com uma capota de lona. As capotas de aço eram produzidas em diferentes modelos por empresas independentes.[4] 330 | O para-brisa do carro era rebatível e o sistema de ignição era feito por meio de chave e interruptor no painel como os outros carros da marca. 331 | 332 | Donkey Kong Country Returns é um jogo eletrônico de plataforma side-scrolling desenvolvido pela Retro Studios e publicado pela pela Nintendo para o console Wii, em 21 de novembro de 2010 na América do Norte e em dezembro do mesmo no ano no Japão e na Europa. Trata-se da série tradicional, sendo que é o primeiro jogo para console de mesa desde Jungle Beat e também o primeiro Donkey Kong Country a não envolver a Rare durante o desenvolvimento. A versão para Nintendo 3DS foi lançada com efeito 3D e algumas novidades a mais no dia 24/05/13. 333 | 334 | 335 | Jogadores assumem o controle de Donkey Kong e Diddy Kong, com muitos elementos tradicionais da série Donkey Kong Country, incluindo os níveis de carts de mina, balançando de cipós a vinhas, e coletando bananas. Há também níveis com o personagens e ambientes que aparecem em primeiro plano como silhuetas, gerando diversas novas mecânicas de jogo. O modo multijogador permite aos jogadores controlar simultaneamente um caráter cada. Ambos os personagens têm dois hits cada. Se um jogador morre no modo de dois jogadores, ele pode ser trazido de volta ao acertar um Barril DK que flutua em vista, semelhante ao New Super Mario Bros Wii. Para evitar problemas decorrentes de diferenças nas habilidades do jogador, Diddy pode subir em Donkey e assumir um papel mais passivo, enquanto seu jetpack pode ser usado para flutuar por um curto período de tempo. Como em Beat Jungle, Donkey pode dar o ground pound (soco de chão) para derrotar os inimigos e descobrir itens secretos. O jogo tem dois esquemas de controle, com o sistema padrão usando o Wii Remote em conjunto com o Nunchuk, bem como uma clássica abordagem mais emprega o Wii Remote realizada para os lados, tanto dos que utilizam controle de movimento para a terra da libra Donkey movimento. Também há jogabilidade com Donkey/Diddy montando no Rambi, o rinoceronte. Além de elementos de série comum como desbloquear segredos e, também há um modo de ataque por tempo. 336 | Sob o controle da Tribo Tiki Tak, os animais na Ilha DK roubaram todas as bananas do estoque de Donkey Kong, forçando-o a recuperar o tesouro com a ajuda de Diddy Kong. Os diferentes tipos de Tikis enchem o papel dos antagonistas do presente, substituindo os Kremlings, que não aparecem no jogo. No jogo estão presentes Rambi e Squawk, como parceiros animais e a Loja de Cranky Kong está no jogo. Tendo num total 72 fases no jogo(81 fases na versão 3DS) 337 | O Desenvolvimento desse jogo começou em abril de 2008, logo após uma parte do pessoal-chave da Retro Studios ter deixado a empresa. Na época, Shigeru Miyamoto queria criar um novo jogo de Donkey Kong e, em seu pedido, o produtor Kensuke Tanabe recomendado Michael Kelbaugh, o CEO da Retro Studios, que já havia trabalhado na série DKC, enquanto ele estava empregado na Nintendo of America. Satoru Iwata frequentemente referido neste turno de eventos como "destino" em suas reuniões com Retro Studios, razão pela qual sugeriu que o projeto Kelbaugh codinome homófonas F8. 338 | Semelhante ao New Super Mario Bros., o jogo foi desenvolvido com a intenção de invocar sentimentos nostálgicos em que o jogador com o seu estilo de arte e som, ao tentar proporcionar-lhes experiências de jogo novo. Embora Miyamoto inicialmente se opôs à ideia, em simultâneo – jogo de dois jogadores foi executado, ao contrário da equipe do sistema de marca da série original. Primeiro revelado na E3 2010, o jogo emprega totalmente gráficos poligonais 3D, com três vezes a quantidade de texturas e polígonos que Metroid Prime 3: Corruption oferece. Ao longo de seis meses, dois terços do jogo de ferramentas e motor teve que ser reescrito pelos programadores, a animação e o sistema de colisão esteve sujeito à maior parte das mudanças. Retro Studios fez alguns experimentos com níveis subaquáticos, embora eles se sentiram muito lento e inconveniente para o jogo em geral e acabaram omitido. 339 | 340 | DK Bongos é o nome de um acessório para o Gamecube da Nintendo. Ele foi originalmente criado para o jogo Donkey Konga, para acompanhar as batidas das músicas. Os bongos também contam com um microfone que capta as palmas dos jogadores. No Japão eles sao chamados de tarukonga. 341 | Além da série Donkey Konga, os bongos foram usados em um jogo single-player do Donkey Kong, chamado Donkey Kong: Jungle Beat. Depois, um jogo de RPG e Pinball japonês também utilizou este acessório. 342 | O bongo também é compatível com o console da nova geração da Nintendo, o Wii. 343 | 344 | A Vemaguet é um automóvel brasileiro produzido pela Vemag, sob licença da fábrica alemã DKW, entre 1958 e 1967, que teve dois derivados populares, a Caiçara e a Pracinha, produzidos respectivamente entre 1963 e 1965 e entre 1965 e 1966. Ao total, foram produzidas 55692 unidades [1] (47769 unidades da Vemaguet, 1173 unidades da Caiçara e 6750 unidades da Pracinha). 345 | Inicialmente era conhecida apenas como "Camioneta DKW-Vemag" ou como "Perua DKW-Vemag", recebendo a denominação de Vemaguet apenas em 1961. Os modelos datados de 1956 a 1957, anteriores portanto à produção da Vemaguet, foram montados pela Vemag sob licença da DKW da Alemanha e eram derivados da perua DKW F91 Universal, enquanto os modelos da Vemaguet eram derivados da família F94. 346 | Até 1963 as portas dianteiras abriam ao contrário, da frente para trás, no sentido do conforto, conquistando o apelido de portas "suicidas" (conforme os americanos se referem a este tipo de abertura) ou portas "deixa ver" ou "DêChaVê" (como ficou comum no Brasil). Esta última denominação refere-se obviamente ao uso dessas portas por mulheres vestindo saias. No ano de 1964 as portas foram alteradas para a forma tradicional de abertura, de trás para frente, a favor da segurança. 347 | Seu motor de três cilindros em linha e dois tempos (precisa misturar óleo a gasolina), com volume de 1 litro, é dianteiro, assim como a tração. Uma bobina por cilindro, refrigeração liquida, partida elétrica. Motor que ao invés de usar buchas, casquilhos ou bronzinas em suas partes móveis, usa rolamentos, proporcionando assim uma durabilidade acima do comum para os carros da época. 348 | 349 | 350 | Em 19 de novembro de 1956, a Vemag coloca no mercado a camioneta DKW F-91 Universal, derivada do sedã alemão F-91 e de sua woodwagon, produzidos pela Auto Union. Essa camioneta, entretanto, era montada com componentes importados da Alemanha. Em 1957 essa camioneta sofreu pequenas alterações, como o desenho das portas traseiras, que abriam verticalmente para os lados e passaram a abrir horizontalmente em duas folhas, uma delas abrindo-se para cima e a outra, para baixo. 351 | No segundo semestre de 1958 é apresentada a camioneta (a "perua DKW"), derivada do F-94 alemão, com grande índice de nacionalização, equipada com o motor de 900cm³. No terceiro trimestre de 1959 o modelo passou a contar com motor com 1000cm³. Em 1960 as rodas passaram a ter oito furos, já que os freios são bastante exigidos, em parte pelo uso da roda-livre. 352 | Em 1961 a "Perua DKW-Vemag" passa a ser denominada como Vemaguet e ocorrem várias mudanças estéticas, como a forma dos párachoques e das calotas das rodas. Nesse ano, o sedã perdia os frisos da tampa do porta-malas, que a Vemaguet perderia apenas no ano seguinte. 353 | Em 1963 é lançada a camioneta Caiçara, uma versão popular da Vemaguet, com a porta traseira em peça única abrindo para a esquerda. A falta de interesse da Auto Union em participar mais ativamente no mercado brasileiro fez com que o emblema colocado no capô do motor dos produtos da Vemag fosse alterado para um emblema mais simples, um "DKW-Vemag" manuscrito. 354 | Em 1964 é lançado no mercado o DKW-Vemag Fissore e o Lubrimat. A Vemag contava com 4.013 funcionários e uma área de pouco mais de 87.000 m². Seus veículos já contavam com praticamente 100% de nacionalização. 355 | Nesse ano, a Vemaguet têm suas portas alteradas, elas passam a abrir do modo convencional e não mais ao contrário. O modo de abertura ao contrário lhes valeu o apelido de "portas suicidas". Esse modo de abertura também conferiu aos modelos a alcunha de "dechavê". 356 | Em 1965 é lançada a série Rio, em homenagem aos quatrocentos anos de fundação da cidade do Rio de Janeiro. Na Europa, a Volkswagen alemã adquire o controle acionário da Auto Union, transformando-a em Audi. No Brasil, estabelecem-se rumores sobre o fim da produção dos veículos DKW e o fechamento da fábrica. 357 | Em 1966 é encerrada a produção da Caiçara, substituída pela Pracinha, outra camioneta popular baseada na Vemaguet. A diferença principal da Caiçara e da Pracinha são as portas, que agora abrem no sentido usual. Nesse ano, o volante, que era "plano", passou a ser "cônico", e as alavancas de sinalização de direção e de acionamento dos faróis acompanharam essa mudança. 358 | Em setembro de 1967, a Volkswagen do Brasil adquire a Vemag prometendo não encerrar a produção de seus veículos. A partir desse mês sai das linhas de produção a Vemaguet S, equipada com o mesmo motor do Fissore. Em dezembro, entretanto, seguindo uma tendência mundial de retirada do motor dois tempos do mercado, a linha de produção é encerrada. Os anos seguintes testemunhariam uma forte desvalorização dos produtos da Vemag. 359 | As características técnicas são aproximadamente as mesmas para todos os modelos da Vemaguet (incluindo a Caiçara e a Pracinha), com diferenças basicamente quanto ao motor e quanto à instalação e equipamentos elétricos. As características são idênticas, com exceção de dimensões e pesos e de desempenho, às características do Belcar. 360 | Os modelos com motor de 1000cc tinham motor DKW-Vemag com ciclo de dois tempos, resfriado a água por termo-sifão (sem bomba de água), três cilindros em linha com 74mm de diâmetro e 76mm de curso, volume de 981cm³, taxa de compressão de 7,1:1 a 7,3:1, potência de 50CV SAE a 4500rpm, torque de 8,5kg.m a 2250rpm, com sistema Lubrimat para lubrificação automática.[2] 361 | Umas das características desse motor, é possuir apenas 7 peças móveis, sendo elas 3 pistões, 3 bielas e 1 virabrequim e não utilizar bomba d'água (utiliza sifão). 362 | Carburador descendente Brosol 40 CIB, com gicleur principal 132,5, gicleur de combustível de marcha lenta g-50, corretor de ar da marcha lenta 1,7, corretor de ar principal 110, gicleur de combustível do afogador 160, corretor de ar do afogador 3,5, venturi 32, emulsionador 46, agulha da bóia 1,5 e parafuso de ajuste da mistura da marcha aberto 3 a 4 meias voltas. 363 | Caixa de câmbio com 4 marchas a frente, todas sincronizadas, uma a ré com roda livre desligável por cabo abaixo do painel. Embreagem tipo monodisco a seco, com embreagem semi automática Saxomat opcional. Folga da embreagem na borboleta de ajuste de aproximadamente 4mm, não aplicável para a embreagem semi automática Saxomat. 364 | Chassis construído em perfis de caixa fechada. 365 | Suspensão dianteira com mola transversal com fitas de polietileno, acima, e braços de suspensão triangulares, abaixo; suspensão traseira em eixo flutuante da Auto Union. Molas transversais com fitas de polietileno em conjunto com dois amortecedores telescópicos em ação dupla, uma na dianteira e outra na traseira. 366 | Direção com pinhão e cremalheira, com barra de união de duas partes; relação da direção 19,2:1; diâmetro de viragem 11,5m. 367 | Rodas 4½J x 15; pneus 560 x 15 com quatro lonas, com ombro de segurança; pressões dos pneus dianteiros 19 a 21 psi, pressões dos pneus traseiros 19 a 24 psi. 368 | Distância entre eixos 2,45 m; bitola dianteira 1,29 m; bitola traseira, 1,35 m. 369 | Convergência (carregado) 0 a 2mm. 370 | Freio de pé hidráulico, efetivo nas quatro rodas, sendo Duplex nas rodas dianteiras e Simplex nas rodas traseiras. Freio de mão mecânico, efetivo nas rodas traseiras. Diâmetros dos tambores de freio dianteiros e traseiros 230mm; largura das lonas de freio dianteiros e traseiros 50mm; superfície ativa do freio de pé 715cm²; superfície ativa do freio de mão 339cm². 371 | Óleo de motor SAE 20, API Serviço MS-DG, para o motor; óleo de motor SAE 40 ou 30, para o purificador de ar; SAE 90 mineral puro, para a caixa de câmbio; graxa fluida para engrenagens, para a direção; graxa lubrificante multi uso, para o chassis, a articulação de tração e os rolamentos; graxa Bosch FT 1-V 4 ou outra graxa resistente ao calor, para o eixo excêntrico dos platinados. 372 | Bateria de 12V, 35Ah; alternador de 12V, 30/35A; motor de partida de 12V, 0,4CV; ignição Auto Union por bateria, ordem de ignição 1-2-3, avanço de ignição automático por contrapeso centrífugo, dependente das rotações do motor; folga dos platinados, 0,4mm; velas (1) Bosch M-145 T1 ou M-175 T1, (2) Beru 175, (3) Champion K11 ou KI13, ou (4) NGK A7; potência dos faróis, baixos 80W, altos 180W.[2] 373 | Comprimento, 4,248m; largura, 1,645m; 374 | altura, 1,495m; altura livre do solo, 20,7cm. 375 | Peso, vazio, 975kg; carga útil, 480kg. 376 | Peso total admissível no eixo dianteiro, 605kg; 377 | peso total admissível no eixo traseiro, 850kg; 378 | peso total geral admissível, 1455kg. 379 | O tanque de combustível tem capacidade para aproximadamente 45 litros, incluindo cerca de 8 litros para reserva. O reservatório do Lubrimat tem capacidade para aproximadamente 3,5 litros. A caixa de câmbio tem capacidade para 2,5 litros, sendo 2,25 litros no reabastecimento. O sistema de arrefecimento tem capacidade para cerca de 8 litros de água. 380 | Velocidade máxima estimada, 120 a 125km/h. 381 | Consumo de combustível médio estimado de 8,6km/l. 382 | Uma curiosidade muito grande, é que simplesmente rebaixando o cabeçote, o motor pode andar a mais de 130km/h. 383 | 384 | O DKW F102 é um automóvel alemão produzido pela DKW entre 1963 e 1966. O F102 foi o último modelo desenvolvido de modo independente pela DKW e foi o último modelo com motor de dois tempos produzido pela Auto Union. Chegou a ser comercializado com a marca Audi, após a compra da Auto Union pela Volkswagen. 385 | Quando a Volkswagen adquiriu a Auto Union, decidiu pelo encerramento da produção dos motores de dois tempos e, nesse sentido, substituiu o nome da empresa para Audi, pretendendo dar impulso à produção de automóveis com motores de quatro tempos. 386 | O F102 sucedeu a família F94 e AU1000, e foi utilizado como base para o desenvolvimento do Audi F103, que levaria aos modelos comerciais Audi 72, Audi 80, Audi Super 90, Audi 60 e Audi 75, do final dos anos 60 e início dos anos 70. 387 | O F102 representava o que se poderia esperar de mais moderno em termos de um automóvel com motor de dois tempos. Entretanto, o mercado de automóveis dos anos 60 conferiu a esse motor uma imagem de algo antigo e ultrapassado, condenando o F102 a vendas aquém do esperado. Mesmo assim, o F102 continuou sendo comercializado, mesmo já sem a marca DKW, até a entrada de seus sucessores da família Audi. 388 | Estima-se que pouco mais de 50.000 unidades [1] tenham sido produzidas. 389 | 390 | A Vemaguet é um automóvel brasileiro produzido pela Vemag, sob licença da fábrica alemã DKW, entre 1958 e 1967, que teve dois derivados populares, a Caiçara e a Pracinha, produzidos respectivamente entre 1963 e 1965 e entre 1965 e 1966. Ao total, foram produzidas 55692 unidades [1] (47769 unidades da Vemaguet, 1173 unidades da Caiçara e 6750 unidades da Pracinha). 391 | Inicialmente era conhecida apenas como "Camioneta DKW-Vemag" ou como "Perua DKW-Vemag", recebendo a denominação de Vemaguet apenas em 1961. Os modelos datados de 1956 a 1957, anteriores portanto à produção da Vemaguet, foram montados pela Vemag sob licença da DKW da Alemanha e eram derivados da perua DKW F91 Universal, enquanto os modelos da Vemaguet eram derivados da família F94. 392 | Até 1963 as portas dianteiras abriam ao contrário, da frente para trás, no sentido do conforto, conquistando o apelido de portas "suicidas" (conforme os americanos se referem a este tipo de abertura) ou portas "deixa ver" ou "DêChaVê" (como ficou comum no Brasil). Esta última denominação refere-se obviamente ao uso dessas portas por mulheres vestindo saias. No ano de 1964 as portas foram alteradas para a forma tradicional de abertura, de trás para frente, a favor da segurança. 393 | Seu motor de três cilindros em linha e dois tempos (precisa misturar óleo a gasolina), com volume de 1 litro, é dianteiro, assim como a tração. Uma bobina por cilindro, refrigeração liquida, partida elétrica. Motor que ao invés de usar buchas, casquilhos ou bronzinas em suas partes móveis, usa rolamentos, proporcionando assim uma durabilidade acima do comum para os carros da época. 394 | -------------------------------------------------------------------------------- /src/datareader.py: -------------------------------------------------------------------------------- 1 | import util 2 | import string 3 | from collections import Counter, deque 4 | import os 5 | import numpy as np 6 | from random import randint 7 | 8 | 9 | class DataReader(object): 10 | """ 11 | Class to read and manipulate text. 12 | """ 13 | def __init__(self, 14 | path=None, 15 | punctuation=False, 16 | write_vocab=True): 17 | """ 18 | :type path: string >>> path to text 19 | :type punction: boolean 20 | :type write_vocab: boolean 21 | """ 22 | if not path: 23 | path = util.get_path_basic_corpus() 24 | 25 | self.path = path 26 | self.punctuation = punctuation 27 | self.write_vocab = write_vocab 28 | 29 | @util.timeit() 30 | def read_text(self): 31 | """ 32 | Given a path to a txt file 'path' this function 33 | reads each line of the file and stores each word in a list words. 34 | 'punctuation' is a parameter to control if we want the punctuation 35 | of the text to be captured by this reading or not. 36 | 37 | :type path: string 38 | :type punctuation: boolean 39 | :rtype: list of strings 40 | """ 41 | 42 | dic_trans = {key: None for key in string.punctuation} 43 | translator = str.maketrans(dic_trans) 44 | words = [] 45 | with open(self.path) as inputfile: 46 | for line in inputfile: 47 | line = line.lower() 48 | if not self.punctuation: 49 | line = line.translate(translator) 50 | 51 | words.extend(line.strip().split()) 52 | return words 53 | 54 | @util.timeit([2]) 55 | def build_vocab(self, words, vocab_size): 56 | """ 57 | Given one list of words 'words' and 58 | one int 'vocab_size' this functions constructs 59 | one list of (word, frequency) named 'count' of size vocab_size 60 | (only the vocab_size - 1 most frequent words are here, the rest will 61 | be discarded as 'UNK'). This function returns also two dicts 62 | 'word2index' and 'index_to_word' to translate the words in 63 | indexes and vice-versa. 64 | The parameter 'write_vocab' controls if you want to creat a file 65 | 'vocab_1000.tsv' for vector vizualization in Tensorboard. 66 | 67 | :type words: list of strings 68 | :type vocab_size: int 69 | :type write: boolean 70 | :rtype count: list of tuples -> (str,int) 71 | :rtype word2index: dictionary 72 | :rtype index2word: dictionary 73 | """ 74 | count = [("UNK", 0)] 75 | most_frequent_words = Counter(words).most_common(vocab_size - 1) 76 | count.extend(most_frequent_words) 77 | word2index = {} 78 | index = 0 79 | 80 | if self.write_vocab: 81 | path = os.path.dirname(__file__) 82 | path = os.path.join(path, 'vocab_1000.tsv') 83 | f = open(path, "w") 84 | 85 | for word, _ in count: 86 | word2index[word] = index 87 | 88 | if index < 1000 and self.write_vocab: 89 | f.write(word + "\n") 90 | 91 | index += 1 92 | 93 | if self.write_vocab: 94 | f.close() 95 | 96 | index2word = dict(zip(word2index.values(), word2index.keys())) 97 | return count, word2index, index2word 98 | 99 | @util.timeit([1]) 100 | def process_data(self, vocab_size=50000): 101 | """ 102 | This function transform the text "words" into a list 103 | of numbers according to the dictionary word2index. 104 | It also modifies the frequency counter 'count' to 105 | count the frequency of the word 'UNK'. 106 | 107 | :type words: list of strings 108 | :type count: list of tuples -> (str,int) 109 | :type word2index: dictionary 110 | :type index_to_word: list of dictionary 111 | :rtype data: list of ints 112 | :rtype count: list of tuples -> (str,int) 113 | 114 | :rtype data: list of ints 115 | :rtype count: list of tuples -> (str,int) 116 | :rtype word2index: dictionary 117 | :rtype index2word: list of dictionary 118 | """ 119 | words = self.read_text() 120 | self.count, self.word2index, self.index2word = self.build_vocab(words, 121 | vocab_size) 122 | self.data = [] 123 | unk_count = 0 124 | for word in words: 125 | index = self.word2index.get(word, 0) 126 | 127 | if not index: 128 | unk_count += 1 129 | 130 | self.data.append(index) 131 | 132 | self.count[0] = ('UNK', unk_count) 133 | 134 | @util.timeit([1, 4]) 135 | def batch_generator(self, 136 | batch_size, 137 | num_skips, 138 | skip_window, 139 | data_index): 140 | 141 | """ 142 | This functions goes thought the processed text 'data' (starting at 143 | the point 'data_index') and at each step creates a reading window 144 | of size 2 * skip_window + 1. The word in the center of this 145 | window will be the center word and it is stored in the array 146 | 'batch'; this function also chooses at random one of the remaining 147 | words of the window and store it in the array 'labels'. The 148 | parameter num_skips controls how many times we will use the same center 149 | word. After all this processing the point in the text has changed, so 150 | this function also return the number 'data_index'. 151 | 152 | 153 | 154 | :type batch_size: int 155 | :type num_skips: int 156 | :type skip_window: int 157 | :type data_index: int 158 | :type data: list of ints 159 | :rtype data_index: int 160 | :rtype batch: np array -> [shape = (batch_size), dtype=np.int32] 161 | :rtype labels: np array -> [shape = (batch_size,1), dtype=np.int32] 162 | """ 163 | if batch_size % num_skips != 0: 164 | raise ValueError( 165 | """batch_size ({0}) should be a multiple of num_skips ({1})""".format(batch_size, num_skips)) 166 | if num_skips > 2 * skip_window: 167 | raise ValueError( 168 | """num_skips ({0}) should be less or equal than twice 169 | the value of skip_window ({1})""".format(num_skips, skip_window)) 170 | 171 | data_size = len(self.data) 172 | batch = np.ndarray(shape=(batch_size), dtype=np.int32) 173 | labels = np.ndarray(shape=(batch_size, 1), dtype=np.int32) 174 | span = 2 * skip_window + 1 175 | reading_window = deque(maxlen=span) 176 | for _ in range(span): 177 | reading_window.append(self.data[data_index]) 178 | data_index = (data_index + 1) % data_size 179 | for i in range(int(batch_size / num_skips)): 180 | target = skip_window 181 | targets_to_avoid = [skip_window] 182 | for j in range(num_skips): 183 | while target in targets_to_avoid: 184 | target = randint(0, span - 1) 185 | targets_to_avoid.append(target) 186 | center_word = reading_window[skip_window] 187 | context_word = reading_window[target] 188 | batch[i * num_skips + j] = center_word 189 | labels[i * num_skips + j, 0] = context_word 190 | reading_window.append(self.data[data_index]) 191 | data_index = (data_index + 1) % data_size 192 | 193 | return data_index, batch, labels 194 | -------------------------------------------------------------------------------- /src/download_wiki_pt.sh: -------------------------------------------------------------------------------- 1 | wget https://www.dropbox.com/s/6dw2255xieavz42/text8.zip?dl=0 2 | wget https://www.dropbox.com/s/b771vr92wogo0dn/pt96.zip?dl=0 3 | unzip pt96.zip?dl=0 4 | unzip text8.zip?dl=0 5 | mkdir corpora 6 | mv pt96.txt corpora/pt96.txt 7 | mv text8 corpora/text8.txt 8 | 9 | rm pt96.zip?dl=0 10 | rm text8.zip?dl=0 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/eval.py: -------------------------------------------------------------------------------- 1 | import pickle 2 | import util 3 | import argparse 4 | 5 | parser = argparse.ArgumentParser() 6 | 7 | parser.add_argument("-f", 8 | "--file", 9 | type=str, 10 | default='None', 11 | help="""pickle file to apply 12 | the evaluation function (default=None)""") 13 | 14 | parser.add_argument("-l", 15 | "--language", 16 | type=str, 17 | default='pt', 18 | help="""language selection: pt, en (default=pt)""") 19 | 20 | 21 | args = parser.parse_args() 22 | file_path = args.file 23 | with open(file_path, "rb") as s: 24 | d = pickle.load(s) 25 | pass 26 | 27 | 28 | embeddings = d['embeddings'] 29 | word2index = d['word2index'] 30 | index2word = d['index2word'] 31 | 32 | if args.language == 'pt': 33 | eval_path = "./evaluation/questions-words-ptbr.txt" 34 | else: 35 | eval_path = "./evaluation/questions-words.txt" 36 | score, report = util.score(index2word, 37 | word2index, 38 | embeddings, 39 | eval_path, 40 | verbose=True, 41 | raw=True) 42 | print() 43 | print("Score = {}".format(score)) 44 | for result in report: 45 | print(result) 46 | -------------------------------------------------------------------------------- /src/tests/datareader_test.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | import os 3 | import sys 4 | from random import randint 5 | import inspect 6 | currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) 7 | parentdir = os.path.dirname(currentdir) 8 | sys.path.insert(0, parentdir) 9 | 10 | from datareader import DataReader 11 | from util import get_time, get_path_basic_corpus, run_test 12 | 13 | 14 | class TestReading(unittest.TestCase): 15 | """ 16 | Class that test the reading function 17 | """ 18 | def test_read_text(self): 19 | """ 20 | Test to check if the read_text function 21 | return a list of words given a txt file. 22 | """ 23 | dr1 = DataReader() 24 | dr2 = DataReader(punctuation=True) 25 | words1 = dr1.read_text() 26 | words2 = dr2.read_text() 27 | print("\nReading time = {}\n".format(get_time(dr1.read_text))) 28 | 29 | self.assertTrue(len(words1) > 0) 30 | self.assertTrue(len(words2) > 0) 31 | self.assertEqual(words1[22], "system") 32 | self.assertEqual(words2[22], "system.") 33 | 34 | 35 | class TestData(unittest.TestCase): 36 | """ 37 | Class that test the build_vocab and get_data functions 38 | """ 39 | @classmethod 40 | def setUpClass(cls): 41 | cls.dr = DataReader() 42 | cls.words = cls.dr.read_text() 43 | 44 | def test_build_vocab(self): 45 | """ 46 | Test to check if the read_text function 47 | return a list of words given a txt file. 48 | """ 49 | vocab_size = 500 50 | _, dic, revert_dic = self.dr.build_vocab(self.words, vocab_size) 51 | print("\nBuilding vocab time = {}\n".format(get_time(self.dr.build_vocab, 52 | vocab_size))) 53 | self.assertTrue(len(dic) == vocab_size) 54 | self.assertTrue(len(revert_dic) == vocab_size) 55 | 56 | def test_batch_generator(self): 57 | """ 58 | Test to check if the batch_generator function chooses a context word 59 | in the skip_window for each center word 60 | """ 61 | vocab_size = 4208 62 | self.dr.process_data(vocab_size) 63 | data_index = 0 64 | skip_window = randint(1, 50) 65 | num_skips = max(int(skip_window/2), 2) 66 | batch_size = num_skips*3 67 | new_index, batch, label = self.dr.batch_generator(batch_size, 68 | num_skips, 69 | skip_window, 70 | data_index) 71 | batch = list(batch) 72 | for i, word in enumerate(self.dr.data[0:new_index]): 73 | while word in batch and skip_window <= i: 74 | index = batch.index(word) 75 | context = label[index][0] 76 | before = self.dr.data[i-skip_window:i] 77 | after = self.dr.data[i+1:i+skip_window+1] 78 | self.assertTrue(context in before or context in after) 79 | batch[index] = -1 80 | print("\nBuilding bacth time = {}".format(get_time(self.dr.batch_generator, 81 | [batch_size, 82 | data_index]))) 83 | 84 | 85 | if __name__ == "__main__": 86 | run_test(TestReading, 87 | "\n=== Running reading tests ===\n") 88 | run_test(TestData, 89 | "\n=== Running data tests ===\n") 90 | -------------------------------------------------------------------------------- /src/tests/word2vec_test.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | import os 3 | import sys 4 | from random import randint 5 | import inspect 6 | currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) 7 | parentdir = os.path.dirname(currentdir) 8 | sys.path.insert(0, parentdir) 9 | 10 | from datareader import DataReader 11 | import word2vec as wv 12 | from util import run_test, get_path_basic_corpus 13 | 14 | 15 | class Testopt(unittest.TestCase): 16 | """ 17 | Class that test the basic optmization 18 | """ 19 | def test_run_training(self): 20 | """ 21 | Test to check if the read_text function 22 | return a list of words given a txt file. 23 | """ 24 | my_data = DataReader(get_path_basic_corpus()) 25 | my_vocab_size = 500 26 | my_data.process_data(my_vocab_size) 27 | my_config = wv.Config(num_steps=200, 28 | vocab_size=my_vocab_size, 29 | show_step=2) 30 | 31 | my_model = wv.SkipGramModel(my_config) 32 | duration, loss = wv.run_training(my_model, 33 | my_data, 34 | verbose=False, 35 | visualization=False, 36 | debug=True) 37 | self.assertTrue(duration <= 1.7) 38 | self.assertTrue(loss < 7) 39 | 40 | if __name__ == "__main__": 41 | run_test(Testopt, 42 | "\n=== Running opt tests ===\n") 43 | -------------------------------------------------------------------------------- /src/tunning/batch_size.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | from random import randint 4 | import numpy as np 5 | import inspect 6 | import matplotlib 7 | matplotlib.use('Agg') 8 | import matplotlib.pyplot as plt 9 | 10 | currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) 11 | parentdir = os.path.dirname(currentdir) 12 | sys.path.insert(0, parentdir) 13 | 14 | from datareader import DataReader 15 | import word2vec as wv 16 | import util 17 | 18 | file_path = os.path.join(parentdir, "data") 19 | file_path = os.path.join(file_path, "Wiki.txt") 20 | eval_path = os.path.join(parentdir, "evaluation") 21 | eval_path = os.path.join(eval_path, "questions-words-ptbr.txt") 22 | 23 | my_data = DataReader(file_path) 24 | my_data.get_data() 25 | word2index = my_data.word2index 26 | index2word = my_data.index2word 27 | 28 | BATCH_SIZE = np.array(range(1, 17)) * 10 29 | number_of_exp = len(BATCH_SIZE) 30 | results = [] 31 | info = [] 32 | 33 | for i, bs in enumerate(BATCH_SIZE): 34 | print("\n ({0} of {1})".format(i + 1, number_of_exp)) 35 | config = wv.Config(batch_size=bs) 36 | attrs = vars(config) 37 | config_info = ["%s: %s" % item for item in attrs.items()] 38 | info.append(config_info) 39 | my_model = wv.SkipGramModel(config) 40 | embeddings = wv.run_training(my_model, 41 | my_data, 42 | verbose=False, 43 | visualization=False, 44 | debug=False) 45 | score, report = util.score(index2word, 46 | word2index, 47 | embeddings, 48 | eval_path, 49 | verbose=False, 50 | raw=True) 51 | results.append(score) 52 | print("Score = {}".format(score)) 53 | for result in report: 54 | print(result) 55 | 56 | BATCH_SIZE = list(BATCH_SIZE) 57 | best_result = max(list(zip(results, BATCH_SIZE, info))) 58 | result_string = """In an experiment with {0} batch sizes 59 | the best size is {1} with score = {2}. 60 | \n INFO = {3}""".format(number_of_exp, 61 | best_result[1], 62 | best_result[0], 63 | best_result[2]) 64 | 65 | file = open("batch_size.txt", "w") 66 | file.write(result_string) 67 | file.close() 68 | 69 | 70 | plt.plot(BATCH_SIZE, results) 71 | plt.xlabel("batch size") 72 | plt.ylabel("score") 73 | plt.savefig("batch_size.png") 74 | -------------------------------------------------------------------------------- /src/tunning/emb_size.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | from random import randint 4 | import numpy as np 5 | import inspect 6 | import matplotlib 7 | matplotlib.use('Agg') 8 | import matplotlib.pyplot as plt 9 | 10 | currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) 11 | parentdir = os.path.dirname(currentdir) 12 | sys.path.insert(0, parentdir) 13 | 14 | from datareader import DataReader 15 | import word2vec as wv 16 | import util 17 | 18 | file_path = os.path.join(parentdir, "data") 19 | file_path = os.path.join(file_path, "Wiki.txt") 20 | eval_path = os.path.join(parentdir, "evaluation") 21 | eval_path = os.path.join(eval_path, "questions-words-ptbr.txt") 22 | 23 | my_data = DataReader(file_path) 24 | my_data.get_data() 25 | word2index = my_data.word2index 26 | index2word = my_data.index2word 27 | 28 | EMB_SIZE = np.array(range(1, 51)) * 10 29 | number_of_exp = len(EMB_SIZE) 30 | results = [] 31 | info = [] 32 | 33 | for i, em in enumerate(EMB_SIZE): 34 | print("\n ({0} of {1})".format(i + 1, number_of_exp)) 35 | config = wv.Config(embed_size=em) 36 | attrs = vars(config) 37 | config_info = ["%s: %s" % item for item in attrs.items()] 38 | info.append(config_info) 39 | my_model = wv.SkipGramModel(config) 40 | embeddings = wv.run_training(my_model, 41 | my_data, 42 | verbose=False, 43 | visualization=False, 44 | debug=False) 45 | score, report = util.score(index2word, 46 | word2index, 47 | embeddings, 48 | eval_path, 49 | verbose=False, 50 | raw=True) 51 | results.append(score) 52 | print("Score = {}".format(score)) 53 | for result in report: 54 | print(result) 55 | 56 | EMB_SIZE = list(EMB_SIZE) 57 | best_result = max(list(zip(results, EMB_SIZE, info))) 58 | result_string = """In an experiment with {0} embeddings sizes 59 | the best size is {1} with score = {2}. 60 | \n INFO = {3}""".format(number_of_exp, 61 | best_result[1], 62 | best_result[0], 63 | best_result[2]) 64 | 65 | file = open("emb_size.txt", "w") 66 | file.write(result_string) 67 | file.close() 68 | 69 | 70 | plt.plot(EMB_SIZE, results) 71 | plt.xlabel("embedding size") 72 | plt.ylabel("score") 73 | plt.savefig("emb_size.png") 74 | -------------------------------------------------------------------------------- /src/tunning/init_param.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | from random import randint 4 | import numpy as np 5 | import inspect 6 | from mpl_toolkits.mplot3d import Axes3D 7 | import matplotlib 8 | matplotlib.use('Agg') 9 | import matplotlib.pyplot as plt 10 | 11 | currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) 12 | parentdir = os.path.dirname(currentdir) 13 | sys.path.insert(0, parentdir) 14 | 15 | from datareader import DataReader 16 | import word2vec as wv 17 | import util 18 | 19 | file_path = os.path.join(parentdir, "data") 20 | file_path = os.path.join(file_path, "Wiki.txt") 21 | eval_path = os.path.join(parentdir, "evaluation") 22 | eval_path = os.path.join(eval_path, "questions-words-ptbr.txt") 23 | 24 | my_data = DataReader(file_path) 25 | my_data.get_data() 26 | word2index = my_data.word2index 27 | index2word = my_data.index2word 28 | 29 | car1 = np.random.random_sample([10]) + 1 30 | car2 = np.random.random_sample([10]) + 1 31 | car3 = np.random.random_sample([10]) 32 | cdr1 = np.zeros([10]) 33 | cdr2 = np.zeros([10]) 34 | INIT_PARAM = list(zip(car1, cdr1)) 35 | par2 = list(zip(cdr2, car2)) 36 | par3 = list(zip(car3, car3)) 37 | INIT_PARAM.extend(par2) 38 | INIT_PARAM.extend(par3) 39 | INIT_PARAM.append((1.0, 1.0)) 40 | 41 | number_of_exp = len(INIT_PARAM) 42 | my_xs = np.array([x for (x, y) in INIT_PARAM]) 43 | my_ys = np.array([y for (x, y) in INIT_PARAM]) 44 | 45 | results = [] 46 | info = [] 47 | for i, pa in enumerate(INIT_PARAM): 48 | print("\n ({0} of {1})".format(i + 1, number_of_exp)) 49 | config = wv.Config(init_param=pa) 50 | attrs = vars(config) 51 | config_info = ["%s: %s" % item for item in attrs.items()] 52 | info.append(config_info) 53 | my_model = wv.SkipGramModel(config) 54 | embeddings = wv.run_training(my_model, 55 | my_data, 56 | verbose=False, 57 | visualization=False, 58 | debug=False) 59 | score, report = util.score(index2word, 60 | word2index, 61 | embeddings, 62 | eval_path, 63 | verbose=False, 64 | raw=True) 65 | results.append(score) 66 | print("Score = {}".format(score)) 67 | for result in report: 68 | print(result) 69 | 70 | my_zs = np.array(results) 71 | best_result = max(list(zip(results, INIT_PARAM, info))) 72 | result_string = """In an experiment with {0} init params 73 | the best one is {1} with score = {2}. 74 | \n INFO = {3}""".format(number_of_exp, 75 | best_result[1], 76 | best_result[0], 77 | best_result[2]) 78 | 79 | file = open("init_param.txt", "w") 80 | file.write(result_string) 81 | file.close() 82 | 83 | fig = plt.figure() 84 | ax = fig.add_subplot(111, projection='3d') 85 | ax.scatter(my_xs, my_ys, my_zs, c="r", marker='^') 86 | 87 | ax.set_xlabel('init param 1') 88 | ax.set_ylabel('init param 2') 89 | ax.set_zlabel('score') 90 | 91 | plt.savefig("init_param.png") 92 | -------------------------------------------------------------------------------- /src/tunning/learning_rate.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | from random import randint 4 | import numpy as np 5 | import inspect 6 | import matplotlib 7 | matplotlib.use('Agg') 8 | import matplotlib.pyplot as plt 9 | 10 | currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) 11 | parentdir = os.path.dirname(currentdir) 12 | sys.path.insert(0, parentdir) 13 | 14 | from datareader import DataReader 15 | import word2vec as wv 16 | import util 17 | 18 | file_path = os.path.join(parentdir, "data") 19 | file_path = os.path.join(file_path, "Wiki.txt") 20 | eval_path = os.path.join(parentdir, "evaluation") 21 | eval_path = os.path.join(eval_path, "questions-words-ptbr.txt") 22 | 23 | my_data = DataReader(file_path) 24 | my_data.get_data() 25 | word2index = my_data.word2index 26 | index2word = my_data.index2word 27 | 28 | number_of_exp = 5 29 | LEARNING_RATE = np.random.random_sample([5]) 30 | LEARNING_RATE.sort() 31 | results = [] 32 | info = [] 33 | 34 | for i, learning_rate in enumerate(LEARNING_RATE): 35 | print("\n ({0} of {1})".format(i + 1, number_of_exp)) 36 | config = wv.Config(lr=learning_rate) 37 | attrs = vars(config) 38 | config_info = ["%s: %s" % item for item in attrs.items()] 39 | info.append(config_info) 40 | my_model = wv.SkipGramModel(config) 41 | embeddings = wv.run_training(my_model, 42 | my_data, 43 | verbose=False, 44 | visualization=False, 45 | debug=False) 46 | score, report = util.score(index2word, 47 | word2index, 48 | embeddings, 49 | eval_path, 50 | verbose=False, 51 | raw=True) 52 | results.append(score) 53 | print("Score = {}".format(score)) 54 | for result in report: 55 | print(result) 56 | 57 | LEARNING_RATE = list(LEARNING_RATE) 58 | best_result = max(list(zip(results, LEARNING_RATE, info))) 59 | result_string = """In an experiment with {0} learning rate values 60 | the best one is {1} with score = {2}. 61 | \n INFO = {3}""".format(number_of_exp, 62 | best_result[1], 63 | best_result[0], 64 | best_result[2]) 65 | 66 | file = open("learning_rate.txt", "w") 67 | file.write(result_string) 68 | file.close() 69 | 70 | 71 | plt.plot(LEARNING_RATE, results) 72 | plt.xscale('log') 73 | plt.xlabel("learning_rate") 74 | plt.ylabel("score") 75 | plt.savefig("learning_rate.png") 76 | -------------------------------------------------------------------------------- /src/tunning/num_sampled.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | from random import randint 4 | import numpy as np 5 | import inspect 6 | import matplotlib 7 | matplotlib.use('Agg') 8 | import matplotlib.pyplot as plt 9 | 10 | currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) 11 | parentdir = os.path.dirname(currentdir) 12 | sys.path.insert(0, parentdir) 13 | 14 | from datareader import DataReader 15 | import word2vec as wv 16 | import util 17 | 18 | file_path = os.path.join(parentdir, "data") 19 | file_path = os.path.join(file_path, "Wiki.txt") 20 | eval_path = os.path.join(parentdir, "evaluation") 21 | eval_path = os.path.join(eval_path, "questions-words-ptbr.txt") 22 | 23 | my_data = DataReader(file_path) 24 | my_data.get_data() 25 | word2index = my_data.word2index 26 | index2word = my_data.index2word 27 | 28 | NUM_SAMPLED = [5, 29 | 10, 30 | 15, 31 | 20, 32 | 25, 33 | 30, 34 | 35, 35 | 40, 36 | 45, 37 | 55, 38 | 65, 39 | 75, 40 | 85, 41 | 95, 42 | 120, 43 | 330, 44 | 500, 45 | 765, 46 | 1125, 47 | 2300] 48 | number_of_exp = len(NUM_SAMPLED) 49 | results = [] 50 | info = [] 51 | 52 | for i, ns in enumerate(NUM_SAMPLED): 53 | print("\n ({0} of {1})".format(i + 1, number_of_exp)) 54 | config = wv.Config(num_sampled=ns) 55 | attrs = vars(config) 56 | config_info = ["%s: %s" % item for item in attrs.items()] 57 | info.append(config_info) 58 | my_model = wv.SkipGramModel(config) 59 | embeddings = wv.run_training(my_model, 60 | my_data, 61 | verbose=False, 62 | visualization=False, 63 | debug=False) 64 | score, report = util.score(index2word, 65 | word2index, 66 | embeddings, 67 | eval_path, 68 | verbose=False, 69 | raw=True) 70 | results.append(score) 71 | print("Score = {}".format(score)) 72 | for result in report: 73 | print(result) 74 | 75 | 76 | best_result = max(list(zip(results, NUM_SAMPLED, info))) 77 | result_string = """In an experiment with {0} values for the negative sampling 78 | the best one is {1} with score = {2}. 79 | \n INFO = {3}""".format(number_of_exp, 80 | best_result[1], 81 | best_result[0], 82 | best_result[2]) 83 | 84 | file = open("num_sampled.txt", "w") 85 | file.write(result_string) 86 | file.close() 87 | 88 | 89 | plt.plot(NUM_SAMPLED, results) 90 | plt.xlabel("number of negative samples") 91 | plt.ylabel("score") 92 | plt.savefig("num_sampled.png") 93 | -------------------------------------------------------------------------------- /src/tunning/skip_window.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | from random import randint 4 | import numpy as np 5 | import inspect 6 | import matplotlib 7 | matplotlib.use('Agg') 8 | import matplotlib.pyplot as plt 9 | 10 | currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) 11 | parentdir = os.path.dirname(currentdir) 12 | sys.path.insert(0, parentdir) 13 | 14 | from datareader import DataReader 15 | import word2vec as wv 16 | import util 17 | 18 | file_path = os.path.join(parentdir, "data") 19 | file_path = os.path.join(file_path, "Wiki.txt") 20 | eval_path = os.path.join(parentdir, "evaluation") 21 | eval_path = os.path.join(eval_path, "questions-words-ptbr.txt") 22 | 23 | my_data = DataReader(file_path) 24 | my_data.get_data() 25 | word2index = my_data.word2index 26 | index2word = my_data.index2word 27 | 28 | SKIP_WINDOW = [1, 29 | 2, 30 | 3, 31 | 4, 32 | 5, 33 | 6] 34 | number_of_exp = len(SKIP_WINDOW) 35 | results = [] 36 | info = [] 37 | batch = 60 38 | 39 | for i, sk in enumerate(SKIP_WINDOW): 40 | print("\n ({0} of {1})".format(i + 1, number_of_exp)) 41 | nk = 2 * sk 42 | batch = batch - (batch % nk) 43 | config = wv.Config(skip_window=sk, batch_size=batch, num_skips=nk) 44 | attrs = vars(config) 45 | config_info = ["%s: %s" % item for item in attrs.items()] 46 | info.append(config_info) 47 | my_model = wv.SkipGramModel(config) 48 | embeddings = wv.run_training(my_model, 49 | my_data, 50 | verbose=False, 51 | visualization=False, 52 | debug=False) 53 | score, report = util.score(index2word, 54 | word2index, 55 | embeddings, 56 | eval_path, 57 | verbose=False, 58 | raw=True) 59 | results.append(score) 60 | print("Score = {}".format(score)) 61 | for result in report: 62 | print(result) 63 | 64 | best_result = max(list(zip(results, SKIP_WINDOW, info))) 65 | result_string = """In an experiment with {0} skip windows 66 | the best window size is {1} with score = {2} 67 | \n INFO = {3}""".format(number_of_exp, 68 | best_result[1], 69 | best_result[0], 70 | best_result[2]) 71 | 72 | file = open("skip_window.txt", "w") 73 | file.write(result_string) 74 | file.close() 75 | 76 | plt.plot(SKIP_WINDOW, results) 77 | plt.xlabel("skip window") 78 | plt.ylabel("score") 79 | plt.savefig("skip_window.png") 80 | -------------------------------------------------------------------------------- /src/tunning/std_param.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | from random import randint 4 | import numpy as np 5 | import inspect 6 | import matplotlib 7 | matplotlib.use('Agg') 8 | import matplotlib.pyplot as plt 9 | 10 | currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) 11 | parentdir = os.path.dirname(currentdir) 12 | sys.path.insert(0, parentdir) 13 | 14 | from datareader import DataReader 15 | import word2vec as wv 16 | import util 17 | 18 | file_path = os.path.join(parentdir, "data") 19 | file_path = os.path.join(file_path, "Wiki.txt") 20 | eval_path = os.path.join(parentdir, "evaluation") 21 | eval_path = os.path.join(eval_path, "questions-words-ptbr.txt") 22 | 23 | my_data = DataReader(file_path) 24 | my_data.get_data() 25 | word2index = my_data.word2index 26 | index2word = my_data.index2word 27 | 28 | 29 | pa1 = np.random.random_sample([10]) 30 | pa2 = np.random.random_sample([10]) / 10 31 | pa3 = np.random.random_sample([10]) / 100 32 | STD_PARAM = np.concatenate((pa1, pa2, pa3)) 33 | number_of_exp = len(STD_PARAM) 34 | 35 | STD_PARAM.sort() 36 | results = [] 37 | info = [] 38 | 39 | for i, pa in enumerate(STD_PARAM): 40 | print("\n ({0} of {1})".format(i + 1, number_of_exp)) 41 | config = wv.Config(std_param=pa) 42 | attrs = vars(config) 43 | config_info = ["%s: %s" % item for item in attrs.items()] 44 | info.append(config_info) 45 | my_model = wv.SkipGramModel(config) 46 | embeddings = wv.run_training(my_model, 47 | my_data, 48 | verbose=False, 49 | visualization=False, 50 | debug=False) 51 | score, report = util.score(index2word, 52 | word2index, 53 | embeddings, 54 | eval_path, 55 | verbose=False, 56 | raw=True) 57 | results.append(score) 58 | print("Score = {}".format(score)) 59 | for result in report: 60 | print(result) 61 | 62 | STD_PARAM = list(STD_PARAM) 63 | best_result = max(list(zip(results, STD_PARAM, info))) 64 | result_string = """In an experiment with {0} std params 65 | the best one is {1} with score = {2}. 66 | \n INFO = {3}""".format(number_of_exp, 67 | best_result[1], 68 | best_result[0], 69 | best_result[2]) 70 | 71 | file = open("std_param.txt", "w") 72 | file.write(result_string) 73 | file.close() 74 | 75 | 76 | plt.plot(STD_PARAM, results) 77 | plt.xscale('log') 78 | plt.xlabel("std param") 79 | plt.ylabel("score") 80 | plt.savefig("std_param.png") 81 | -------------------------------------------------------------------------------- /src/util.py: -------------------------------------------------------------------------------- 1 | import time 2 | import os 3 | import unittest 4 | import numpy as np 5 | import sys 6 | import heapq 7 | 8 | timing = {} 9 | 10 | 11 | def normalizeRows(x): 12 | """ 13 | Row normalization function 14 | 15 | :type x: np array 16 | """ 17 | all_norm2 = np.sqrt(np.sum(np.power(x, 2), 1)) 18 | all_norm2 = 1/all_norm2 19 | x = x * all_norm2[:, np.newaxis] 20 | return x 21 | 22 | 23 | def get_time(f, args=[]): 24 | """ 25 | After using timeit we can get the duration of the function f 26 | when it was applied in parameters args. Normally it is expected 27 | that args is a list of parameters, but it can be also a single parameter. 28 | 29 | :type f: function 30 | :type args: list 31 | :rtype: float 32 | """ 33 | if type(args) != list: 34 | args = [args] 35 | key = f.__name__ 36 | if args != []: 37 | key += "-" + "-".join([str(arg) for arg in args]) 38 | return timing[key] 39 | 40 | 41 | def timeit(index_args=[]): 42 | 43 | def dec(method): 44 | """ 45 | Decorator for time information 46 | """ 47 | 48 | def timed(*args, **kw): 49 | ts = time.time() 50 | result = method(*args, **kw) 51 | timed.__name__ = method.__name__ 52 | te = time.time() 53 | fkey = method.__name__ 54 | for i, arg in enumerate(args): 55 | if i in index_args: 56 | fkey += "-" + str(arg) 57 | timing[fkey] = te-ts 58 | return result 59 | return timed 60 | return dec 61 | 62 | 63 | def get_path_basic_corpus(): 64 | """ 65 | Function to acces the path of the testing corpus. 66 | 67 | :rtype: string 68 | """ 69 | currentdir = os.path.dirname(__file__) 70 | filepath = os.path.join(currentdir, "data") 71 | filepath = os.path.join(filepath, "basic_pt.txt") 72 | return filepath 73 | 74 | 75 | def newlogname(): 76 | log_basedir = './graphs' 77 | run_label = time.strftime('%d-%m-%Y_%H-%M-%S') # e.g. 12-11-2016_18-20-45 78 | return os.path.join(log_basedir, run_label) 79 | 80 | 81 | def run_test(testClass, header): 82 | """ 83 | Function to run all the tests from a class of tests. 84 | 85 | :type testClass: unittest.TesCase 86 | :type header: str 87 | """ 88 | print(header) 89 | suite = unittest.TestLoader().loadTestsFromTestCase(testClass) 90 | unittest.TextTestRunner(verbosity=2).run(suite) 91 | 92 | 93 | def apply_dot(x, y, z, w): 94 | return y.dot(x) - z.dot(x) + w.dot(x) 95 | 96 | 97 | def analogy(word1, word2, word3, index2word, word2index, embeddings): 98 | """ 99 | Function to calculate a list of analogues given the words 100 | 'word1', 'word2', 'word3'. 101 | 102 | :type word1:str 103 | :type word2:str 104 | :type word3:str 105 | :type index2word: dict 106 | :type word2index: dict 107 | :type embeddings: np array 108 | :rtype result: list 109 | """ 110 | index1 = word2index[word1] 111 | index2 = word2index[word2] 112 | index3 = word2index[word3] 113 | wordvector1 = embeddings[index1] 114 | wordvector2 = embeddings[index2] 115 | wordvector3 = embeddings[index3] 116 | result_vector = embeddings.dot(wordvector2) - embeddings.dot(wordvector1) + embeddings.dot(wordvector3) 117 | 118 | all_results = [(v, index) 119 | for index, v in enumerate(result_vector) 120 | if (index != index1 and 121 | index != index2 and 122 | index != index3)] 123 | 124 | heapq._heapify_max(all_results) 125 | results = [] 126 | for _ in range(10): 127 | _, index = heapq._heappop_max(all_results) 128 | results.append(index2word[index]) 129 | return results 130 | 131 | 132 | def score(index2word, 133 | word2index, 134 | embeddings, 135 | eval_path, 136 | verbose=True, 137 | raw=False): 138 | """ 139 | Function to calculate the score of the embeddings given one 140 | txt file of analogies "eval_path". A valid line is a line of the txt 141 | such that every word is in the vocabulary of the embeddings. For each 142 | valid line we calculate the top 10 closest words that fit the analogy for 143 | the first, the second and the third words of the valid line. The score of 144 | this line will be the position of the fourth word in this list (0 if it is 145 | not in the list). Since the txt can have different categories this 146 | function also returns a list 'results' with the different scores 147 | per category. 148 | 149 | :type index2word: dict 150 | :type word2index: dict 151 | :type embeddings: np array 152 | :type eval_path:str 153 | :rtype final_score: float 154 | :rtype results: list 155 | """ 156 | old_score = 0 157 | old_total = 0 158 | old_cat = None 159 | valid_tests = 0 160 | total_lines = 0 161 | all_cat_scores = [] 162 | all_cat_totals = [] 163 | all_cat = [] 164 | with open(eval_path) as inputfile: 165 | for line in inputfile: 166 | total_lines += 1 167 | list_line = line.strip().split() 168 | if list_line[0] == ":": 169 | print("\n" + line + "\n") 170 | if old_cat is not None: 171 | all_cat.append(old_cat) 172 | all_cat_scores.append(old_score) 173 | if raw: 174 | all_cat_totals.append(old_total) 175 | else: 176 | all_cat_totals.append(old_total * 10) 177 | old_cat = list_line[1] 178 | old_score = 0 179 | old_total = 0 180 | else: 181 | old_cat = list_line[1] 182 | old_score = 0 183 | old_total = 0 184 | if all([word in word2index for word in list_line]): 185 | current_score = 0 186 | valid_tests += 1 187 | old_total += 1 188 | analogues = analogy(list_line[0], 189 | list_line[1], 190 | list_line[2], 191 | index2word, 192 | word2index, 193 | embeddings)[::-1] 194 | if raw: 195 | if list_line[3] == analogues[9]: 196 | current_score = 1 197 | else: 198 | if list_line[3] in analogues: 199 | current_score = analogues.index(list_line[3]) + 1 200 | old_score += current_score 201 | if verbose: 202 | sys.stdout.write('\rline:{}|cat:{}|score:{}'.format(total_lines, 203 | old_cat, 204 | old_score)) 205 | sys.stdout.flush() 206 | all_cat.append(old_cat) 207 | all_cat_scores.append(old_score) 208 | if raw: 209 | all_cat_totals.append(old_total) 210 | else: 211 | all_cat_totals.append(old_total * 10) 212 | results = [cat + ": {0:.1f}% ({1}/{2})".format((score/total)*100, 213 | score, total) 214 | for (cat, score, total) in zip(all_cat, 215 | all_cat_scores, 216 | all_cat_totals) if total != 0] 217 | if all_cat_totals == []: 218 | final_score = 0 219 | print("Every line has at least a word outside the vocabulary") 220 | else: 221 | final_score = np.sum(all_cat_scores) / np.sum(all_cat_totals) 222 | return final_score, results 223 | -------------------------------------------------------------------------------- /src/word2vec.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import numpy as np 3 | import os 4 | import pickle 5 | import random 6 | import tensorflow as tf 7 | import time 8 | import util 9 | 10 | from datareader import DataReader 11 | from tensorflow.contrib.tensorboard.plugins import projector 12 | 13 | 14 | class Config(): 15 | """ 16 | Holds model hyperparams and data information. 17 | The config class is used to store various hyperparameters. 18 | SkipGramModel objects are passed a Config() object at 19 | instantiation. 20 | """ 21 | def __init__(self, 22 | vocab_size=50000, 23 | batch_size=140, 24 | embed_size=128, 25 | skip_window=1, 26 | num_skips=2, 27 | num_sampled=64, 28 | lr=1.0, 29 | std_param=0.01, 30 | init_param=(1.0, 1.0), 31 | num_steps=100001, 32 | show_step=2000, 33 | verbose_step=10000, 34 | valid_size=16, 35 | valid_window=100): 36 | """ 37 | :type vocab_size: int >>> size of the vocabulary 38 | :type batch_size: int >>> size of the batch 39 | :type embed_size: int >>> size of the word embeddings 40 | :type skip_window: int >>> size of the context window 41 | :type num_skip: int >>> number of times a same center word is used 42 | :type num_sampled: int >>> number of samples for negativ sampling 43 | :type lr: float >>> learning rate 44 | :rtype std_param: float >>> parameter to define the standart deviation 45 | of the softmax weights 46 | std = 1.0/(embed_size**std_param) 47 | :rtype init_param: (float,float) >>> params to set up the uniform 48 | distribuition of the 49 | initialization of the 50 | word embeddings 51 | :type num_steps: int >>> number of training steps 52 | :type show_steps: int >>> steps to show the loss during training 53 | :type verbose_step: int >>> steps to show some valid examples 54 | during training 55 | :type valid_size: int >>> number of valid words to show in verbose_step 56 | :type valid_window: int >>> range of words to choose the valid words 57 | """ 58 | self.vocab_size = vocab_size 59 | self.batch_size = batch_size 60 | self.embed_size = embed_size 61 | self.skip_window = skip_window 62 | self.num_skips = num_skips 63 | self.num_sampled = num_sampled 64 | self.lr = lr 65 | self.std_param = std_param 66 | self.init_param = init_param 67 | self.num_steps = num_steps 68 | self.show_step = show_step 69 | self.verbose_step = verbose_step 70 | self.valid_size = valid_size 71 | self.valid_window = valid_window 72 | self.valid_examples = np.array(random.sample(range(self.valid_window), 73 | self.valid_size)) 74 | 75 | 76 | class UserConfig(Config): 77 | def __init__(self, user_args): 78 | super().__init__(vocab_size=user_args.vocab_size, 79 | batch_size=user_args.batch_size, 80 | embed_size=user_args.embed_size, 81 | skip_window=user_args.skip_window, 82 | num_skips=user_args.num_skips, 83 | num_sampled=user_args.num_sampled, 84 | lr=user_args.learning_rate, 85 | num_steps=user_args.num_steps, 86 | show_step=user_args.show_step, 87 | verbose_step=user_args.verbose_step, 88 | valid_size=user_args.valid_size, 89 | valid_window=user_args.valid_window) 90 | 91 | 92 | class SkipGramModel: 93 | """ 94 | The Skipgram model. This class only instatiates 95 | the tensorflow graph for the model. 96 | """ 97 | def __init__(self, config): 98 | """ 99 | :type config: Config 100 | """ 101 | self.logdir = util.newlogname() 102 | self.config = config 103 | self.vocab_size = self.config.vocab_size 104 | self.embed_size = self.config.embed_size 105 | self.batch_size = self.config.batch_size 106 | self.num_sampled = self.config.num_sampled 107 | self.lr = self.config.lr 108 | self.std_param = self.config.std_param 109 | self.init_param = self.config.init_param 110 | self.valid_examples = self.config.valid_examples 111 | self.build_graph() 112 | 113 | def create_placeholders(self): 114 | """ 115 | Create placeholder for the models graph 116 | """ 117 | with tf.name_scope("words"): 118 | self.center_words = tf.placeholder(tf.int32, 119 | shape=[self.batch_size], 120 | name='center_words') 121 | self.targets = tf.placeholder(tf.int32, 122 | shape=[self.batch_size, 1], 123 | name='target_words') 124 | self.valid_dataset = tf.constant(self.valid_examples, 125 | dtype=tf.int32) 126 | 127 | def create_weights(self): 128 | """ 129 | Create all the weights and bias for the models graph 130 | """ 131 | emshape = (self.vocab_size, self.embed_size) 132 | eminit = tf.random_uniform(emshape, 133 | -self.init_param[0], 134 | self.init_param[1]) 135 | self.embeddings = tf.Variable(eminit, name="embeddings") 136 | 137 | with tf.name_scope("softmax"): 138 | Wshape = (self.vocab_size, self.embed_size) 139 | bshape = (self.vocab_size) 140 | std = 1.0 / (self.config.embed_size ** self.std_param) 141 | Winit = tf.truncated_normal(Wshape, stddev=std) 142 | binit = tf.zeros(bshape) 143 | self.weights = tf.get_variable("weights", 144 | dtype=tf.float32, 145 | initializer=Winit) 146 | self.biases = tf.get_variable("biases", 147 | dtype=tf.float32, 148 | initializer=binit) 149 | 150 | def create_loss(self): 151 | """ 152 | Create the loss function of the model 153 | """ 154 | with tf.name_scope("loss"): 155 | self.embed = tf.nn.embedding_lookup(self.embeddings, 156 | self.center_words, 157 | name='embed') 158 | self.loss = tf.reduce_mean(tf.nn.sampled_softmax_loss(self.weights, 159 | self.biases, 160 | self.targets, 161 | self.embed, 162 | self.num_sampled, 163 | self.vocab_size)) 164 | 165 | def create_optimizer(self): 166 | """ 167 | Create the optimization of the model 168 | """ 169 | with tf.name_scope("train"): 170 | opt = tf.train.AdagradOptimizer(self.lr) 171 | self.optimizer = opt.minimize(self.loss) 172 | 173 | def create_valid(self): 174 | """ 175 | Create the valid vectors for comparison 176 | """ 177 | norm = tf.sqrt(tf.reduce_sum(tf.square(self.embeddings), 178 | 1, keep_dims=True)) 179 | self.normalized_embeddings = self.embeddings / norm 180 | valid_embeddings = tf.nn.embedding_lookup(self.normalized_embeddings, 181 | self.valid_dataset) 182 | self.similarity = tf.matmul(valid_embeddings, 183 | tf.transpose(self.normalized_embeddings)) 184 | 185 | def create_summaries(self): 186 | """ 187 | Create the summary 188 | """ 189 | with tf.name_scope("summaries"): 190 | tf.summary.scalar("loss", self.loss) 191 | self.summary_op = tf.summary.merge_all() 192 | 193 | def build_graph(self): 194 | """ 195 | Build the graph for our model 196 | """ 197 | self.graph = tf.Graph() 198 | with self.graph.as_default(): 199 | self.create_placeholders() 200 | self.create_weights() 201 | self.create_loss() 202 | self.create_optimizer() 203 | self.create_valid() 204 | self.create_summaries() 205 | 206 | 207 | def run_training(model, data, verbose=True, visualization=True, debug=False): 208 | """ 209 | Function to train the model. We use the parameter "verbose" to show 210 | some the words during training; "visualization" adds ternsorboard 211 | visualization; if "debug" is True then the return will be the duration of 212 | the training and the mean of the loss, and if "debug" is False this 213 | function returns the matrix of word embeddings. 214 | 215 | :type model: SkipGramModel 216 | :type data: Datareader 217 | :type verbose: boolean 218 | :type visualization: boolean 219 | :type debug: boolean 220 | :rtype duration: float 221 | :rtype avg_loss: float 222 | :rtype final_embeddings: np array -> [shape = (model.vocab_size, 223 | model.embed_size), dtype=np.float32] 224 | """ 225 | logdir = model.logdir 226 | batch_size = model.config.batch_size 227 | num_skips = model.config.num_skips 228 | skip_window = model.config.skip_window 229 | valid_examples = model.config.valid_examples 230 | num_steps = model.config.num_steps 231 | show_step = model.config.show_step 232 | verbose_step = model.config.verbose_step 233 | data_index = 0 234 | with tf.Session(graph=model.graph) as session: 235 | tf.global_variables_initializer().run() 236 | ts = time.time() 237 | print("Initialized") 238 | if visualization: 239 | print("\n&&&&&&&&& For TensorBoard visualization type &&&&&&&&&&&") 240 | print("\ntensorboard --logdir={}\n".format(logdir)) 241 | print("\n&&&&&&&&& And for the 3d embedding visualization type &&") 242 | print("\ntensorboard --logdir=./processed\n") 243 | average_loss = 0 244 | total_loss = 0 245 | if visualization: 246 | writer = tf.summary.FileWriter(logdir, session.graph) 247 | for step in range(num_steps): 248 | data_index, batch_data, batch_labels = data.batch_generator(batch_size, 249 | num_skips, 250 | skip_window, 251 | data_index) 252 | feed_dict = {model.center_words: batch_data, 253 | model.targets: batch_labels} 254 | _, l, summary = session.run([model.optimizer, 255 | model.loss, 256 | model.summary_op], 257 | feed_dict=feed_dict) 258 | average_loss += l 259 | total_loss += l 260 | if visualization: 261 | writer.add_summary(summary, global_step=step) 262 | writer.flush() 263 | if step % show_step == 0: 264 | if step > 0: 265 | average_loss = average_loss / show_step 266 | print("Average loss at step", step, ":", average_loss) 267 | average_loss = 0 268 | if step % verbose_step == 0 and verbose: 269 | sim = model.similarity.eval() 270 | for i in range(model.config.valid_size): 271 | valid_word = data.index2word[valid_examples[i]] 272 | top_k = 8 273 | nearest = (-sim[i, :]).argsort()[1:top_k+1] 274 | log = "Nearest to %s:" % valid_word 275 | for k in range(top_k): 276 | close_word = data.index2word[nearest[k]] 277 | log = "%s %s," % (log, close_word) 278 | print(log) 279 | 280 | final_embeddings = model.normalized_embeddings.eval() 281 | if visualization: 282 | embedding_var = tf.Variable(final_embeddings[:1000], 283 | name='embedding') 284 | session.run(embedding_var.initializer) 285 | emconfig = projector.ProjectorConfig() 286 | summary_writer = tf.summary.FileWriter('processed') 287 | embedding = emconfig.embeddings.add() 288 | embedding.tensor_name = embedding_var.name 289 | embedding.metadata_path = 'processed/vocab_1000.tsv' 290 | projector.visualize_embeddings(summary_writer, emconfig) 291 | saver_embed = tf.train.Saver([embedding_var]) 292 | saver_embed.save(session, 'processed/model3.ckpt', 1) 293 | 294 | te = time.time() 295 | duration = te - ts 296 | avg_loss = total_loss / num_steps 297 | if debug: 298 | return duration, avg_loss 299 | else: 300 | return final_embeddings 301 | 302 | 303 | def create_argument_parser(): 304 | parser = argparse.ArgumentParser() 305 | 306 | parser.add_argument("-f", 307 | "--file", 308 | type=str, 309 | default='basic', 310 | help="text file to apply the model (default=basic_pt.txt)") 311 | 312 | parser.add_argument("-s", 313 | "--num_steps", 314 | type=int, 315 | default=100000, 316 | help="number of training steps (default=100000)") 317 | 318 | parser.add_argument("-v", 319 | "--vocab_size", 320 | type=int, 321 | default=50000, 322 | help="vocab size (default=50000)") 323 | 324 | parser.add_argument("-b", "--batch_size", type=int, 325 | default=140, 326 | help="batch size (default=140)") 327 | 328 | parser.add_argument("-e", 329 | "--embed_size", 330 | type=int, 331 | default=128, 332 | help="embeddings size (default=128)") 333 | 334 | parser.add_argument("-k", 335 | "--skip_window", 336 | type=int, 337 | default=1, 338 | help="skip window (default=1)") 339 | 340 | parser.add_argument("-n", 341 | "--num_skips", 342 | type=int, 343 | default=2, 344 | help="""number of skips, number of times 345 | a center word will be re-used (default=2)""") 346 | 347 | parser.add_argument("-S", 348 | "--num_sampled", 349 | type=int, 350 | default=64, 351 | help="number of negative samples(default=64)") 352 | 353 | parser.add_argument("-l", 354 | "--learning_rate", 355 | type=float, 356 | default=1.0, 357 | help="learning rate (default=1.0)") 358 | 359 | parser.add_argument("-w", 360 | "--show_step", 361 | type=int, 362 | default=2000, 363 | help="show result in multiples of this step (default=2000)") 364 | 365 | parser.add_argument("-B", 366 | "--verbose_step", 367 | type=int, 368 | default=10000, 369 | help="show similar words in multiples of this step (default=10000)") 370 | 371 | parser.add_argument("-V", 372 | "--valid_size", 373 | type=int, 374 | default=16, 375 | help="number of words to display similarity(default=16)") 376 | 377 | parser.add_argument("-W", 378 | "--valid_window", 379 | type=int, 380 | default=100, 381 | help="number of words from vocab to choose the words to display similarity (default=100)") 382 | 383 | return parser 384 | 385 | 386 | def create_processed_dir(): 387 | process_dir = 'processed/' 388 | if not os.path.exists(process_dir): 389 | os.makedirs(process_dir) 390 | 391 | 392 | def process_text_data(file_path, vocab_size): 393 | """ 394 | This function is responsible for preprocessing the text data we will use to 395 | train our model. It will perform the following steps: 396 | 397 | * Create an word array for the file we have received. For example, if our 398 | text is: 399 | 400 | 'I want to learn wordvec to do cool stuff' 401 | 402 | It will produce the following array: 403 | 404 | ['I', 'want', 'to', 'learn', 'wordvec', 'to', 'do', 'cool', 'stuff'] 405 | 406 | * Create the frequency count for every word in our array: 407 | 408 | [('I', 1), ('want', 1), ('to', 2), ('learn', 1), ('wordvec', 1), 409 | ('do', 1), ('cool', 1), ('stuff', 1)] 410 | 411 | * With the count array, we choose as our vocabulary the words with the 412 | highest count. The number of words will be decided by the variable 413 | vocab_size. 414 | 415 | * After that we will create a dictionary to map a word to an index and an 416 | index to a word: 417 | 418 | index2word: {0: 'I', 1: 'want', 2: 'to', 3: 'learn', 4: 'wordvec', 419 | 5: 'do', 6: 'cool', 7: 'stuff'} 420 | word2index: {'I': 0, 'want': 1, 'to': 2, 'learn': 3, 'wordvec': 4, 421 | 'do': 5, 'cool': 6, 'stuff': 7} 422 | 423 | Both of these dictionaries are based on the words provided by the count 424 | array. 425 | 426 | * Finally, we will transform the words array to a number array, using the 427 | word2vec dictionary. 428 | 429 | Therefore, our words array: 430 | 431 | ['I', 'want', 'to', 'learn', 'wordvec', 'to', 'do', 'cool', 'stuff'] 432 | 433 | Will be translated to: 434 | 435 | [0, 1, 2, 3, 4, 2, 5, 6, 7] 436 | 437 | If a word is not present in the word2index array, it will be considered an 438 | unknown word. Every unknown word will be mapped to the same index. 439 | """ 440 | my_data = DataReader(file_path) 441 | my_data.process_data(vocab_size) 442 | return my_data 443 | 444 | 445 | def main(): 446 | parser = create_argument_parser() 447 | 448 | user_args = parser.parse_args() 449 | file_path = user_args.file 450 | 451 | if file_path == 'basic': 452 | file_path = util.get_path_basic_corpus() 453 | user_args.vocab_size = 500 454 | 455 | config = UserConfig(user_args) 456 | my_data = process_text_data(file_path, config.vocab_size) 457 | create_processed_dir() 458 | 459 | current_dir = os.path.dirname(__file__) 460 | old_vocab_path = os.path.join(current_dir, 'vocab_1000.tsv') 461 | new_vocab_path = os.path.join(current_dir, 'processed') 462 | new_vocab_path = os.path.join(new_vocab_path, 'vocab_1000.tsv') 463 | os.rename(old_vocab_path, new_vocab_path) 464 | 465 | my_model = SkipGramModel(config) 466 | embeddings = run_training(my_model, my_data) 467 | 468 | pickle_dir = 'pickles/' 469 | if not os.path.exists(pickle_dir): 470 | os.makedirs(pickle_dir) 471 | inverse = file_path[::-1][4:] 472 | number = -1 473 | for i, char in enumerate(inverse): 474 | if char == "/": 475 | number = i 476 | break 477 | if number == -1: 478 | filename = inverse[::-1] + '.pickle' 479 | else: 480 | filename = inverse[:number][::-1] + '.pickle' 481 | 482 | prefix = os.path.join(current_dir, 'pickles') 483 | filename = os.path.join(prefix, filename) 484 | 485 | f = open(filename, 'wb') 486 | di = {'word2index': my_data.word2index, 487 | 'index2word': my_data.index2word, 488 | 'embeddings': embeddings} 489 | pickle.dump(di, f) 490 | f.close() 491 | 492 | print("\n==========================================") 493 | print("""\nThe emmbedding vectors can be found in 494 | {}""".format(filename)) 495 | 496 | if __name__ == "__main__": 497 | main() 498 | --------------------------------------------------------------------------------