# Cemantix -- Terminal edition ## Introduction Ce jeu est largement inspiré de Cemantix : https://cemantix.herokuapp.com/, publié par [@enigmathix](https://twitter.com/enigmathix). Dans ce jeu, vous devez trouver un mot en faisant des propositions successives, et une distance vous est donnée, calculée en utilisant [Word2Vec](https://fr.wikipedia.org/wiki/Word2vec|Word2Vec). Cette distance est une distance sémantique : deux mots vont être proches s'ils sont relativement similaires. Par exemple, les mots « identique » et « similaire » ont un taux de similarité d'environ 54.87 %, selon notre modèle, ce qui est relativement élevé. Pour jouer, il suffit d'ouvrir un terminal et de lancer, pour l'instance principale : ```bash $ ssh -p 2200 cemantix.ynerant.fr ``` Un nouveau mot est généré chaque jour à minuit heure de Paris. ## Jeu de données Le jeu de données provient d'une extraction des pages de Wikipédia France, que l'on peut trouver ici : https://dumps.wikimedia.org/frwiki/latest/ Les textes ont été entraînés en utilisant cet utilitaire autour de word2vec : https://github.com/jind11/word2vec-on-wikipedia Un jeu entraîné par mes propres soins (29 avril 2022) peut être trouvé ici : https://perso.crans.org/ynerant/frwiki.skip.size500.win10.neg15.sample1e-5.min15.bin En plus de cet entraînement de données, un dictionnaire de mots admissibles est utilisé. Il s'agit de la liste des mots qui peuvent servir à fournir un mot aléatoire, et dans laquelle l'utilisateur⋅rice a le droit de proposer un mot. Cette liste est restreinte aux lemmes, c'est-à-dire aux racines des mots, en excluant donc les éventuels verbes conjugués ou mots déclinés au féminin ou au pluriel. Cette liste est ensuite intersectée avec les mots connus du jeu de données. Le fichier ``lemmes.txt`` est issu de ce travail de filtrage à partir des données du site https://grammalecte.net/download.php?prj=fr . ## Installation Si vous voulez déployer ce serveur chez vous, vous avez besoin des prérequis suivants : * Golang * Python 3 * numpy * scipy * gensim Pour les installer, avec une distribution basée sur Debian ou Ubuntu : ```bash $ sudo apt install golang python3-pip python3-numpy python3-scipy $ sudo pip3 install gensim # Ou installation locale ``` Sous Arch Linux : ```bash sudo pacman -Sy go python-pip python-numpy python-scipy sudo pip install gensim # Ou installation locale yay -Sy python-gensim # Alternative utilisant yay ``` Une fois ces quelques dépendances installées, il vous suffit de lancer ``go build`` pour générer le bon binaire. Récupérez le jeu de données entraînées cité plus haut et placez-le dans le dossier du projet, sans renommer le fichier. Lancez enfin le script ``new_word.py``, qui prend quelques secondes. Cela va générer un fichier ``cemantix.txt`` en conservant un historique daté dans le dossier ``history``, qui permettra au serveur de connaître les différents scores de chaque mot, sans avoir à les recalculer à la volée. Enfin, il suffit de lancer le serveur ``./cemantix-charm`` pour lancer le serveur SSH du jeu. Cela ouvre un serveur SSH sur le port 2200 écoutant sur toutes les adresses, avec des clés stockées dans un dossier ``.ssh`` créé si ce n'était pas déjà fait. On peut enfin jouer en lançant ``ssh -p 2200 localhost``. N'hésitez pas à actualiser votre configuration pare-feu pour permettre d'éventuelles connexions depuis l'extérieur. À l'heure actuelle, il n'est pas possible de configurer le serveur, notamment les adresses et les ports d'écoute. Vous pouvez ensuite définir par exemple un cron qui vient appeler le script ``new_word.py`` toutes les nuits, pour redéfinir le nouveau mot à trouver. Il n'est pas nécessaire de redémarrer le serveur. ## Développement Le projet est réalisé en Go (sauf la partie traitement des mots qui est faite en Python), en utilisant beaucoup le framework *BubbleTea* ainsi que l'intégration SSH *Wish*, de la suite libre [charm.sh](https://charm.sh). ## J'ai un problème / une suggestion N'hésitez pas à ouvrir un ticket si vous le pouvez, ou à envoyer un mail à l'adresse ynerant+cemantix@crans.org :)