diff --git a/.ipynb_checkpoints/gutenberg-download-checkpoint.ipynb b/.ipynb_checkpoints/gutenberg-download-checkpoint.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..6d231391cf8bd1ea2f2df4a6a6500344ec45c411 --- /dev/null +++ b/.ipynb_checkpoints/gutenberg-download-checkpoint.ipynb @@ -0,0 +1,726 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "0315e71a", + "metadata": {}, + "source": [ + "## Query Gutenberg project data\n", + "\n", + "Source: https://github.com/raduangelescu/gutenbergpy/tree/master\n" + ] + }, + { + "cell_type": "markdown", + "id": "441964c9", + "metadata": {}, + "source": [ + "### Gutenberg Project SQLite Database\n", + "\n", + "<img src=\"sqlitecheme.png\" width=\"600\" >\n", + "\n", + "Source: https://github.com/raduangelescu/gutenbergpy/tree/master" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "ec28ca0b", + "metadata": {}, + "outputs": [], + "source": [ + "#! pip3 install gutenbergpy" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "e16128ee", + "metadata": {}, + "outputs": [], + "source": [ + "import gutenbergpy.textget" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "9ea15819", + "metadata": {}, + "outputs": [], + "source": [ + "def usage_example(tid):\n", + " # This gets a book by its gutenberg id number\n", + " raw_book = gutenbergpy.textget.get_text_by_id(tid) # with headers\n", + " clean_book = gutenbergpy.textget.strip_headers(raw_book) # without headers\n", + " return clean_book, raw_book" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c01a6cb4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Example phrase from the raw book: The Project Gutenberg eBook of La Dame aux camélias, by Alexandre Dumas, fils\n", + "\n", + "This eBook is for the use of anyone anywhere in the United States and\n", + "most other parts of the world at no cost and with almost no restrictions\n", + "whatsoever. You may copy it, give it away or re-use it under the terms\n", + "of the Project Gutenberg License included with this eBook or online at\n", + "www.gutenberg.org. If you are not located in the United States, you\n", + "will have to check the laws of the country where you are located before\n", + "using this eBook.\n", + "\n", + "Title: La Dame aux camélias\n", + "\n", + "Author: Alexandre Dumas, fils\n", + "\n", + "Release Date: December, 2000 [eBook #2419]\n", + "[Most recently updated: April 29, 2022]\n", + "\n", + "Language: French\n", + "\n", + "Character set encoding: UTF-8\n", + "\n", + "Produced by: Walter Debeuf\n", + "\n", + "*** START OF THE PROJECT GUTENBERG EBOOK LA DAME AUX CAMÉLIAS ***\n", + "\n", + "\n", + "\n", + "\n", + "LA DAME AUX CAMÉLIAS\n", + "\n", + "par Alexandre Dumas, fils\n", + "\n", + "\n", + "\n", + "\n", + "Chapitre I\n", + "\n", + "\n", + "Mon avis est qu'on ne peut créer des personnages que lorsque l'on a\n", + "beaucoup étudié les hommes, comme on ne peut parler une langue qu'à la\n", + "condition de l'avoir sérieusement apprise.\n", + "\n", + "N'ayant pas encore l'âge où l'on invente, je me contente de raconter.\n", + "\n", + "J'engage donc le lecteur à être convaincu de la réalité de cette\n", + "histoire, dont tous les personnages, à l'exception de l'héroïne, vivent\n", + "encore.\n", + "\n", + "D'ailleurs, il y a à Paris des témoins de la plupart des faits que je\n", + "recueille ici, et qui pourraient les confirmer, si mon témoignage ne\n", + "suffisait pas. Par une circonstance particulière, seul je pouvais les\n", + "écrire, car seul j'ai été le confident des derniers détails sans\n", + "lesquels il eût été impossible de faire un récit intéressant et complet.\n", + "\n", + "Or, voici comment ces détails sont parvenus à ma connaissance.--Le 12 du\n", + "mois de mars 1847, je lus, dans la rue Laffitte, une grande affiche\n", + "jaune annonçant une vente de meubles et de riches objets de curiosité.\n", + "Cette vente avait lieu après décès. L'affiche ne nommait pas la personne\n", + "morte, mais la vente devait se faire rue d'Antin, nº 9, le 16, de midi à\n", + "cinq heures.\n", + "\n", + "L'affiche portait en outre que l'on pourrait, le 13 et le 14, visiter\n", + "l'appartement et les meubles.\n", + "\n", + "J'ai toujours été amateur de curiosités. Je me promis de ne pas manquer\n", + "cette occasion, sinon d'en acheter, du moins d'en voir.\n", + "\n", + "Le lendemain, je me rendis rue d'Antin, nº 9.\n", + "\n", + "Il était de bonne heure, et cependant il y avait déjà dans l'appartement\n", + "des visiteurs et même des visiteuses, qui, quoique vêtues de velours,\n", + "couvertes de cachemires et attendues à la porte par leurs élégants\n", + "coupés, regardaient avec étonnement, avec admiration même, le luxe qui\n", + "s'étalait sous leurs yeux.\n", + "\n", + "Plus tard, je compris cette admiration et cet étonnement, car, m'étant\n", + "mis aussi à examiner, je reconnus aisément que j'étais dans\n", + "l'appartement d'une femme entretenue. Or, s'il y a une chose que les\n", + "femmes du monde désirent voir, et il y avait là des femmes du monde,\n", + "c'est l'intérieur de ces femmes, dont les équipages éclaboussent chaque\n", + "jour le leur, qui ont, comme elles et à côté d'elles, leur loge à\n", + "l'Opéra et aux Italiens, et qui étalent, à Paris, l'insolente opulence\n", + "de leur beauté, de leurs bijoux et de leurs scandales.\n", + "\n", + "Celle chez qui je me trouvais était morte: les femmes les plus\n", + "vertueuses pouvaient donc pénétrer jusque dans sa chambre. La mort avait\n", + "purifié l'air de ce cloaque splendide, et d'ailleurs elles avaient pour\n", + "excuse, s'il en était besoin, qu'elles venaient à une vente sans savoir\n", + "chez qui elles venaient. Elles avaient lu des affiches, elles voulaient\n", + "visiter ce que ces affiches promettaient et faire leur choix à l'avance;\n", + "rien de plus simple; ce qui ne les empêchait pas de chercher, au milieu\n", + "de toutes ces merveilles, les traces de cette vie de courtisane dont on\n", + "leur avait fait, sans doute, de si étranges récits.\n", + "\n", + "Malheureusement les mystères étaient morts avec la déesse, et, malgré\n", + "toute leur bonne volonté, ces dames ne surprirent que ce qui était à\n", + "vendre depuis le décès, et rien de ce qui se vendait du vivant de la\n", + "locataire.\n", + "\n", + "Du reste, il y avait de quoi faire des emplettes. Le mobilier était\n", + "superbe. Meubles de bois de rose et de Boule, vases de Sèvres et de\n", + "Chine, statuettes de Saxe, satin, velours et dentelle, rien n'y\n", + "manquait.\n", + "\n", + "Je me promenai dans l'appartement et je suivis les nobles curieuses qui\n", + "m'y avaient précédé. Elles entrèrent dans une chambre tendue d'étoffe\n", + "perse, et j'allais y entrer aussi, quand elles en sortirent presque\n", + "aussitôt en souriant et comme si elles eussent eu honte de cette\n", + "nouvelle curiosité. Je n'en désirai que plus vivement pénétrer dans\n", + "cette chambre. C'était le cabinet de toilette, revêtu de ses plus\n", + "minutieux détails, dans lesquels paraissait s'être développée au plus\n", + "haut point la prodigalité de la morte.\n", + "\n", + "Sur une grande table, adossée au mur, table de trois pieds de large sur\n", + "six de long, brillaient tous les trésors d'Aucoc et d'Odiot. C'était là\n", + "une magnifique collection, et pas un de ces mille objets, si nécessaires\n", + "à la toilette d'une femme comme celle chez qui nous étions, n'était en\n", + "autre métal qu'or ou argent. Cependant cette collection n'avait pu se\n", + "faire que peu à peu, et ce n'était pas le même amour qui l'avait\n", + "complétée.\n", + "\n", + "Moi qui ne m'effarouchais pas à la vue du cabinet de toilette d'une\n", + "femme entretenue, je m'amusais à en examiner les détails, quels qu'ils\n", + "fussent, et je m'aperçus que tous ces ustensiles magnifiquement ciselés\n", + "portaient des initiales variées et des couronnes différentes.\n", + "\n", + "Je regardais toutes ces choses dont chacune me représentait une\n", + "prostitution de la pauvre fille, et je me disais que Dieu avait été\n", + "clément pour elle, puisqu'il n'avait pas permis qu'elle en arrivât au\n", + "châtiment ordinaire, et qu'il l'avait laissée mourir dans son luxe et sa\n", + "beauté, avant la vieillesse, cette première mort des courtisanes.\n", + "\n", + "En effet, quoi de plus triste à voir que la vieillesse du vice, surtout\n", + "chez la femme? Elle ne renferme aucune dignité et n'inspire aucun\n", + "intérêt. Ce repentir éternel, non pas de la mauvaise route suivie, mais\n", + "des calculs mal faits et de l'argent mal employé, est une des plus\n", + "attristantes choses que l'on puisse entendre. J'ai connu une ancienne\n", + "femme galante à qui il ne restait plus de son passé qu'une fille presque\n", + "aussi belle que, au dire de ses contemporains, avait été sa mère. Cette\n", + "pauvre enfant à qui sa mère n'avait jamais dit: tu es ma fille, que pour\n", + "lui ordonner de nourrir sa vieillesse comme elle-même avait nourri son\n", + "enfance, cette pauvre créature se nommait Louise, et, obéissant à sa\n", + "mère, elle se livrait sans volonté, sans passion, sans plaisir, comme\n", + "elle eût fait un métier\n" + ] + } + ], + "source": [ + "cleaned_book, raw_book = usage_example(2419)\n", + "\n", + "# Raw Book\n", + "raw_book = \" \".join(str(raw_book, 'utf-8').split(\" \")[0:1000])\n", + "\n", + "print(f'Example phrase from the raw book: {raw_book}')" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "1d6385f5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Example phrase from the cleaned book: \n", + "\n", + "\n", + "\n", + "LA DAME AUX CAMÉLIAS\n", + "\n", + "par Alexandre Dumas, fils\n", + "\n", + "\n", + "\n", + "\n", + "Chapitre I\n", + "\n", + "\n", + "Mon avis est qu'on ne peut créer des personnages que lorsque l'on a\n", + "beaucoup étudié les hommes, comme on ne peut parler une langue qu'à la\n", + "condition de l'avoir sérieusement apprise.\n", + "\n", + "N'ayant pas encore l'âge où l'on invente, je me contente de raconter.\n", + "\n", + "J'engage donc le lecteur à être convaincu de la réalité de cette\n", + "histoire, dont tous les personnages, à l'exception de l'héroïne, vivent\n", + "encore.\n", + "\n", + "D'ailleurs, il y a à Paris des témoins de la plupart des faits que je\n", + "recueille ici, et qui pourraient les confirmer, si mon témoignage ne\n", + "suffisait pas. Par une circonstance particulière, seul je pouvais les\n", + "écrire, car seul j'ai été le confident des derniers détails sans\n", + "lesquels il eût été impossible de faire un récit intéressant et complet.\n", + "\n", + "Or, voici comment ces détails sont parvenus à ma connaissance.--Le 12 du\n", + "mois de mars 1847, je lus, dans la rue Laffitte, une grande affiche\n", + "jaune annonçant une vente de meubles et de riches objets de curiosité.\n", + "Cette vente avait lieu après décès. L'affiche ne nommait pas la personne\n", + "morte, mais la vente devait se faire rue d'Antin, nº 9, le 16, de midi à\n", + "cinq heures.\n", + "\n", + "L'affiche portait en outre que l'on pourrait, le 13 et le 14, visiter\n", + "l'appartement et les meubles.\n", + "\n", + "J'ai toujours été amateur de curiosités. Je me promis de ne pas manquer\n", + "cette occasion, sinon d'en acheter, du moins d'en voir.\n", + "\n", + "Le lendemain, je me rendis rue d'Antin, nº 9.\n", + "\n", + "Il était de bonne heure, et cependant il y avait déjà dans l'appartement\n", + "des visiteurs et même des visiteuses, qui, quoique vêtues de velours,\n", + "couvertes de cachemires et attendues à la porte par leurs élégants\n", + "coupés, regardaient avec étonnement, avec admiration même, le luxe qui\n", + "s'étalait sous leurs yeux.\n", + "\n", + "Plus tard, je compris cette admiration et cet étonnement, car, m'étant\n", + "mis aussi à examiner, je reconnus aisément que j'étais dans\n", + "l'appartement d'une femme entretenue. Or, s'il y a une chose que les\n", + "femmes du monde désirent voir, et il y avait là des femmes du monde,\n", + "c'est l'intérieur de ces femmes, dont les équipages éclaboussent chaque\n", + "jour le leur, qui ont, comme elles et à côté d'elles, leur loge à\n", + "l'Opéra et aux Italiens, et qui étalent, à Paris, l'insolente opulence\n", + "de leur beauté, de leurs bijoux et de leurs scandales.\n", + "\n", + "Celle chez qui je me trouvais était morte: les femmes les plus\n", + "vertueuses pouvaient donc pénétrer jusque dans sa chambre. La mort avait\n", + "purifié l'air de ce cloaque splendide, et d'ailleurs elles avaient pour\n", + "excuse, s'il en était besoin, qu'elles venaient à une vente sans savoir\n", + "chez qui elles venaient. Elles avaient lu des affiches, elles voulaient\n", + "visiter ce que ces affiches promettaient et faire leur choix à l'avance;\n", + "rien de plus simple; ce qui ne les empêchait pas de chercher, au milieu\n", + "de toutes ces merveilles, les traces de cette vie de courtisane dont on\n", + "leur avait fait, sans doute, de si étranges récits.\n", + "\n", + "Malheureusement les mystères étaient morts avec la déesse, et, malgré\n", + "toute leur bonne volonté, ces dames ne surprirent que ce qui était à\n", + "vendre depuis le décès, et rien de ce qui se vendait du vivant de la\n", + "locataire.\n", + "\n", + "Du reste, il y avait de quoi faire des emplettes. Le mobilier était\n", + "superbe. Meubles de bois de rose et de Boule, vases de Sèvres et de\n", + "Chine, statuettes de Saxe, satin, velours et dentelle, rien n'y\n", + "manquait.\n", + "\n", + "Je me promenai dans l'appartement et je suivis les nobles curieuses qui\n", + "m'y avaient précédé. Elles entrèrent dans une chambre tendue d'étoffe\n", + "perse, et j'allais y entrer aussi, quand elles en sortirent presque\n", + "aussitôt en souriant et comme si elles eussent eu honte de cette\n", + "nouvelle curiosité. Je n'en désirai que plus vivement pénétrer dans\n", + "cette chambre. C'était le cabinet de toilette, revêtu de ses plus\n", + "minutieux détails, dans lesquels paraissait s'être développée au plus\n", + "haut point la prodigalité de la morte.\n", + "\n", + "Sur une grande table, adossée au mur, table de trois pieds de large sur\n", + "six de long, brillaient tous les trésors d'Aucoc et d'Odiot. C'était là\n", + "une magnifique collection, et pas un de ces mille objets, si nécessaires\n", + "à la toilette d'une femme comme celle chez qui nous étions, n'était en\n", + "autre métal qu'or ou argent. Cependant cette collection n'avait pu se\n", + "faire que peu à peu, et ce n'était pas le même amour qui l'avait\n", + "complétée.\n", + "\n", + "Moi qui ne m'effarouchais pas à la vue du cabinet de toilette d'une\n", + "femme entretenue, je m'amusais à en examiner les détails, quels qu'ils\n", + "fussent, et je m'aperçus que tous ces ustensiles magnifiquement ciselés\n", + "portaient des initiales variées et des couronnes différentes.\n", + "\n", + "Je regardais toutes ces choses dont chacune me représentait une\n", + "prostitution de la pauvre fille, et je me disais que Dieu avait été\n", + "clément pour elle, puisqu'il n'avait pas permis qu'elle en arrivât au\n", + "châtiment ordinaire, et qu'il l'avait laissée mourir dans son luxe et sa\n", + "beauté, avant la vieillesse, cette première mort des courtisanes.\n", + "\n", + "En effet, quoi de plus triste à voir que la vieillesse du vice, surtout\n", + "chez la femme? Elle ne renferme aucune dignité et n'inspire aucun\n", + "intérêt. Ce repentir éternel, non pas de la mauvaise route suivie, mais\n", + "des calculs mal faits et de l'argent mal employé, est une des plus\n", + "attristantes choses que l'on puisse entendre. J'ai connu une ancienne\n", + "femme galante à qui il ne restait plus de son passé qu'une fille presque\n", + "aussi belle que, au dire de ses contemporains, avait été sa mère. Cette\n", + "pauvre enfant à qui sa mère n'avait jamais dit: tu es ma fille, que pour\n", + "lui ordonner de nourrir sa vieillesse comme elle-même avait nourri son\n", + "enfance, cette pauvre créature se nommait Louise, et, obéissant à sa\n", + "mère, elle se livrait sans volonté, sans passion, sans plaisir, comme\n", + "elle eût fait un métier si l'on eût songé à lui en apprendre un.\n", + "\n", + "La vue continuelle de la débauche, une débauche précoce, alimentée par\n", + "l'état continuellement maladif de cette fille, avait éteint en elle\n", + "l'intelligence du mal et du bien que Dieu lui avait donnée peut-être,\n", + "mais qu'il n'était venu à l'idée de personne de développer.\n", + "\n", + "Je me rappellerai toujours cette jeune fille, qui passait sur les\n", + "boulevards presque tous les jours à la même heure. Sa mère\n", + "l'accompagnait sans cesse, aussi assidûment qu'une vraie mère eût\n", + "accompagné sa vraie fille. J'étais bien jeune alors, et prêt à accepter\n", + "pour moi la facile morale de mon siècle. Je me souviens cependant que la\n", + "vue de cette surveillance scandaleuse m'inspirait le mépris et le\n", + "dégoût.\n", + "\n", + "Joignez à cela que jamais visage de vierge n'eut un pareil sentiment\n", + "d'innocence, une pareille\n" + ] + } + ], + "source": [ + "# Cleaned Book\n", + "cleaned_book = \" \".join(str(cleaned_book, 'utf-8').split(\" \")[0:1000])\n", + "\n", + "print(f'Example phrase from the cleaned book: {cleaned_book}')\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "d1ce9c82", + "metadata": {}, + "source": [ + "### Query Gutenberg Database (SQLite)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "78b86a1c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "' create Gutenberg database\\nAttention! This needs to be done just once for an OS and it roughly takes 20 minutes '" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from gutenbergpy.gutenbergcache import GutenbergCache\n", + "\n", + "\"\"\" create Gutenberg database\n", + "Attention! This needs to be done just once for an OS and it roughly takes 20 minutes \"\"\"\n", + "# GutenbergCache.create(refresh=False, download=False, \\\n", + " #unpack=False, parse=True, cache=True, deleteTemp=True)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "ca9f49f5", + "metadata": {}, + "outputs": [], + "source": [ + "#for sqlite\n", + "cache = GutenbergCache.get_cache()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "52b3bb4a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(0,)]\n" + ] + } + ], + "source": [ + "res = cache.native_query(\"PRAGMA foreign_keys\")\n", + "k = res.fetchall()\n", + "print(k)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "f81f5dfc", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('types',), ('sqlite_sequence',), ('titles',), ('subjects',), ('rights',), ('publishers',), ('languages',), ('downloadlinkstype',), ('downloadlinks',), ('bookshelves',), ('books',), ('book_subjects',), ('book_authors',), ('authors',)]\n" + ] + } + ], + "source": [ + "#show list of tables\n", + "res = cache.native_query(\"SELECT name FROM sqlite_master WHERE type='table'\") # WHERE type = \"table\";')\n", + "k = res.fetchall()\n", + "print(k)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "fdf01c69", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(0, 'id', 'INTEGER', 0, None, 1), (1, 'publisherid', 'INTEGER', 0, None, 0), (2, 'dateissued', 'DATE', 0, None, 0), (3, 'rightsid', 'INTEGER', 0, None, 0), (4, 'numdownloads', 'INTEGER', 0, None, 0), (5, 'languageid', 'INTEGER', 0, None, 0), (6, 'bookshelveid', 'INTEGER', 0, None, 0), (7, 'gutenbergbookid', 'INTEGER', 0, None, 0), (8, 'typeid', 'INTEGER', 0, None, 0)]\n" + ] + } + ], + "source": [ + "# show columns from table books\n", + "res = cache.native_query(\"PRAGMA table_info(books)\")\n", + "print(res.fetchall())" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "a31b4e73", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(0, 'id', 'INTEGER', 0, None, 1), (1, 'name', 'TEXT', 0, None, 0)]\n" + ] + } + ], + "source": [ + "# show columns from table languages\n", + "res = cache.native_query(\"PRAGMA table_info(languages)\")\n", + "print(res.fetchall())\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "4d85e390", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(0, 'id', 'INTEGER', 0, None, 1), (1, 'name', 'TEXT', 0, None, 0)]\n" + ] + } + ], + "source": [ + "# show columns from table authors\n", + "res = cache.native_query(\"PRAGMA table_info(authors)\")\n", + "print(res.fetchall())" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "63e2231a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(0, 'id', 'INTEGER', 0, None, 1), (1, 'publisherid', 'INTEGER', 0, None, 0), (2, 'dateissued', 'DATE', 0, None, 0), (3, 'rightsid', 'INTEGER', 0, None, 0), (4, 'numdownloads', 'INTEGER', 0, None, 0), (5, 'languageid', 'INTEGER', 0, None, 0), (6, 'bookshelveid', 'INTEGER', 0, None, 0), (7, 'gutenbergbookid', 'INTEGER', 0, None, 0), (8, 'typeid', 'INTEGER', 0, None, 0)]\n" + ] + } + ], + "source": [ + "# show columns from table books\n", + "res = cache.native_query(\"PRAGMA table_info(books)\")\n", + "print(res.fetchall())" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "bb4dc1f4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(4,)]\n" + ] + } + ], + "source": [ + "# French has languageid 4\n", + "res = cache.native_query(\"SELECT id FROM languages WHERE name='fr'\")\n", + "print(res.fetchall())" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "c1a748a6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(734, 'Flaubert, Gustave')]\n" + ] + } + ], + "source": [ + "# Alexander Dumas ids\n", + "res = cache.native_query(\"SELECT * FROM authors WHERE name LIKE '%Flaubert,%'\")\n", + "print(res.fetchall())" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "2947fc5d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(13819, 'Les compagnons de Jéhu', 4), (13819, 'Les compagnons de Jéhu', 4), (13819, 'Les compagnons de Jéhu', 4), (13819, 'Les compagnons de Jéhu', 4), (13856, 'La reine Margot - Tome I', 4), (13856, 'La reine Margot - Tome I', 4), (13856, 'La reine Margot - Tome I', 4), (13856, 'La reine Margot - Tome I', 4), (13857, 'La reine Margot - Tome II', 4), (13857, 'La reine Margot - Tome II', 4), (13857, 'La reine Margot - Tome II', 4), (13857, 'La reine Margot - Tome II', 4), (13947, 'Le vicomte de Bragelonne, Tome I.', 4), (13947, 'Le vicomte de Bragelonne, Tome I.', 4), (13947, 'Le vicomte de Bragelonne, Tome I.', 4), (13947, 'Le vicomte de Bragelonne, Tome I.', 4), (13948, 'Le vicomte de Bragelonne, Tome II.', 4), (13948, 'Le vicomte de Bragelonne, Tome II.', 4), (13948, 'Le vicomte de Bragelonne, Tome II.', 4), (13948, 'Le vicomte de Bragelonne, Tome II.', 4), (13949, 'Le vicomte de Bragelonne, Tome III.', 4), (13949, 'Le vicomte de Bragelonne, Tome III.', 4), (13949, 'Le vicomte de Bragelonne, Tome III.', 4), (13949, 'Le vicomte de Bragelonne, Tome III.', 4), (13950, 'Le vicomte de Bragelonne, Tome IV.', 4), (13950, 'Le vicomte de Bragelonne, Tome IV.', 4), (13950, 'Le vicomte de Bragelonne, Tome IV.', 4), (13950, 'Le vicomte de Bragelonne, Tome IV.', 4), (13951, 'Les trois mousquetaires', 4), (13951, 'Les trois mousquetaires', 4), (13951, 'Les trois mousquetaires', 4), (13951, 'Les trois mousquetaires', 4), (13952, 'Vingt ans après', 4), (13952, 'Vingt ans après', 4), (13952, 'Vingt ans après', 4), (13952, 'Vingt ans après', 4), (15208, 'Les mille et un fantômes', 4), (15208, 'Les mille et un fantômes', 4), (15208, 'Les mille et un fantômes', 4), (15208, 'Les mille et un fantômes', 4), (15574, 'Le capitaine Paul', 4), (15574, 'Le capitaine Paul', 4), (15574, 'Le capitaine Paul', 4), (15574, 'Le capitaine Paul', 4), (17693, 'La San-Felice, Tome 01', 4), (17693, 'La San-Felice, Tome 01', 4), (17693, 'La San-Felice, Tome 01', 4), (17693, 'La San-Felice, Tome 01', 4), (17989, 'Le comte de Monte-Cristo, Tome I', 4), (17989, 'Le comte de Monte-Cristo, Tome I', 4), (17989, 'Le comte de Monte-Cristo, Tome I', 4), (17989, 'Le comte de Monte-Cristo, Tome I', 4), (17990, 'Le comte de Monte-Cristo, Tome II', 4), (17990, 'Le comte de Monte-Cristo, Tome II', 4), (17990, 'Le comte de Monte-Cristo, Tome II', 4), (17990, 'Le comte de Monte-Cristo, Tome II', 4), (17991, 'Le comte de Monte-Cristo, Tome III', 4), (17991, 'Le comte de Monte-Cristo, Tome III', 4), (17991, 'Le comte de Monte-Cristo, Tome III', 4), (17991, 'Le comte de Monte-Cristo, Tome III', 4), (17992, 'Le comte de Monte-Cristo, Tome IV', 4), (17992, 'Le comte de Monte-Cristo, Tome IV', 4), (17992, 'Le comte de Monte-Cristo, Tome IV', 4), (17992, 'Le comte de Monte-Cristo, Tome IV', 4), (18003, 'La femme au collier de velours', 4), (18003, 'La femme au collier de velours', 4), (18003, 'La femme au collier de velours', 4), (18003, 'La femme au collier de velours', 4), (18006, 'Le chevalier de Maison-Rouge', 4), (18006, 'Le chevalier de Maison-Rouge', 4), (18006, 'Le chevalier de Maison-Rouge', 4), (18006, 'Le chevalier de Maison-Rouge', 4), (18028, \"Le chevalier d'Harmental\", 4), (18028, \"Le chevalier d'Harmental\", 4), (18028, \"Le chevalier d'Harmental\", 4), (18028, \"Le chevalier d'Harmental\", 4), (18199, 'Le Collier de la Reine, Tome I', 4), (18199, 'Le Collier de la Reine, Tome I', 4), (18199, 'Le Collier de la Reine, Tome I', 4), (18199, 'Le Collier de la Reine, Tome I', 4), (18200, 'Le Collier de la Reine, Tome II', 4), (18200, 'Le Collier de la Reine, Tome II', 4), (18200, 'Le Collier de la Reine, Tome II', 4), (18200, 'Le Collier de la Reine, Tome II', 4), (18271, 'Georges', 4), (18271, 'Georges', 4), (18271, 'Georges', 4), (18271, 'Georges', 4), (18321, 'Acté', 4), (18321, 'Acté', 4), (18321, 'Acté', 4), (18321, 'Acté', 4), (18401, 'La San-Felice, Tome 02', 4), (18401, 'La San-Felice, Tome 02', 4), (18401, 'La San-Felice, Tome 02', 4), (18401, 'La San-Felice, Tome 02', 4), (18402, 'La San-Felice, Tome 03', 4), (18402, 'La San-Felice, Tome 03', 4), (18402, 'La San-Felice, Tome 03', 4), (18402, 'La San-Felice, Tome 03', 4), (18586, 'La San-Felice, Tome 04', 4), (18586, 'La San-Felice, Tome 04', 4), (18586, 'La San-Felice, Tome 04', 4), (18586, 'La San-Felice, Tome 04', 4), (18697, 'Le capitaine Pamphile', 4), (18697, 'Le capitaine Pamphile', 4), (18697, 'Le capitaine Pamphile', 4), (18697, 'Le capitaine Pamphile', 4), (18773, 'La San-Felice, Tome 05', 4), (18773, 'La San-Felice, Tome 05', 4), (18773, 'La San-Felice, Tome 05', 4), (18773, 'La San-Felice, Tome 05', 4), (18826, 'La San-Felice, Tome 06', 4), (18826, 'La San-Felice, Tome 06', 4), (18826, 'La San-Felice, Tome 06', 4), (18826, 'La San-Felice, Tome 06', 4), (1910, 'La Tulipe Noire', 4), (1910, 'La Tulipe Noire', 4), (1910, 'La Tulipe Noire', 4), (1910, 'La Tulipe Noire', 4), (21017, 'La San-Felice, Tome 08, Emma Lyonna, tome 4', 4), (21017, 'La San-Felice, Tome 08, Emma Lyonna, tome 4', 4), (21017, 'La San-Felice, Tome 08, Emma Lyonna, tome 4', 4), (21017, 'La San-Felice, Tome 08, Emma Lyonna, tome 4', 4), (21191, 'La San-Felice, Tome 09, Emma Lyonna, tome 5', 4), (21191, 'La San-Felice, Tome 09, Emma Lyonna, tome 5', 4), (21191, 'La San-Felice, Tome 09, Emma Lyonna, tome 5', 4), (21191, 'La San-Felice, Tome 09, Emma Lyonna, tome 5', 4), (2419, 'La dame aux camélias', 4), (26476, 'Création et rédemption, deuxième partie: La fille du marquis', 4), (26476, 'Création et rédemption, deuxième partie: La fille du marquis', 4), (26476, 'Création et rédemption, deuxième partie: La fille du marquis', 4), (26476, 'Création et rédemption, deuxième partie: La fille du marquis', 4), (26504, 'La tulipe noire', 4), (26504, 'La tulipe noire', 4), (26504, 'La tulipe noire', 4), (26504, 'La tulipe noire', 4), (2682, 'Henri III et sa Cour', 4), (2682, 'Henri III et sa Cour', 4), (2682, 'Henri III et sa Cour', 4), (2682, 'Henri III et sa Cour', 4), (29937, 'Les Femmes qui tuent et les Femmes qui votent', 4), (36812, 'Création et rédemption, première partie: Le docteur mystérieux', 4), (36812, 'Création et rédemption, première partie: Le docteur mystérieux', 4), (36812, 'Création et rédemption, première partie: Le docteur mystérieux', 4), (36812, 'Création et rédemption, première partie: Le docteur mystérieux', 4), (37771, 'Le comte de Moret', 4), (37771, 'Le comte de Moret', 4), (37771, 'Le comte de Moret', 4), (37771, 'Le comte de Moret', 4), (46747, 'Gabriel Lambert', 4), (46747, 'Gabriel Lambert', 4), (46747, 'Gabriel Lambert', 4), (46747, 'Gabriel Lambert', 4), (5104, \"Histoire d'un casse-noisette\", 4), (5104, \"Histoire d'un casse-noisette\", 4), (5104, \"Histoire d'un casse-noisette\", 4), (5104, \"Histoire d'un casse-noisette\", 4), (56054, 'Les trois mousquetaires, Volume 1 (of 2)', 4), (56054, 'Les trois mousquetaires, Volume 1 (of 2)', 4), (56054, 'Les trois mousquetaires, Volume 1 (of 2)', 4), (56054, 'Les trois mousquetaires, Volume 1 (of 2)', 4), (57019, 'Mémoires de Garibaldi, tome 1/2', 4), (57019, 'Mémoires de Garibaldi, tome 1/2', 4), (57019, 'Mémoires de Garibaldi, tome 1/2', 4), (57019, 'Mémoires de Garibaldi, tome 1/2', 4), (57454, 'Mémoires de Garibaldi, tome 2/2', 4), (57454, 'Mémoires de Garibaldi, tome 2/2', 4), (57454, 'Mémoires de Garibaldi, tome 2/2', 4), (57454, 'Mémoires de Garibaldi, tome 2/2', 4), (58211, 'Les trois mousquetaires, Volume 2 (of 2)', 4), (58211, 'Les trois mousquetaires, Volume 2 (of 2)', 4), (58211, 'Les trois mousquetaires, Volume 2 (of 2)', 4), (58211, 'Les trois mousquetaires, Volume 2 (of 2)', 4), (58427, 'La San-Felice, Tome 07, Emma Lyonna, tome 3', 4), (58427, 'La San-Felice, Tome 07, Emma Lyonna, tome 3', 4), (58427, 'La San-Felice, Tome 07, Emma Lyonna, tome 3', 4), (58427, 'La San-Felice, Tome 07, Emma Lyonna, tome 3', 4), (6319, 'Bric-à-brac', 4), (6319, 'Bric-à-brac', 4), (6319, 'Bric-à-brac', 4), (6319, 'Bric-à-brac', 4), (71510, 'Pauline et Pascal Bruno', 4), (71510, 'Pauline et Pascal Bruno', 4), (71510, 'Pauline et Pascal Bruno', 4), (71510, 'Pauline et Pascal Bruno', 4), (7770, 'Les quarante-cinq — Tome 1', 4), (7770, 'Les quarante-cinq — Tome 1', 4), (7770, 'Les quarante-cinq — Tome 1', 4), (7770, 'Les quarante-cinq — Tome 1', 4), (7771, 'Les quarante-cinq — Tome 2', 4), (7771, 'Les quarante-cinq — Tome 2', 4), (7771, 'Les quarante-cinq — Tome 2', 4), (7771, 'Les quarante-cinq — Tome 2', 4), (7772, 'Les quarante-cinq — Tome 3', 4), (7772, 'Les quarante-cinq — Tome 3', 4), (7772, 'Les quarante-cinq — Tome 3', 4), (7772, 'Les quarante-cinq — Tome 3', 4), (8692, 'Le Capitaine Aréna — Tome 2', 4), (8692, 'Le Capitaine Aréna — Tome 2', 4), (8692, 'Le Capitaine Aréna — Tome 2', 4), (8692, 'Le Capitaine Aréna — Tome 2', 4), (8693, 'Le Capitaine Aréna — Tome 1', 4), (8693, 'Le Capitaine Aréna — Tome 1', 4), (8693, 'Le Capitaine Aréna — Tome 1', 4), (8693, 'Le Capitaine Aréna — Tome 1', 4), (8863, 'Le Speronare', 4), (8863, 'Le Speronare', 4), (8863, 'Le Speronare', 4), (8863, 'Le Speronare', 4), (9262, 'Le corricolo', 4), (9262, 'Le corricolo', 4), (9262, 'Le corricolo', 4), (9262, 'Le corricolo', 4), (9637, 'La dame de Monsoreau — \\xadTome 1.', 4), (9637, 'La dame de Monsoreau — \\xadTome 1.', 4), (9637, 'La dame de Monsoreau — \\xadTome 1.', 4), (9637, 'La dame de Monsoreau — \\xadTome 1.', 4), (9638, 'La dame de Monsoreau — Tome 2.', 4), (9638, 'La dame de Monsoreau — Tome 2.', 4), (9638, 'La dame de Monsoreau — Tome 2.', 4), (9638, 'La dame de Monsoreau — Tome 2.', 4), (9639, 'La dame de Monsoreau — Tome 3.', 4), (9639, 'La dame de Monsoreau — Tome 3.', 4), (9639, 'La dame de Monsoreau — Tome 3.', 4), (9639, 'La dame de Monsoreau — Tome 3.', 4)]\n" + ] + } + ], + "source": [ + "# find all French books by Alexander Dumas\n", + "\n", + "que = \"SELECT t1.gutenbergbookid, t4.name, t1.languageid \\\n", + " FROM books t1 \\\n", + " JOIN titles t4 \\\n", + " ON t4.bookid = t1.id \\\n", + " JOIN book_authors t2 \\\n", + " ON t2.bookid = t1.id \\\n", + " JOIN authors t3 \\\n", + " ON t2.authorid = t3.id \\\n", + " WHERE (t2.authorid=2389 OR t2.authorid=2390 OR t2.authorid=2391 OR t2.authorid=2392) AND t1.languageid=4\"\n", + "# find all books by Alexander Dumas\n", + "res = cache.native_query(que)\n", + "rows = [r for r in res]\n", + "print(rows)" + ] + }, + { + "cell_type": "markdown", + "id": "59802752", + "metadata": {}, + "source": [ + "### Download texts and store them" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "34e0e858", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "\n", + "directory_name = 'data/gutenberg'\n", + "\n", + "# Create the directory\n", + "try:\n", + " os.mkdir(directory_name)\n", + " print(f\"Directory '{directory_name}' created successfully.\")\n", + "except FileExistsError:\n", + " print(f\"Directory '{directory_name}' already exists.\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5cf8b204", + "metadata": {}, + "outputs": [], + "source": [ + "def remove_duplicates(L1):\n", + " s = []\n", + " for i in L1:\n", + " if i not in s:\n", + " s.append(i)\n", + " return s" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0e9834a7", + "metadata": {}, + "outputs": [], + "source": [ + "rows = remove_duplicates(rows)\n", + "print(f\"Found '{ len(rows)}' titles\")\n", + "print(rows)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5c9c0df9", + "metadata": {}, + "outputs": [], + "source": [ + "#write data to files\n", + "\"\"\"\n", + "for x in rows:\n", + " gutenberg_bookid = x[0]\n", + " title = '_'.join(x[1].split( )) + '.txt'\n", + " title = title.replace(',', '').replace('\\\\', '').replace('/', '')\n", + " fpath = 'data/gutenberg/' + str(title)\n", + " cleaned_book, _ = usage_example(gutenberg_bookid)\n", + " cleaned_book = \" \".join(str(cleaned_book, 'utf-8').split(\" \"))\n", + " print(title)\n", + " with open(fpath, 'w') as f:\n", + " f.write(cleaned_book)\n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1b61b568", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/gutenberg-download.ipynb b/gutenberg-download.ipynb index e28a6d64b3725a613499162dc637f4acd1865710..6d231391cf8bd1ea2f2df4a6a6500344ec45c411 100644 --- a/gutenberg-download.ipynb +++ b/gutenberg-download.ipynb @@ -24,56 +24,17 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 1, "id": "ec28ca0b", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Defaulting to user installation because normal site-packages is not writeable\n", - "Collecting gutenbergpy\n", - " Using cached gutenbergpy-0.3.5-py3-none-any.whl.metadata (7.7 kB)\n", - "Collecting future>=0.15.2 (from gutenbergpy)\n", - " Using cached future-1.0.0-py3-none-any.whl.metadata (4.0 kB)\n", - "Collecting httpsproxy-urllib2 (from gutenbergpy)\n", - " Using cached httpsproxy_urllib2-1.0.tar.gz (28 kB)\n", - " Preparing metadata (setup.py) ... \u001b[?25ldone\n", - "\u001b[?25hCollecting lxml>=3.2.0 (from gutenbergpy)\n", - " Downloading lxml-5.3.2-cp311-cp311-manylinux_2_28_x86_64.whl.metadata (3.6 kB)\n", - "Collecting pymongo (from gutenbergpy)\n", - " Downloading pymongo-4.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (22 kB)\n", - "Requirement already satisfied: setuptools>=18.5 in /public/conda/Miniconda/envs/pytorch-2.6/lib/python3.11/site-packages (from gutenbergpy) (75.8.0)\n", - "Collecting chardet (from gutenbergpy)\n", - " Using cached chardet-5.2.0-py3-none-any.whl.metadata (3.4 kB)\n", - "Collecting dnspython<3.0.0,>=1.16.0 (from pymongo->gutenbergpy)\n", - " Using cached dnspython-2.7.0-py3-none-any.whl.metadata (5.8 kB)\n", - "Using cached gutenbergpy-0.3.5-py3-none-any.whl (22 kB)\n", - "Using cached future-1.0.0-py3-none-any.whl (491 kB)\n", - "Downloading lxml-5.3.2-cp311-cp311-manylinux_2_28_x86_64.whl (5.0 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m5.0/5.0 MB\u001b[0m \u001b[31m32.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hUsing cached chardet-5.2.0-py3-none-any.whl (199 kB)\n", - "Downloading pymongo-4.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB)\n", - "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.4/1.4 MB\u001b[0m \u001b[31m21.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", - "\u001b[?25hUsing cached dnspython-2.7.0-py3-none-any.whl (313 kB)\n", - "Building wheels for collected packages: httpsproxy-urllib2\n", - " Building wheel for httpsproxy-urllib2 (setup.py) ... \u001b[?25ldone\n", - "\u001b[?25h Created wheel for httpsproxy-urllib2: filename=httpsproxy_urllib2-1.0-py3-none-any.whl size=29293 sha256=ed7613c42cf109e546e11858b712eeb37d85f66a559d839be070aeb7abef9554\n", - " Stored in directory: /home/tatiana.bladier/.cache/pip/wheels/e6/5c/6b/790df3d7037e3d9aaf7a48d563626941f2f60198d2f1eef8d2\n", - "Successfully built httpsproxy-urllib2\n", - "Installing collected packages: httpsproxy-urllib2, lxml, future, dnspython, chardet, pymongo, gutenbergpy\n", - "Successfully installed chardet-5.2.0 dnspython-2.7.0 future-1.0.0 gutenbergpy-0.3.5 httpsproxy-urllib2-1.0 lxml-5.3.2 pymongo-4.12.0\n" - ] - } - ], + "outputs": [], "source": [ "#! pip3 install gutenbergpy" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "id": "e16128ee", "metadata": {}, "outputs": [], @@ -83,7 +44,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "id": "9ea15819", "metadata": {}, "outputs": [], @@ -97,7 +58,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "id": "c01a6cb4", "metadata": {}, "outputs": [ @@ -263,7 +224,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 5, "id": "1d6385f5", "metadata": {}, "outputs": [ @@ -428,7 +389,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "id": "78b86a1c", "metadata": {}, "outputs": [ @@ -438,7 +399,7 @@ "' create Gutenberg database\\nAttention! This needs to be done just once for an OS and it roughly takes 20 minutes '" ] }, - "execution_count": 8, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -454,7 +415,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 7, "id": "ca9f49f5", "metadata": {}, "outputs": [], @@ -465,7 +426,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 8, "id": "52b3bb4a", "metadata": {}, "outputs": [ @@ -485,7 +446,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 9, "id": "f81f5dfc", "metadata": {}, "outputs": [ @@ -506,7 +467,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 10, "id": "fdf01c69", "metadata": {}, "outputs": [ @@ -526,7 +487,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 11, "id": "a31b4e73", "metadata": {}, "outputs": [ @@ -546,7 +507,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 12, "id": "4d85e390", "metadata": {}, "outputs": [ @@ -566,7 +527,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 13, "id": "63e2231a", "metadata": {}, "outputs": [ @@ -586,7 +547,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 14, "id": "bb4dc1f4", "metadata": {}, "outputs": [ @@ -614,13 +575,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "[(615, 'Hugo, Victor Marie, comte'), (616, 'Hugo, Víctor'), (617, 'Hugo, Victor'), (22247, 'Throssell, Hugo, Mrs.')]\n" + "[(734, 'Flaubert, Gustave')]\n" ] } ], "source": [ "# Alexander Dumas ids\n", - "res = cache.native_query(\"SELECT * FROM authors WHERE name LIKE '%Hugo,%'\")\n", + "res = cache.native_query(\"SELECT * FROM authors WHERE name LIKE '%Flaubert,%'\")\n", "print(res.fetchall())" ] }, diff --git a/gutenberg-preprocess-data.ipynb b/gutenberg-preprocess-data.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..6fa01e12ea9b2013e504ea045c566466ff5a470a --- /dev/null +++ b/gutenberg-preprocess-data.ipynb @@ -0,0 +1,889 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "75eff004", + "metadata": {}, + "source": [ + "## Sentence segmentation and tokenization with SpaCy UDPipe" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "12f2533d", + "metadata": {}, + "outputs": [], + "source": [ + "#! pip install spacy-udpipe\n", + "#! pip install pip install stanza -U\n", + "import spacy_udpipe\n", + "import os\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "0039ad52", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/tatiana.bladier/.local/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], + "source": [ + "import spacy\n", + "from spacy.language import Language\n", + "\n", + "nlp = spacy_udpipe.load(\"fr\")\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "728329cd", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<spacy.pipeline.dep_parser.DependencyParser at 0x7f356c2670d0>" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@Language.component(\"set_custom_boundaries\")\n", + "def set_custom_boundaries(doc):\n", + " for token in doc[:-1]:\n", + " if token.text in [\"; \", \" ; \", \" ;\"]:\n", + " doc[token.i + 1].is_sent_start = False\n", + " return doc\n", + "nlp.add_pipe(\"parser\")\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "8d4237bf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<thinc.optimizers.Optimizer at 0x7f3472e77420>" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nlp.add_pipe(\"set_custom_boundaries\", first=True)\n", + "\n", + "nlp.initialize()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "5219a6ea", + "metadata": {}, + "outputs": [], + "source": [ + "\"\"\"\n", + "text = \"Celui qui chantait seul, et qui paraissait le maître du bâtiment, se tenait debout \\\n", + " à la proue et s'accompagnait d'une cythare à trois cordes, pareille à \\\n", + " celle que les statuaires mettent aux mains d'Euterpe, la muse de \\\n", + " l'harmonie.\"\n", + "\n", + "\n", + "text = \"C'est un magnifique enfant du Darfour, noir comme un charbon et qui a \\\n", + " déjà l'air d'un homme, quoiqu'il n'ait, selon toute probabilité, que \\\n", + " onze ou douze ans. Je dis _selon toute probabilité_, parce qu'il n'y a \\\n", + " pas d'exemple qu'un nègre sache son âge. Celui-là... Pardon, \\\n", + " j'oubliais de vous dire son nom. Il se nomme Abailard.\"\n", + "\n", + "\n", + "text = 'Il y a un an à peu près qu’en faisant à la Bibliothèque royale des \\\n", + " recherches pour mon histoire de Louis XIV, je tombai par hasard sur les \\\n", + " _Mémoires de M. d’Artagnan_, imprimés,--comme la plus grande partie des \\\n", + " ouvrages de cette époque, où les auteurs tenaient à dire la vérité sans \\\n", + " aller faire un tour plus ou moins long à la Bastille,--à Amsterdam, \\\n", + " chez Pierre Rouge. Le titre me séduisit: je les emportai chez moi, \\\n", + " avec la permission de M. le conservateur, bien entendu, et je les \\\n", + " dévorai.'\n", + "\n", + "\n", + "text = \"Un jeune homme...--traçons son portrait d’un seul trait de \\\n", + "plume:--figurez-vous don Quichotte à dix-huit ans; don Quichotte \\\n", + "décorselé, sans haubert et sans cuissards.\"\n", + "\n", + "\n", + "text = \"Nous avons pris possesion de 2 chambres cabines ayant les toilettes en commun: poussière et saleté étaient au rendez-vous!\"\n", + "\"\"\"\n", + "\n", + "text = \"Un jeune homme...--traçons son portrait d’un seul trait de \\\n", + "plume:--figurez-vous don Quichotte à dix-huit ans; don Quichotte \\\n", + "décorselé, sans haubert et sans cuissards. Un instant elle balança entre \\\n", + "les violettes et les glaïeuls que lui offrait l'ombrage des arbres de \\\n", + "Minerve, et les narcisses et les nymphéas qui s'élevaient sur les bords \\\n", + "du petit fleuve ou flottaient à sa surface; mais bientôt elle se décida \\\n", + "pour ceux-ci, et, bondissant comme un jeune faon, elle courut vers le \\\n", + "ruisseau.\"" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "1218955c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "After: ['Un jeune homme...--traçons son portrait d’un seul trait de plume:--figurez-vous don Quichotte à dix-huit ans; don Quichotte décorselé, sans haubert et sans cuissards.', \"Un instant elle balança entre les violettes et les glaïeuls que lui offrait l'ombrage de les arbres de Minerve, et les narcisses et les nymphéas qui s'élevaient sur les bords de le petit fleuve ou flottaient à sa surface; mais bientôt elle se décida pour ceux-ci, et, bondissant comme un jeune faon, elle courut vers le ruisseau.\"]\n" + ] + } + ], + "source": [ + "doc1 = nlp(text)\n", + "sentences = [sent.text for sent in doc1.sents]\n", + "\n", + "\n", + "print(\"After:\", [sent.text for sent in doc1.sents])" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "1b99da40", + "metadata": {}, + "outputs": [], + "source": [ + "def nlpdoc_to_conll(nlpdoc):\n", + " sent_length = len([token.text for token in nlpdoc])\n", + " conll_lst = []\n", + " \n", + " # Preliminary: whole sentence\n", + " whole_sentence = nlpdoc.text\n", + " #print('# text =', whole_sentence) \n", + " \n", + " \n", + " i = 1\n", + " for token in nlpdoc:\n", + " line_str = str(token.i +1) + \"\\t\" + str(token.text) + \"\\t\" + str(token.lemma_) \\\n", + " + \"\\t\" + str(token.pos_) + \"\\t\" + '_' + \"\\t\" \\\n", + " + str(token.morph) + \"\\t\" + str(token.head.i + 1) + \"\\t\" \\\n", + " + str(token.dep_) + \"\\t\" + '_' + \"\\t\" + '_'\n", + " conll_lst.append(line_str)\n", + " i += 1\n", + " conll_str = '\\n'.join(conll_lst)\n", + " return conll_str\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "af17d1f7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\"1\\tUn\\tun\\tDET\\t_\\tDefinite=Ind|Gender=Masc|Number=Sing|PronType=Art\\t3\\tdet\\t_\\t_\\n2\\tjeune\\tjeune\\tADJ\\t_\\tGender=Masc|Number=Sing\\t3\\tamod\\t_\\t_\\n3\\thomme\\thomme\\tNOUN\\t_\\tGender=Masc|Number=Sing\\t6\\tnsubj\\t_\\t_\\n4\\t...\\t...\\tPUNCT\\t_\\t\\t3\\tpunct\\t_\\t_\\n5\\t--\\t--\\tPUNCT\\t_\\t\\t3\\tpunct\\t_\\t_\\n6\\ttraçons\\ttraçer\\tVERB\\t_\\tMood=Imp|Number=Plur|Person=1|Tense=Pres|VerbForm=Fin\\t6\\tROOT\\t_\\t_\\n7\\tson\\tson\\tDET\\t_\\tGender=Masc|Number=Sing|Poss=Yes|PronType=Prs\\t8\\tdet\\t_\\t_\\n8\\tportrait\\tportrait\\tNOUN\\t_\\tGender=Masc|Number=Sing\\t6\\tobj\\t_\\t_\\n9\\td’\\td’\\tPROPN\\t_\\t\\t8\\tappos\\t_\\t_\\n10\\tun\\tun\\tDET\\t_\\tDefinite=Ind|Gender=Masc|Number=Sing|PronType=Art\\t12\\tdet\\t_\\t_\\n11\\tseul\\tseul\\tADJ\\t_\\tGender=Masc|Number=Sing\\t12\\tamod\\t_\\t_\\n12\\ttrait\\ttrait\\tNOUN\\t_\\tGender=Masc|Number=Sing\\t15\\tnsubj\\t_\\t_\\n13\\tde\\tde\\tADP\\t_\\t\\t14\\tcase\\t_\\t_\\n14\\tplume\\tplume\\tNOUN\\t_\\tGender=Fem|Number=Sing\\t12\\tnmod\\t_\\t_\\n15\\t:--figurez\\t:--figurer\\tVERB\\t_\\tMood=Ind|Number=Plur|Person=2|Tense=Pres|VerbForm=Fin\\t6\\tparataxis\\t_\\t_\\n16\\t-vous\\tvous\\tPRON\\t_\\tNumber=Plur|Person=2|PronType=Prs\\t15\\tobj\\t_\\t_\\n17\\tdon\\tdon\\tADP\\t_\\t\\t18\\tcase\\t_\\t_\\n18\\tQuichotte\\tQuichotte\\tPROPN\\t_\\t\\t16\\tnmod\\t_\\t_\\n19\\tà\\tà\\tADP\\t_\\t\\t21\\tcase\\t_\\t_\\n20\\tdix-huit\\tdix-huit\\tNUM\\t_\\t\\t21\\tnummod\\t_\\t_\\n21\\tans\\tan\\tNOUN\\t_\\tGender=Masc|Number=Plur\\t18\\tnmod\\t_\\t_\\n22\\t;\\t;\\tPUNCT\\t_\\t\\t24\\tpunct\\t_\\t_\\n23\\tdon\\tdon\\tADP\\t_\\t\\t24\\tcase\\t_\\t_\\n24\\tQuichotte\\tQuichotte\\tPROPN\\t_\\t\\t6\\tobl\\t_\\t_\\n25\\tdécorselé\\tdécorseler\\tVERB\\t_\\tGender=Masc|Number=Sing|Tense=Past|VerbForm=Part\\t24\\tacl\\t_\\t_\\n26\\t,\\t,\\tPUNCT\\t_\\t\\t28\\tpunct\\t_\\t_\\n27\\tsans\\tsans\\tADP\\t_\\t\\t28\\tcase\\t_\\t_\\n28\\thaubert\\thaubert\\tNOUN\\t_\\tGender=Masc|Number=Sing\\t6\\tobl\\t_\\t_\\n29\\tet\\tet\\tCCONJ\\t_\\t\\t31\\tcc\\t_\\t_\\n30\\tsans\\tsans\\tADP\\t_\\t\\t31\\tcase\\t_\\t_\\n31\\tcuissards\\tcuissard\\tNOUN\\t_\\tGender=Masc|Number=Plur\\t28\\tconj\\t_\\t_\\n32\\t.\\t.\\tPUNCT\\t_\\t\\t6\\tpunct\\t_\\t_\\n33\\tUn\\tun\\tDET\\t_\\tDefinite=Ind|Gender=Masc|Number=Sing|PronType=Art\\t34\\tdet\\t_\\t_\\n34\\tinstant\\tinstant\\tNOUN\\t_\\tGender=Masc|Number=Sing\\t36\\tobl:mod\\t_\\t_\\n35\\telle\\til\\tPRON\\t_\\tGender=Fem|Number=Sing|Person=3|PronType=Prs\\t36\\tnsubj\\t_\\t_\\n36\\tbalança\\tbalancer\\tVERB\\t_\\tMood=Ind|Number=Sing|Person=3|Tense=Past|VerbForm=Fin\\t36\\tROOT\\t_\\t_\\n37\\tentre\\tentre\\tADP\\t_\\t\\t39\\tcase\\t_\\t_\\n38\\tles\\tle\\tDET\\t_\\tDefinite=Def|Gender=Fem|Number=Plur|PronType=Art\\t39\\tdet\\t_\\t_\\n39\\tviolettes\\tviolette\\tNOUN\\t_\\tGender=Fem|Number=Plur\\t36\\tobl\\t_\\t_\\n40\\tet\\tet\\tCCONJ\\t_\\t\\t42\\tcc\\t_\\t_\\n41\\tles\\tle\\tDET\\t_\\tDefinite=Def|Gender=Masc|Number=Plur|PronType=Art\\t42\\tdet\\t_\\t_\\n42\\tglaïeuls\\tglaïeul\\tNOUN\\t_\\tGender=Masc|Number=Plur\\t39\\tconj\\t_\\t_\\n43\\tque\\tque\\tPRON\\t_\\tPronType=Rel\\t45\\tobj\\t_\\t_\\n44\\tlui\\tlui\\tPRON\\t_\\tNumber=Sing|Person=3|PronType=Prs\\t45\\tiobj\\t_\\t_\\n45\\toffrait\\toffrir\\tVERB\\t_\\tMood=Ind|Number=Sing|Person=3|Tense=Imp|VerbForm=Fin\\t42\\tacl:relcl\\t_\\t_\\n46\\tl'\\tle\\tDET\\t_\\tDefinite=Def|Gender=Masc|Number=Sing|PronType=Art\\t47\\tdet\\t_\\t_\\n47\\tombrage\\tombrage\\tNOUN\\t_\\tGender=Masc|Number=Sing\\t45\\tnsubj\\t_\\t_\\n48\\tde\\tde\\tADP\\t_\\t\\t50\\tcase\\t_\\t_\\n49\\tles\\tle\\tDET\\t_\\tDefinite=Def|Gender=Masc|Number=Plur|PronType=Art\\t50\\tdet\\t_\\t_\\n50\\tarbres\\tarbre\\tNOUN\\t_\\tGender=Masc|Number=Plur\\t47\\tnmod\\t_\\t_\\n51\\tde\\tde\\tADP\\t_\\t\\t52\\tcase\\t_\\t_\\n52\\tMinerve\\tMinerve\\tPROPN\\t_\\t\\t50\\tnmod\\t_\\t_\\n53\\t,\\t,\\tPUNCT\\t_\\t\\t56\\tpunct\\t_\\t_\\n54\\tet\\tet\\tCCONJ\\t_\\t\\t56\\tcc\\t_\\t_\\n55\\tles\\tle\\tDET\\t_\\tDefinite=Def|Gender=Fem|Number=Plur|PronType=Art\\t56\\tdet\\t_\\t_\\n56\\tnarcisses\\tnarcisse\\tNOUN\\t_\\tGender=Fem|Number=Plur\\t39\\tconj\\t_\\t_\\n57\\tet\\tet\\tCCONJ\\t_\\t\\t59\\tcc\\t_\\t_\\n58\\tles\\tle\\tDET\\t_\\tDefinite=Def|Gender=Masc|Number=Plur|PronType=Art\\t59\\tdet\\t_\\t_\\n59\\tnymphéas\\tnymphéa\\tNOUN\\t_\\tGender=Masc|Number=Plur\\t56\\tconj\\t_\\t_\\n60\\tqui\\tqui\\tPRON\\t_\\tPronType=Rel\\t62\\tnsubj\\t_\\t_\\n61\\ts'\\tse\\tPRON\\t_\\tPerson=3|PronType=Prs\\t62\\texpl:comp\\t_\\t_\\n62\\télevaient\\télever\\tVERB\\t_\\tMood=Ind|Number=Plur|Person=3|Tense=Imp|VerbForm=Fin\\t59\\tacl:relcl\\t_\\t_\\n63\\tsur\\tsur\\tADP\\t_\\t\\t65\\tcase\\t_\\t_\\n64\\tles\\tle\\tDET\\t_\\tDefinite=Def|Gender=Masc|Number=Plur|PronType=Art\\t65\\tdet\\t_\\t_\\n65\\tbords\\tbord\\tNOUN\\t_\\tGender=Masc|Number=Plur\\t62\\tobl\\t_\\t_\\n66\\tde\\tde\\tADP\\t_\\t\\t69\\tcase\\t_\\t_\\n67\\tle\\tle\\tDET\\t_\\tDefinite=Def|Gender=Masc|Number=Sing|PronType=Art\\t69\\tdet\\t_\\t_\\n68\\tpetit\\tpetit\\tADJ\\t_\\tGender=Masc|Number=Sing\\t69\\tamod\\t_\\t_\\n69\\tfleuve\\tfleuve\\tNOUN\\t_\\tGender=Masc|Number=Sing\\t65\\tnmod\\t_\\t_\\n70\\tou\\tou\\tCCONJ\\t_\\t\\t71\\tcc\\t_\\t_\\n71\\tflottaient\\tflott\\tVERB\\t_\\tMood=Ind|Number=Plur|Person=3|Tense=Imp|VerbForm=Fin\\t62\\tconj\\t_\\t_\\n72\\tà\\tà\\tADP\\t_\\t\\t74\\tcase\\t_\\t_\\n73\\tsa\\tson\\tDET\\t_\\tGender=Fem|Number=Sing|Poss=Yes|PronType=Prs\\t74\\tdet\\t_\\t_\\n74\\tsurface\\tsurface\\tNOUN\\t_\\tGender=Fem|Number=Sing\\t71\\tobl:arg\\t_\\t_\\n75\\t;\\t;\\tPUNCT\\t_\\t\\t80\\tpunct\\t_\\t_\\n76\\tmais\\tmais\\tCCONJ\\t_\\t\\t80\\tcc\\t_\\t_\\n77\\tbientôt\\tbientôt\\tADV\\t_\\t\\t80\\tadvmod\\t_\\t_\\n78\\telle\\til\\tPRON\\t_\\tGender=Fem|Number=Sing|Person=3|PronType=Prs\\t80\\tnsubj\\t_\\t_\\n79\\tse\\tse\\tPRON\\t_\\tPerson=3|PronType=Prs\\t80\\tobj\\t_\\t_\\n80\\tdécida\\tdécider\\tVERB\\t_\\tMood=Ind|Number=Sing|Person=3|Tense=Past|VerbForm=Fin\\t36\\tconj\\t_\\t_\\n81\\tpour\\tpour\\tADP\\t_\\t\\t82\\tcase\\t_\\t_\\n82\\tceux-ci\\tcelui-ci\\tPRON\\t_\\tGender=Masc|Number=Plur|PronType=Dem\\t80\\tobl\\t_\\t_\\n83\\t,\\t,\\tPUNCT\\t_\\t\\t86\\tpunct\\t_\\t_\\n84\\tet\\tet\\tCCONJ\\t_\\t\\t86\\tcc\\t_\\t_\\n85\\t,\\t,\\tPUNCT\\t_\\t\\t84\\tpunct\\t_\\t_\\n86\\tbondissant\\tbondisser\\tVERB\\t_\\tTense=Pres|VerbForm=Part\\t80\\tconj\\t_\\t_\\n87\\tcomme\\tcomme\\tADP\\t_\\t\\t90\\tcase\\t_\\t_\\n88\\tun\\tun\\tDET\\t_\\tDefinite=Ind|Gender=Masc|Number=Sing|PronType=Art\\t90\\tdet\\t_\\t_\\n89\\tjeune\\tjeune\\tADJ\\t_\\tGender=Masc|Number=Sing\\t90\\tamod\\t_\\t_\\n90\\tfaon\\tfaon\\tNOUN\\t_\\tGender=Masc|Number=Sing\\t86\\tobl:mod\\t_\\t_\\n91\\t,\\t,\\tPUNCT\\t_\\t\\t93\\tpunct\\t_\\t_\\n92\\telle\\til\\tPRON\\t_\\tGender=Fem|Number=Sing|Person=3|PronType=Prs\\t93\\tnsubj\\t_\\t_\\n93\\tcourut\\tcourir\\tVERB\\t_\\tMood=Ind|Number=Sing|Person=3|Tense=Past|VerbForm=Fin\\t80\\tconj\\t_\\t_\\n94\\tvers\\tvers\\tADP\\t_\\t\\t96\\tcase\\t_\\t_\\n95\\tle\\tle\\tDET\\t_\\tDefinite=Def|Gender=Masc|Number=Sing|PronType=Art\\t96\\tdet\\t_\\t_\\n96\\truisseau\\truisseau\\tNOUN\\t_\\tGender=Masc|Number=Sing\\t93\\tobl\\t_\\t_\\n97\\t.\\t.\\tPUNCT\\t_\\t\\t36\\tpunct\\t_\\t_\"" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "nlpdoc_to_conll(doc1)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "5d7c6586", + "metadata": {}, + "outputs": [], + "source": [ + "def apply_special_conditions(tok_string):\n", + " tok_string = tok_string.replace(\"’\", \"'\").replace(\"_\", '\"')\\\n", + " .replace(\":--\", \" : - \")\\\n", + " .replace(\"...\", \" ...\").replace(\"!\", \" !\")\n", + " tok_string = tok_string.replace(\"d' Artagnan\", \"d'Artagnan\")\n", + " return tok_string\n", + " \n", + "\n", + "def create_tokenized_string(sent_string):\n", + " sent_string = apply_special_conditions(sent_string)\n", + " doc_tokenized = nlp(sent_string)\n", + " tokens_list = [ ]\n", + " for token in doc_tokenized:\n", + " tokens_list.append(token.text)\n", + " \n", + " text_tokenized = ' '.join(tokens_list)\n", + " #text_tokenized = apply_special_conditions(text_tokenized)\n", + " \n", + " conll_doc = nlpdoc_to_conll(doc_tokenized)\n", + "\n", + " return text_tokenized, conll_doc\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "5bfce4b4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Un jeune homme ... -- traçons son portrait d' un seul trait de plume : - figurez -vous don Quichotte à dix-huit ans ; don Quichotte décorselé , sans haubert et sans cuissards .\n", + "1\tUn\tun\tDET\t_\tDefinite=Ind|Gender=Masc|Number=Sing|PronType=Art\t3\tdet\t_\t_\n", + "2\tjeune\tjeune\tADJ\t_\tGender=Masc|Number=Sing\t3\tamod\t_\t_\n", + "3\thomme\thomme\tNOUN\t_\tGender=Masc|Number=Sing\t6\tnsubj\t_\t_\n", + "4\t...\t...\tPUNCT\t_\t\t3\tpunct\t_\t_\n", + "5\t--\t--\tPUNCT\t_\t\t3\tpunct\t_\t_\n", + "6\ttraçons\ttraçer\tVERB\t_\tMood=Imp|Number=Plur|Person=1|Tense=Pres|VerbForm=Fin\t6\tROOT\t_\t_\n", + "7\tson\tson\tDET\t_\tGender=Masc|Number=Sing|Poss=Yes|PronType=Prs\t8\tdet\t_\t_\n", + "8\tportrait\tportrait\tNOUN\t_\tGender=Masc|Number=Sing\t6\tobj\t_\t_\n", + "9\td'\tde\tADP\t_\t\t12\tcase\t_\t_\n", + "10\tun\tun\tDET\t_\tDefinite=Ind|Gender=Masc|Number=Sing|PronType=Art\t12\tdet\t_\t_\n", + "11\tseul\tseul\tADJ\t_\tGender=Masc|Number=Sing\t12\tamod\t_\t_\n", + "12\ttrait\ttrait\tNOUN\t_\tGender=Masc|Number=Sing\t8\tnmod\t_\t_\n", + "13\tde\tde\tADP\t_\t\t14\tcase\t_\t_\n", + "14\tplume\tplume\tNOUN\t_\tGender=Fem|Number=Sing\t12\tnmod\t_\t_\n", + "15\t:\t:\tPUNCT\t_\t\t17\tpunct\t_\t_\n", + "16\t-\t-\tPUNCT\t_\t\t17\tpunct\t_\t_\n", + "17\tfigurez\tfigurer\tVERB\t_\tMood=Imp|Number=Plur|Person=2|Tense=Pres|VerbForm=Fin\t6\tparataxis\t_\t_\n", + "18\t-vous\tle\tPRON\t_\tNumber=Plur|Person=2|PronType=Prs\t17\tnsubj\t_\t_\n", + "19\tdon\tdon\tADP\t_\t\t20\tcase\t_\t_\n", + "20\tQuichotte\tQuichotte\tPROPN\t_\t\t17\tobl:arg\t_\t_\n", + "21\tà\tà\tADP\t_\t\t23\tcase\t_\t_\n", + "22\tdix-huit\tdix-huit\tNUM\t_\t\t23\tnummod\t_\t_\n", + "23\tans\tan\tNOUN\t_\tGender=Masc|Number=Plur\t20\tnmod\t_\t_\n", + "24\t;\t;\tPUNCT\t_\t\t26\tpunct\t_\t_\n", + "25\tdon\tdon\tADP\t_\t\t26\tcase\t_\t_\n", + "26\tQuichotte\tQuichotte\tPROPN\t_\t\t20\tnmod\t_\t_\n", + "27\tdécorselé\tdécorseler\tVERB\t_\tGender=Masc|Number=Sing|Tense=Past|VerbForm=Part\t26\tacl\t_\t_\n", + "28\t,\t,\tPUNCT\t_\t\t30\tpunct\t_\t_\n", + "29\tsans\tsans\tADP\t_\t\t30\tcase\t_\t_\n", + "30\thaubert\thaubert\tNOUN\t_\tGender=Masc|Number=Sing\t20\tnmod\t_\t_\n", + "31\tet\tet\tCCONJ\t_\t\t33\tcc\t_\t_\n", + "32\tsans\tsans\tADP\t_\t\t33\tcase\t_\t_\n", + "33\tcuissards\tcuissard\tNOUN\t_\tGender=Masc|Number=Plur\t30\tconj\t_\t_\n", + "34\t.\t.\tPUNCT\t_\t\t6\tpunct\t_\t_\n", + "Un instant elle balança entre les violettes et les glaïeuls que lui offrait l' ombrage de les arbres de Minerve , et les narcisses et les nymphéas qui s' élevaient sur les bords de le petit fleuve ou flottaient à sa surface ; mais bientôt elle se décida pour ceux-ci , et , bondissant comme un jeune faon , elle courut vers le ruisseau .\n", + "1\tUn\tun\tDET\t_\tDefinite=Ind|Gender=Masc|Number=Sing|PronType=Art\t2\tdet\t_\t_\n", + "2\tinstant\tinstant\tNOUN\t_\tGender=Masc|Number=Sing\t4\tobl:mod\t_\t_\n", + "3\telle\til\tPRON\t_\tGender=Fem|Number=Sing|Person=3|PronType=Prs\t4\tnsubj\t_\t_\n", + "4\tbalança\tbalancer\tVERB\t_\tMood=Ind|Number=Sing|Person=3|Tense=Past|VerbForm=Fin\t4\tROOT\t_\t_\n", + "5\tentre\tentre\tADP\t_\t\t7\tcase\t_\t_\n", + "6\tles\tle\tDET\t_\tDefinite=Def|Gender=Fem|Number=Plur|PronType=Art\t7\tdet\t_\t_\n", + "7\tviolettes\tviolette\tNOUN\t_\tGender=Fem|Number=Plur\t4\tobl\t_\t_\n", + "8\tet\tet\tCCONJ\t_\t\t10\tcc\t_\t_\n", + "9\tles\tle\tDET\t_\tDefinite=Def|Gender=Masc|Number=Plur|PronType=Art\t10\tdet\t_\t_\n", + "10\tglaïeuls\tglaïeul\tNOUN\t_\tGender=Masc|Number=Plur\t7\tconj\t_\t_\n", + "11\tque\tque\tPRON\t_\tPronType=Rel\t13\tobj\t_\t_\n", + "12\tlui\tlui\tPRON\t_\tNumber=Sing|Person=3|PronType=Prs\t13\tiobj\t_\t_\n", + "13\toffrait\toffrir\tVERB\t_\tMood=Ind|Number=Sing|Person=3|Tense=Imp|VerbForm=Fin\t10\tacl:relcl\t_\t_\n", + "14\tl'\tle\tDET\t_\tDefinite=Def|Gender=Masc|Number=Sing|PronType=Art\t15\tdet\t_\t_\n", + "15\tombrage\tombrage\tNOUN\t_\tGender=Masc|Number=Sing\t13\tnsubj\t_\t_\n", + "16\tde\tde\tADP\t_\t\t18\tcase\t_\t_\n", + "17\tles\tle\tDET\t_\tDefinite=Def|Gender=Masc|Number=Plur|PronType=Art\t18\tdet\t_\t_\n", + "18\tarbres\tarbre\tNOUN\t_\tGender=Masc|Number=Plur\t15\tnmod\t_\t_\n", + "19\tde\tde\tADP\t_\t\t20\tcase\t_\t_\n", + "20\tMinerve\tMinerve\tPROPN\t_\t\t18\tnmod\t_\t_\n", + "21\t,\t,\tPUNCT\t_\t\t24\tpunct\t_\t_\n", + "22\tet\tet\tCCONJ\t_\t\t24\tcc\t_\t_\n", + "23\tles\tle\tDET\t_\tDefinite=Def|Gender=Fem|Number=Plur|PronType=Art\t24\tdet\t_\t_\n", + "24\tnarcisses\tnarcisse\tNOUN\t_\tGender=Fem|Number=Plur\t7\tconj\t_\t_\n", + "25\tet\tet\tCCONJ\t_\t\t27\tcc\t_\t_\n", + "26\tles\tle\tDET\t_\tDefinite=Def|Gender=Masc|Number=Plur|PronType=Art\t27\tdet\t_\t_\n", + "27\tnymphéas\tnymphéa\tNOUN\t_\tGender=Masc|Number=Plur\t24\tconj\t_\t_\n", + "28\tqui\tqui\tPRON\t_\tPronType=Rel\t30\tnsubj\t_\t_\n", + "29\ts'\tse\tPRON\t_\tPerson=3|PronType=Prs\t30\texpl:comp\t_\t_\n", + "30\télevaient\télever\tVERB\t_\tMood=Ind|Number=Plur|Person=3|Tense=Imp|VerbForm=Fin\t27\tacl:relcl\t_\t_\n", + "31\tsur\tsur\tADP\t_\t\t33\tcase\t_\t_\n", + "32\tles\tle\tDET\t_\tDefinite=Def|Gender=Masc|Number=Plur|PronType=Art\t33\tdet\t_\t_\n", + "33\tbords\tbord\tNOUN\t_\tGender=Masc|Number=Plur\t30\tobl\t_\t_\n", + "34\tde\tde\tADP\t_\t\t37\tcase\t_\t_\n", + "35\tle\tle\tDET\t_\tDefinite=Def|Gender=Masc|Number=Sing|PronType=Art\t37\tdet\t_\t_\n", + "36\tpetit\tpetit\tADJ\t_\tGender=Masc|Number=Sing\t37\tamod\t_\t_\n", + "37\tfleuve\tfleuve\tNOUN\t_\tGender=Masc|Number=Sing\t33\tnmod\t_\t_\n", + "38\tou\tou\tCCONJ\t_\t\t39\tcc\t_\t_\n", + "39\tflottaient\tflott\tVERB\t_\tMood=Ind|Number=Plur|Person=3|Tense=Imp|VerbForm=Fin\t30\tconj\t_\t_\n", + "40\tà\tà\tADP\t_\t\t42\tcase\t_\t_\n", + "41\tsa\tson\tDET\t_\tGender=Fem|Number=Sing|Poss=Yes|PronType=Prs\t42\tdet\t_\t_\n", + "42\tsurface\tsurface\tNOUN\t_\tGender=Fem|Number=Sing\t39\tobl:arg\t_\t_\n", + "43\t;\t;\tPUNCT\t_\t\t48\tpunct\t_\t_\n", + "44\tmais\tmais\tCCONJ\t_\t\t48\tcc\t_\t_\n", + "45\tbientôt\tbientôt\tADV\t_\t\t48\tadvmod\t_\t_\n", + "46\telle\til\tPRON\t_\tGender=Fem|Number=Sing|Person=3|PronType=Prs\t48\tnsubj\t_\t_\n", + "47\tse\tse\tPRON\t_\tPerson=3|PronType=Prs\t48\tobj\t_\t_\n", + "48\tdécida\tdécider\tVERB\t_\tMood=Ind|Number=Sing|Person=3|Tense=Past|VerbForm=Fin\t4\tconj\t_\t_\n", + "49\tpour\tpour\tADP\t_\t\t50\tcase\t_\t_\n", + "50\tceux-ci\tcelui-ci\tPRON\t_\tGender=Masc|Number=Plur|PronType=Dem\t48\tobl\t_\t_\n", + "51\t,\t,\tPUNCT\t_\t\t54\tpunct\t_\t_\n", + "52\tet\tet\tCCONJ\t_\t\t54\tcc\t_\t_\n", + "53\t,\t,\tPUNCT\t_\t\t52\tpunct\t_\t_\n", + "54\tbondissant\tbondisser\tVERB\t_\tTense=Pres|VerbForm=Part\t48\tconj\t_\t_\n", + "55\tcomme\tcomme\tADP\t_\t\t58\tcase\t_\t_\n", + "56\tun\tun\tDET\t_\tDefinite=Ind|Gender=Masc|Number=Sing|PronType=Art\t58\tdet\t_\t_\n", + "57\tjeune\tjeune\tADJ\t_\tGender=Masc|Number=Sing\t58\tamod\t_\t_\n", + "58\tfaon\tfaon\tNOUN\t_\tGender=Masc|Number=Sing\t54\tobl:mod\t_\t_\n", + "59\t,\t,\tPUNCT\t_\t\t61\tpunct\t_\t_\n", + "60\telle\til\tPRON\t_\tGender=Fem|Number=Sing|Person=3|PronType=Prs\t61\tnsubj\t_\t_\n", + "61\tcourut\tcourir\tVERB\t_\tMood=Ind|Number=Sing|Person=3|Tense=Past|VerbForm=Fin\t48\tconj\t_\t_\n", + "62\tvers\tvers\tADP\t_\t\t64\tcase\t_\t_\n", + "63\tle\tle\tDET\t_\tDefinite=Def|Gender=Masc|Number=Sing|PronType=Art\t64\tdet\t_\t_\n", + "64\truisseau\truisseau\tNOUN\t_\tGender=Masc|Number=Sing\t61\tobl\t_\t_\n", + "65\t.\t.\tPUNCT\t_\t\t4\tpunct\t_\t_\n" + ] + } + ], + "source": [ + "\n", + "for sent in sentences:\n", + " tok_text, conll_text = create_tokenized_string(sent)\n", + " print(tok_text)\n", + " print(conll_text)" + ] + }, + { + "cell_type": "markdown", + "id": "41d4b38f", + "metadata": {}, + "source": [ + "### Store the cleaned tokenized text sentence-wise in a file\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "65825f08", + "metadata": {}, + "outputs": [], + "source": [ + "def chunk_file(name, lines_per_chunk, chunks_per_file):\n", + " \n", + " booktitle = name.split(\"texts/\")[1].replace('.txt', '')\n", + " print(booktitle)\n", + " \n", + " target_folder = '../data/gutenberg/tokenized_texts/'\n", + " target_file_path = target_folder + booktitle + '.tok'\n", + "\n", + " #os.makedirs(os.path.dirname(target_folder), exist_ok=True)\n", + " \n", + " #if os.path.exists(target_file_path): os.remove(target_file_path)\n", + " if os.path.exists(target_file_path + '.conll'): os.remove(target_file_path + '.conll')\n", + " \n", + " outfile = open(target_file_path, \"a\")\n", + " outfile_conll = open(target_file_path + '.conll', \"a\")\n", + " \n", + " def bad_chunk(chunk_text):\n", + " unwanted_start_of_string = (\"Alexandre Dumas\", u\"ACTÉ\", \n", + " \"Chapitre\", \"(18\", u\"Préface\",\n", + " u\"Table des matières\", u\"_Résumé_\", \n", + " \"[ Illustration\", \"[Illustration\") \n", + " if chunk_text.startswith(unwanted_start_of_string):\n", + " return True\n", + "\n", + " def write_chunk(chunk_no, chunk):\n", + " chunk_text = ' '.join(chunk).replace('\\n', ' ').strip()\n", + " if len(chunk_text) > 0 and not bad_chunk(chunk_text):\n", + " doc = nlp(chunk_text) \n", + " sentences = [sent.text.strip() for sent in doc.sents]\n", + " for sent in sentences:\n", + " tokenized_sent, conll_doc = create_tokenized_string(sent)\n", + " #print(tokenized_sent)\n", + " #print(conll_doc)\n", + " outfile.write(tokenized_sent + '\\n')\n", + " outfile_conll.write(conll_doc + '\\n\\n')\n", + "\n", + " count, chunk_no, chunk_count, chunk = 1, 1, 0, []\n", + " with open(name, \"r\") as f:\n", + " for row in f:\n", + " if count > lines_per_chunk and row == \"\\n\":\n", + " chunk_count += 1\n", + " count = 1\n", + " chunk.append(\"\\n\")\n", + " if chunk_count == chunks_per_file:\n", + " write_chunk(chunk_no, chunk)\n", + " chunk = []\n", + " chunk_count = 0\n", + " chunk_no += 1\n", + " else:\n", + " count += 1\n", + " chunk.append(row)\n", + " if chunk:\n", + " write_chunk(chunk_no, chunk)\n", + " outfile.close()\n", + " outfile_conll.close()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "95943233", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Vingt_ans_après\n" + ] + } + ], + "source": [ + "\n", + "import glob\n", + "\n", + "\n", + "dir_with_raw_files = [x for x in glob.glob('../data/gutenberg/raw_texts/Vingt*')]\n", + "\n", + "for raw_file_path in dir_with_raw_files:\n", + " chunk_file(raw_file_path, 1, 1)\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "f8ccc794", + "metadata": {}, + "source": [ + "## Process pre-tokenized texts with stanza and create train dev test" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "eb6ca7ba", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "2025-01-09 17:11:12 INFO: Checking for updates to resources.json in case models have been updated. Note: this behavior can be turned off with download_method=None or download_method=DownloadMethod.REUSE_RESOURCES\n", + "Downloading https://raw.githubusercontent.com/stanfordnlp/stanza-resources/main/resources_1.6.0.json: 367kB [00:00, 26.7MB/s] \n", + "2025-01-09 17:11:15 INFO: Loading these models for language: fr (French):\n", + "=================================\n", + "| Processor | Package |\n", + "---------------------------------\n", + "| tokenize | combined |\n", + "| pos | combined_charlm |\n", + "| lemma | combined_nocharlm |\n", + "| depparse | combined_charlm |\n", + "=================================\n", + "\n", + "2025-01-09 17:11:15 INFO: Using device: cuda\n", + "2025-01-09 17:11:15 INFO: Loading: tokenize\n", + "2025-01-09 17:11:15 INFO: Loading: pos\n", + "2025-01-09 17:11:19 INFO: Loading: lemma\n", + "2025-01-09 17:11:19 INFO: Loading: depparse\n", + "2025-01-09 17:11:19 INFO: Done loading processors!\n", + "2025-01-09 17:11:19 INFO: Checking for updates to resources.json in case models have been updated. Note: this behavior can be turned off with download_method=None or download_method=DownloadMethod.REUSE_RESOURCES\n", + "Downloading https://raw.githubusercontent.com/stanfordnlp/stanza-resources/main/resources_1.6.0.json: 367kB [00:00, 18.9MB/s] \n", + "2025-01-09 17:11:20 INFO: Loading these models for language: fr (French):\n", + "=================================\n", + "| Processor | Package |\n", + "---------------------------------\n", + "| tokenize | combined |\n", + "| pos | combined_charlm |\n", + "| lemma | combined_nocharlm |\n", + "| depparse | combined_charlm |\n", + "=================================\n", + "\n", + "2025-01-09 17:11:20 INFO: Using device: cuda\n", + "2025-01-09 17:11:20 INFO: Loading: tokenize\n", + "2025-01-09 17:11:20 INFO: Loading: pos\n", + "2025-01-09 17:11:21 INFO: Loading: lemma\n", + "2025-01-09 17:11:21 INFO: Loading: depparse\n", + "2025-01-09 17:11:21 INFO: Done loading processors!\n" + ] + } + ], + "source": [ + "import stanza\n", + "\n", + "#stanza.download(\"fr\")\n", + "\n", + "nlp_tokenized = stanza.Pipeline(lang='fr', processors='tokenize, pos, lemma, depparse', tokenize_pretokenized=True)\n", + "nlp_pos = stanza.Pipeline(lang='fr', processors='tokenize, pos, lemma, depparse', tokenize_pretokenized=True)\n", + "\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "ad525136", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "# text = Je mange des pommes .\n", + "# sent_id = 0\n", + "1\tJe\tmoi\tPRON\t_\tEmph=No|Number=Sing|Person=1|PronType=Prs\t2\tnsubj\t_\tstart_char=0|end_char=2\n", + "2\tmange\tmanger\tVERB\t_\tMood=Ind|Number=Sing|Person=1|Tense=Pres|VerbForm=Fin\t0\troot\t_\tstart_char=3|end_char=8\n", + "3\tdes\tun\tDET\t_\tDefinite=Ind|Number=Plur|PronType=Art\t4\tdet\t_\tstart_char=9|end_char=12\n", + "4\tpommes\tpomme\tNOUN\t_\tGender=Fem|Number=Plur\t2\tobj\t_\tstart_char=13|end_char=19\n", + "5\t.\t.\tPUNCT\t_\t_\t2\tpunct\t_\tstart_char=20|end_char=21\n", + "\n", + "[\n", + " {\n", + " \"id\": 1,\n", + " \"text\": \"Je\",\n", + " \"lemma\": \"moi\",\n", + " \"upos\": \"PRON\",\n", + " \"feats\": \"Emph=No|Number=Sing|Person=1|PronType=Prs\",\n", + " \"head\": 2,\n", + " \"deprel\": \"nsubj\",\n", + " \"misc\": \"\",\n", + " \"start_char\": 0,\n", + " \"end_char\": 2\n", + " },\n", + " {\n", + " \"id\": 2,\n", + " \"text\": \"mange\",\n", + " \"lemma\": \"manger\",\n", + " \"upos\": \"VERB\",\n", + " \"feats\": \"Mood=Ind|Number=Sing|Person=1|Tense=Pres|VerbForm=Fin\",\n", + " \"head\": 0,\n", + " \"deprel\": \"root\",\n", + " \"misc\": \"\",\n", + " \"start_char\": 3,\n", + " \"end_char\": 8\n", + " },\n", + " {\n", + " \"id\": 3,\n", + " \"text\": \"des\",\n", + " \"lemma\": \"un\",\n", + " \"upos\": \"DET\",\n", + " \"feats\": \"Definite=Ind|Number=Plur|PronType=Art\",\n", + " \"head\": 4,\n", + " \"deprel\": \"det\",\n", + " \"misc\": \"\",\n", + " \"start_char\": 9,\n", + " \"end_char\": 12\n", + " },\n", + " {\n", + " \"id\": 4,\n", + " \"text\": \"pommes\",\n", + " \"lemma\": \"pomme\",\n", + " \"upos\": \"NOUN\",\n", + " \"feats\": \"Gender=Fem|Number=Plur\",\n", + " \"head\": 2,\n", + " \"deprel\": \"obj\",\n", + " \"misc\": \"\",\n", + " \"start_char\": 13,\n", + " \"end_char\": 19\n", + " },\n", + " {\n", + " \"id\": 5,\n", + " \"text\": \".\",\n", + " \"lemma\": \".\",\n", + " \"upos\": \"PUNCT\",\n", + " \"head\": 2,\n", + " \"deprel\": \"punct\",\n", + " \"misc\": \"\",\n", + " \"start_char\": 20,\n", + " \"end_char\": 21\n", + " }\n", + "]\n" + ] + } + ], + "source": [ + "text = \"Je mange des pommes .\"\n", + "doc = nlp_tokenized(text)\n", + "doc = nlp_pos(doc)\n", + "print(\"{:C}\".format(doc) + '\\n')\n", + "\n", + "for i, sentence in enumerate(doc.sentences):\n", + " print(sentence)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "e8f70a45", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Vingt_ans_après\n", + "14450\n", + "1784\n", + "1606\n" + ] + } + ], + "source": [ + "import glob\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "\n", + "dir_with_pretokenized_files = [x for x in glob.glob('../data/gutenberg/tokenized_texts/Vingt_ans_après.tok')]\n", + "\n", + "for tokenized_file_path in dir_with_pretokenized_files:\n", + " \n", + " booktitle = tokenized_file_path.split(\"texts/\")[1].replace('.tok', '')\n", + " print(booktitle)\n", + " \n", + "\n", + " \n", + " with open(tokenized_file_path, 'r') as tokfile:\n", + " documents = tokfile.readlines()\n", + " X_train, X_test = train_test_split(documents, test_size=0.1, shuffle=False, stratify = None)\n", + " X_train, X_val = train_test_split(X_train, test_size=0.1, shuffle=False, stratify = None) \n", + " \n", + " in_docs_train = [stanza.Document([], text=d) for d in X_train] # Wrap each document with a stanza.Document object\n", + " out_docs_train = nlp_pos(in_docs_train) # Call the neural pipeline on this list of documents\n", + " \n", + " in_docs_test = [stanza.Document([], text=d) for d in X_test] # Wrap each document with a stanza.Document object\n", + " out_docs_test = nlp_pos(in_docs_test) # Call the neural pipeline on this list of documents\n", + " \n", + " in_docs_val = [stanza.Document([], text=d) for d in X_val] # Wrap each document with a stanza.Document object\n", + " out_docs_val = nlp_pos(in_docs_val) # Call the neural pipeline on this list of documents\n", + " \n", + " print(len(out_docs_train))\n", + " print(len(out_docs_test))\n", + " print(len(out_docs_val))\n", + " \n", + " target_folder = '../data/gutenberg/tokenized_texts/'\n", + " target_file_path = target_folder + booktitle + '.tok'\n", + " #os.makedirs(os.path.dirname(target_folder), exist_ok=True)\n", + " \n", + " target_file_path = target_folder + booktitle + '.tok'\n", + " \n", + " outfile_conll_val = open(target_file_path + '.dev.conll', \"w\")\n", + " outfile_conll_train = open(target_file_path + '.train.conll', \"w\")\n", + " outfile_conll_test = open(target_file_path + '.test.conll', \"w\")\n", + " \n", + " \n", + " for out_doc in out_docs_train:#.sentences:\n", + " conllstr = \"{:C}\".format(out_doc)\n", + " outfile_conll_train.write(conllstr + '\\n\\n')\n", + " \n", + " for out_doc in out_docs_val:#.sentences:\n", + " conllstr = \"{:C}\".format(out_doc)\n", + " outfile_conll_val.write(conllstr + '\\n\\n')\n", + " \n", + " for out_doc in out_docs_test:#.sentences:\n", + " conllstr = \"{:C}\".format(out_doc)\n", + " outfile_conll_test.write(conllstr + '\\n\\n')\n", + " \n", + " outfile_conll_val.close()\n", + " outfile_conll_train.close()\n", + " outfile_conll_test.close()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6b50d131", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fbedfcb1", + "metadata": {}, + "outputs": [], + "source": [ + "# add an empty line before each # text =\n", + "\n", + "#%cd ..\n", + "#%cd data/gutenberg/tokenized_texts\n", + "#! sed -i 's/# text =/\\n\\n# text =/g' *.conll\n", + "#%cd ..\n", + "#%cd ..\n", + "#%cd ..\n", + "#%cd notebooks\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "960bb524", + "metadata": {}, + "outputs": [], + "source": [ + "#!ls" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3294ef16", + "metadata": {}, + "outputs": [], + "source": [ + "# concatenate the files for the train, dev, and test split and move them to the incpar folder\n", + "#%cd ..\n", + "#%cd data/gutenberg/tokenized_texts" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1a56e036", + "metadata": {}, + "outputs": [], + "source": [ + "#! cat *.tok.dev.conll > gutenberg_dumas_dev.tok.conll\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3f216cc3", + "metadata": {}, + "outputs": [], + "source": [ + "#! cat *.tok.train.conll > gutenberg_dumas_train.tok.conll\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "880e80d9", + "metadata": {}, + "outputs": [], + "source": [ + "#! cat *.tok.test.conll > gutenberg_dumas_test.tok.conll\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea3c1380", + "metadata": {}, + "outputs": [], + "source": [ + "#%cd ..\n", + "#%cd ..\n", + "#%cd ..\n", + "#%cd .." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "700586eb", + "metadata": {}, + "outputs": [], + "source": [ + "#!mv /home/tatiana.bladier/tokenization-experiments/data/gutenberg/tokenized_texts/gutenberg_dumas_dev.tok.conll incpar/data/gutenberg_dumas" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "43fe6a94", + "metadata": {}, + "outputs": [], + "source": [ + "#!mv /home/tatiana.bladier/tokenization-experiments/data/gutenberg/tokenized_texts/gutenberg_dumas_test.tok.conll incpar/data/gutenberg_dumas" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "82dd0717", + "metadata": {}, + "outputs": [], + "source": [ + "#!mv /home/tatiana.bladier/tokenization-experiments/data/gutenberg/tokenized_texts/gutenberg_dumas_train.tok.conll incpar/data/gutenberg_dumas" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7fbce7a2", + "metadata": {}, + "outputs": [], + "source": [ + "#!cp /home/tatiana.bladier/incpar/data/gutenberg_dumas/gutenberg_dumas_dev.tok.conll compo-gpt-model/data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "45e652a6", + "metadata": {}, + "outputs": [], + "source": [ + "#!cp /home/tatiana.bladier/incpar/data/gutenberg_dumas/gutenberg_dumas_test.tok.conll compo-gpt-model/data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0078cbb5", + "metadata": {}, + "outputs": [], + "source": [ + "#!cp /home/tatiana.bladier/incpar/data/gutenberg_dumas/gutenberg_dumas_train.tok.conll compo-gpt-model/data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1b4a088b", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.10" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/texts/2419.txt.gz b/texts/2419.txt.gz new file mode 100644 index 0000000000000000000000000000000000000000..5296ef5e3e5deb554e14d869efd35a5b77734ae2 Binary files /dev/null and b/texts/2419.txt.gz differ