{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Implementation of BoWs\n", "\n", "- Author: Johannes Maucher\n", "- Last update: 01.11.2024\n", "\n", "This notebook demonstrates how documents can be described in a vector space model. Applying this type of model\n", "\n", "1. similarities between documents \n", "2. similarities between documents and a query \n", "\n", "can easily be calculated." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Read documents from Newsfeed" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "#!pip install feedparser" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "import feedparser\n", "feed='http://newsfeed.zeit.de/index'\n", "newsliststring=[]\n", "\n", "f=feedparser.parse(feed)\n", "for e in f.entries:\n", " text=e.title+\"\\n\"+e.description\n", " newsliststring.append(text)\n", " #print('\\n---------------------------') \n", " #print(text)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Umwelt: Robben in Netzen verendet? Expertin sieht weitere Hinweise\\n',\n", " 'Ermittlungen: Mann wird auf Straße gefunden - und stirbt zwei Tage später\\n',\n", " 'Umfragen zur US-Wahl: Wer zieht ins Weiße Haus – Donald Trump oder Kamala Harris?\\nDie Kandidaten liegen weiter nah beisammen, doch Trump erlangt die Führung in wichtigen Swing-States. Die Daten zum US-Wahlkampf im täglich aktualisierten Überblick',\n", " 'Ampelstreit: Christian Lindner fordert Kehrtwende in Wirtschafts- und Finanzpolitik\\nDer Bundesfinanzminister distanziert sich in einem Grundsatzpapier in Teilen von der Ampelregierung. Mit Blick auf den Bundeshaushalt fordert er weitere Einsparungen.',\n", " '3. Fußball-Liga: Wehen Wiesbaden mit Respekt vor Pokal-Schreck Bielefeld\\n',\n", " 'Hochschulen: Peter Bernshausen ist neuer Kanzler der TU Chemnitz\\n',\n", " 'Katargate: EU-Staatsanwaltschaft ermittelt gegen hohen Beamten wegen Korruption\\nIn der EU laufen Ermittlungen gegen Henrik Hololei. Der estnische EU-Beamte steht unter Verdacht, teure Geschenke aus Katar angenommen zu haben.',\n", " 'Zweithöchste Warnstufe: Unwetter erreicht Balearen: Starker Regen auf Mallorca\\n',\n", " 'Nahostkonflikt: Trügerische Siege\\nIsrael hat Irans Macht in der Region stark geschwächt. So dominant wie heute war es noch nie. Doch der Iran könnte aus seiner derzeitigen Schwäche eine Stärke machen.',\n", " 'Kriminalität: 18-Jähriger soll mehr als 30 Straftaten begangen haben\\n',\n", " 'Ukraine-Krieg: Der Winter naht, die Ukraine macht mobil\\nDie Ukraine erlebte im Oktober einen der härtesten Monate seit Kriegsbeginn. Jetzt beginnt der Winter. Wie ist die Stimmung? Und wieder Unwetterwarnungen in Spanien',\n", " 'Umgang mit der AfD: Senatorin warnt vor AfD-Verbotsverfahren auf Bundesebene\\n',\n", " 'Hamburgs Gewässer: Die Elbe kann mehr, als nur Schiffe zu tragen\\nEin Podcast für mehr Lebensqualität: Hamburg könnte Elbe, Alster und Bille noch besser nutzen. Wo man künftig schwimmen, surfen und flanieren könnte.',\n", " 'Klimaschutz: Jugendliche sollen in Klimaräten mitwirken können\\n',\n", " 'US-Wahlkampf: Liz Cheney warnt nach erneuter Attacke vor Donald Trump\\nAuf offener Bühne diskutierte Donald Trump Gewaltfantasien gegen seine parteiinterne Kritikerin Liz Cheney. Die warnt nun vor einem Tyrannen als Präsidenten.']" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "newsliststring" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Tokenisation\n", "In Keras methods for preprocessing texts are contained in `keras.preprocessing.text`. From this module, we apply the `Tokenizer`-class to \n", "* transform words to integers, i.e. generating a word-index\n", "* represent texts as sequences of integers\n", "* represent collections of texts in a Bag-of-Words (BOW)-matrix" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "from tensorflow.keras.preprocessing.text import Tokenizer" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Generate a `Tokenizer`-object and fit it on the given list of texts:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "tokenizer = Tokenizer()\n", "tokenizer.fit_on_texts(newsliststring)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Tokenizer-class accepts a list of arguments, which can be configured at initialisation of a Tokenizer-object. The default-values are printed below" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Configured maximum number of words in the vocabulary: None\n", "Configured filters: !\"#$%&()*+,-./:;<=>?@[\\]^_`{|}~\t\n", "\n", "Map all characters to lower case: True\n", "Tokenizsation on character level: False\n" ] } ], "source": [ "print(\"Configured maximum number of words in the vocabulary: \",tokenizer.num_words) #Maximum number of words to regard in the vocabulary\n", "print(\"Configured filters: \",tokenizer.filters) #characters to ignore in tokenization\n", "print(\"Map all characters to lower case: \",tokenizer.lower) #Mapping of characters to lower-case\n", "print(\"Tokenizsation on character level: \",tokenizer.char_level) #whether tokens are words or characters" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of documents: 15\n", "Number of words: 228\n" ] } ], "source": [ "print(\"Number of documents: \",tokenizer.document_count)\n", "print(\"Number of words: \",len(tokenizer.word_index))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Index of words: {'der': 1, 'in': 2, 'die': 3, 'auf': 4, 'und': 5, 'trump': 6, 'vor': 7, 'us': 8, 'donald': 9, 'mit': 10, 'eu': 11, 'gegen': 12, 'könnte': 13, 'mehr': 14, 'als': 15, 'ukraine': 16, 'warnt': 17, 'weitere': 18, 'ermittlungen': 19, 'doch': 20, 'wahlkampf': 21, 'im': 22, 'fordert': 23, 'einem': 24, 'ist': 25, 'aus': 26, 'zu': 27, 'haben': 28, 'macht': 29, 'wie': 30, 'noch': 31, 'winter': 32, 'afd': 33, 'elbe': 34, 'liz': 35, 'cheney': 36, 'umwelt': 37, 'robben': 38, 'netzen': 39, 'verendet': 40, 'expertin': 41, 'sieht': 42, 'hinweise': 43, 'mann': 44, 'wird': 45, 'straße': 46, 'gefunden': 47, 'stirbt': 48, 'zwei': 49, 'tage': 50, 'später': 51, 'umfragen': 52, 'zur': 53, 'wahl': 54, 'wer': 55, 'zieht': 56, 'ins': 57, 'weiße': 58, 'haus': 59, '–': 60, 'oder': 61, 'kamala': 62, 'harris': 63, 'kandidaten': 64, 'liegen': 65, 'weiter': 66, 'nah': 67, 'beisammen': 68, 'erlangt': 69, 'führung': 70, 'wichtigen': 71, 'swing': 72, 'states': 73, 'daten': 74, 'zum': 75, 'täglich': 76, 'aktualisierten': 77, 'überblick': 78, 'ampelstreit': 79, 'christian': 80, 'lindner': 81, 'kehrtwende': 82, 'wirtschafts': 83, 'finanzpolitik': 84, 'bundesfinanzminister': 85, 'distanziert': 86, 'sich': 87, 'grundsatzpapier': 88, 'teilen': 89, 'von': 90, 'ampelregierung': 91, 'blick': 92, 'den': 93, 'bundeshaushalt': 94, 'er': 95, 'einsparungen': 96, '3': 97, 'fußball': 98, 'liga': 99, 'wehen': 100, 'wiesbaden': 101, 'respekt': 102, 'pokal': 103, 'schreck': 104, 'bielefeld': 105, 'hochschulen': 106, 'peter': 107, 'bernshausen': 108, 'neuer': 109, 'kanzler': 110, 'tu': 111, 'chemnitz': 112, 'katargate': 113, 'staatsanwaltschaft': 114, 'ermittelt': 115, 'hohen': 116, 'beamten': 117, 'wegen': 118, 'korruption': 119, 'laufen': 120, 'henrik': 121, 'hololei': 122, 'estnische': 123, 'beamte': 124, 'steht': 125, 'unter': 126, 'verdacht': 127, 'teure': 128, 'geschenke': 129, 'katar': 130, 'angenommen': 131, 'zweithöchste': 132, 'warnstufe': 133, 'unwetter': 134, 'erreicht': 135, 'balearen': 136, 'starker': 137, 'regen': 138, 'mallorca': 139, 'nahostkonflikt': 140, 'trügerische': 141, 'siege': 142, 'israel': 143, 'hat': 144, 'irans': 145, 'region': 146, 'stark': 147, 'geschwächt': 148, 'so': 149, 'dominant': 150, 'heute': 151, 'war': 152, 'es': 153, 'nie': 154, 'iran': 155, 'seiner': 156, 'derzeitigen': 157, 'schwäche': 158, 'eine': 159, 'stärke': 160, 'machen': 161, 'kriminalität': 162, '18': 163, 'jähriger': 164, 'soll': 165, '30': 166, 'straftaten': 167, 'begangen': 168, 'krieg': 169, 'naht': 170, 'mobil': 171, 'erlebte': 172, 'oktober': 173, 'einen': 174, 'härtesten': 175, 'monate': 176, 'seit': 177, 'kriegsbeginn': 178, 'jetzt': 179, 'beginnt': 180, 'stimmung': 181, 'wieder': 182, 'unwetterwarnungen': 183, 'spanien': 184, 'umgang': 185, 'senatorin': 186, 'verbotsverfahren': 187, 'bundesebene': 188, 'hamburgs': 189, 'gewässer': 190, 'kann': 191, 'nur': 192, 'schiffe': 193, 'tragen': 194, 'ein': 195, 'podcast': 196, 'für': 197, 'lebensqualität': 198, 'hamburg': 199, 'alster': 200, 'bille': 201, 'besser': 202, 'nutzen': 203, 'wo': 204, 'man': 205, 'künftig': 206, 'schwimmen': 207, 'surfen': 208, 'flanieren': 209, 'klimaschutz': 210, 'jugendliche': 211, 'sollen': 212, 'klimaräten': 213, 'mitwirken': 214, 'können': 215, 'nach': 216, 'erneuter': 217, 'attacke': 218, 'offener': 219, 'bühne': 220, 'diskutierte': 221, 'gewaltfantasien': 222, 'seine': 223, 'parteiinterne': 224, 'kritikerin': 225, 'nun': 226, 'tyrannen': 227, 'präsidenten': 228}\n" ] } ], "source": [ "print(\"Index of words: \",tokenizer.word_index)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of docs, in which word appears: defaultdict(, {'in': 7, 'expertin': 1, 'netzen': 1, 'umwelt': 1, 'sieht': 1, 'weitere': 2, 'verendet': 1, 'hinweise': 1, 'robben': 1, 'mann': 1, 'zwei': 1, 'tage': 1, 'wird': 1, 'und': 4, 'auf': 5, 'ermittlungen': 2, 'später': 1, 'stirbt': 1, 'straße': 1, 'gefunden': 1, 'beisammen': 1, 'donald': 2, 'harris': 1, 'zur': 1, 'umfragen': 1, 'us': 2, 'überblick': 1, 'führung': 1, 'zum': 1, 'weiße': 1, 'liegen': 1, 'haus': 1, 'weiter': 1, 'wahlkampf': 2, 'erlangt': 1, 'nah': 1, 'trump': 2, 'wahl': 1, '–': 1, 'die': 4, 'states': 1, 'aktualisierten': 1, 'wichtigen': 1, 'oder': 1, 'täglich': 1, 'doch': 2, 'kamala': 1, 'wer': 1, 'zieht': 1, 'kandidaten': 1, 'daten': 1, 'ins': 1, 'swing': 1, 'im': 2, 'kehrtwende': 1, 'finanzpolitik': 1, 'ampelregierung': 1, 'christian': 1, 'lindner': 1, 'bundesfinanzminister': 1, 'grundsatzpapier': 1, 'den': 1, 'sich': 1, 'einsparungen': 1, 'mit': 3, 'distanziert': 1, 'der': 6, 'wirtschafts': 1, 'fordert': 1, 'bundeshaushalt': 1, 'teilen': 1, 'von': 1, 'blick': 1, 'ampelstreit': 1, 'er': 1, 'einem': 2, 'schreck': 1, 'respekt': 1, '3': 1, 'pokal': 1, 'liga': 1, 'wehen': 1, 'fußball': 1, 'bielefeld': 1, 'vor': 3, 'wiesbaden': 1, 'kanzler': 1, 'tu': 1, 'hochschulen': 1, 'chemnitz': 1, 'ist': 2, 'neuer': 1, 'peter': 1, 'bernshausen': 1, 'wegen': 1, 'staatsanwaltschaft': 1, 'haben': 2, 'angenommen': 1, 'zu': 2, 'katargate': 1, 'beamten': 1, 'hohen': 1, 'korruption': 1, 'aus': 2, 'unter': 1, 'beamte': 1, 'teure': 1, 'katar': 1, 'gegen': 2, 'eu': 1, 'henrik': 1, 'ermittelt': 1, 'hololei': 1, 'steht': 1, 'laufen': 1, 'estnische': 1, 'geschenke': 1, 'verdacht': 1, 'erreicht': 1, 'regen': 1, 'unwetter': 1, 'warnstufe': 1, 'mallorca': 1, 'balearen': 1, 'zweithöchste': 1, 'starker': 1, 'so': 1, 'nahostkonflikt': 1, 'wie': 2, 'seiner': 1, 'region': 1, 'siege': 1, 'eine': 1, 'israel': 1, 'geschwächt': 1, 'war': 1, 'schwäche': 1, 'macht': 2, 'trügerische': 1, 'noch': 2, 'iran': 1, 'es': 1, 'machen': 1, 'dominant': 1, 'stärke': 1, 'stark': 1, 'irans': 1, 'hat': 1, 'nie': 1, 'könnte': 2, 'heute': 1, 'derzeitigen': 1, '30': 1, 'soll': 1, 'als': 3, 'mehr': 2, 'begangen': 1, 'jähriger': 1, '18': 1, 'straftaten': 1, 'kriminalität': 1, 'naht': 1, 'härtesten': 1, 'jetzt': 1, 'krieg': 1, 'kriegsbeginn': 1, 'seit': 1, 'beginnt': 1, 'erlebte': 1, 'unwetterwarnungen': 1, 'einen': 1, 'monate': 1, 'oktober': 1, 'mobil': 1, 'stimmung': 1, 'winter': 1, 'wieder': 1, 'ukraine': 1, 'spanien': 1, 'umgang': 1, 'senatorin': 1, 'warnt': 2, 'bundesebene': 1, 'afd': 1, 'verbotsverfahren': 1, 'kann': 1, 'nutzen': 1, 'alster': 1, 'schiffe': 1, 'künftig': 1, 'für': 1, 'hamburgs': 1, 'flanieren': 1, 'tragen': 1, 'schwimmen': 1, 'gewässer': 1, 'man': 1, 'bille': 1, 'ein': 1, 'elbe': 1, 'wo': 1, 'lebensqualität': 1, 'surfen': 1, 'nur': 1, 'hamburg': 1, 'besser': 1, 'podcast': 1, 'klimaschutz': 1, 'mitwirken': 1, 'klimaräten': 1, 'sollen': 1, 'jugendliche': 1, 'können': 1, 'nach': 1, 'diskutierte': 1, 'attacke': 1, 'bühne': 1, 'erneuter': 1, 'seine': 1, 'cheney': 1, 'liz': 1, 'kritikerin': 1, 'nun': 1, 'präsidenten': 1, 'gewaltfantasien': 1, 'tyrannen': 1, 'offener': 1, 'parteiinterne': 1})\n" ] } ], "source": [ "print(\"Number of docs, in which word appears: \",tokenizer.word_docs)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "text 0 sequence: [37, 38, 2, 39, 40, 41, 42, 18, 43]\n", "text 1 sequence: [19, 44, 45, 4, 46, 47, 5, 48, 49, 50, 51]\n", "text 2 sequence: [52, 53, 8, 54, 55, 56, 57, 58, 59, 60, 9, 6, 61, 62, 63, 3, 64, 65, 66, 67, 68, 20, 6, 69, 3, 70, 2, 71, 72, 73, 3, 74, 75, 8, 21, 22, 76, 77, 78]\n", "text 3 sequence: [79, 80, 81, 23, 82, 2, 83, 5, 84, 1, 85, 86, 87, 2, 24, 88, 2, 89, 90, 1, 91, 10, 92, 4, 93, 94, 23, 95, 18, 96]\n", "text 4 sequence: [97, 98, 99, 100, 101, 10, 102, 7, 103, 104, 105]\n", "text 5 sequence: [106, 107, 108, 25, 109, 110, 1, 111, 112]\n", "text 6 sequence: [113, 11, 114, 115, 12, 116, 117, 118, 119, 2, 1, 11, 120, 19, 12, 121, 122, 1, 123, 11, 124, 125, 126, 127, 128, 129, 26, 130, 131, 27, 28]\n", "text 7 sequence: [132, 133, 134, 135, 136, 137, 138, 4, 139]\n", "text 8 sequence: [140, 141, 142, 143, 144, 145, 29, 2, 1, 146, 147, 148, 149, 150, 30, 151, 152, 153, 31, 154, 20, 1, 155, 13, 26, 156, 157, 158, 159, 160, 161]\n", "text 9 sequence: [162, 163, 164, 165, 14, 15, 166, 167, 168, 28]\n", "text 10 sequence: [16, 169, 1, 32, 170, 3, 16, 29, 171, 3, 16, 172, 22, 173, 174, 1, 175, 176, 177, 178, 179, 180, 1, 32, 30, 25, 3, 181, 5, 182, 183, 2, 184]\n", "text 11 sequence: [185, 10, 1, 33, 186, 17, 7, 33, 187, 4, 188]\n", "text 12 sequence: [189, 190, 3, 34, 191, 14, 15, 192, 193, 27, 194, 195, 196, 197, 14, 198, 199, 13, 34, 200, 5, 201, 31, 202, 203, 204, 205, 206, 207, 208, 5, 209, 13]\n", "text 13 sequence: [210, 211, 212, 2, 213, 214, 215]\n", "text 14 sequence: [8, 21, 35, 36, 17, 216, 217, 218, 7, 9, 6, 4, 219, 220, 221, 9, 6, 222, 12, 223, 224, 225, 35, 36, 3, 17, 226, 7, 24, 227, 15, 228]\n" ] } ], "source": [ "textSeqs=tokenizer.texts_to_sequences(newsliststring)\n", "for i,ts in enumerate(textSeqs):\n", " print(\"text %d sequence: \"%i,ts)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Represent text-collection as BoW:\n", "A Bag-Of-Words representation of documents contains $N$ rows and $|V|$ columns, where $N$ is the number of documents in the collection and $|V|$ is the size of the vocabulary, i.e. the number of different words in the entire document collection.\n", "\n", "The entry $x_{i,j}$ of the BoW-Matrix indicates the **relevance of word $j$ in document $i$**.\n", "\n", "In this lecture 3 different types of **word-relevance** are considered:\n", "\n", "1. **Binary BoW:** Entry $x_{i,j}$ is *1* if word $j$ appears in document $i$, otherwise 0.\n", "2. **Count-based BoW:** Entry $x_{i,j}$ is the frequency of word $j$ in document $i$.\n", "3. **Tf-idf-based BoW:** Entry $x_{i,j}$ is the tf-idf of word $j$ with respect to document $i$.\n", "\n", "The BoW-representation of texts is a common input to conventional Machine Learning algorithms (not Neural Netorks like CNN and RNN)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Binary BoW" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(15, 229)\n", "[[0. 0. 1. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 1. ... 0. 0. 0.]\n", " ...\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 1. ... 0. 0. 0.]\n", " [0. 0. 0. ... 1. 1. 1.]]\n" ] } ], "source": [ "bow_representation_bin = tokenizer.texts_to_matrix(newsliststring)\n", "print(bow_representation_bin.shape)\n", "print(bow_representation_bin)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Count-based BoW\n", "Represent text-collection as BoW with word-counts:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(15, 229)\n", "[[0. 0. 1. ... 0. 0. 0.]\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 1. ... 0. 0. 0.]\n", " ...\n", " [0. 0. 0. ... 0. 0. 0.]\n", " [0. 0. 1. ... 0. 0. 0.]\n", " [0. 0. 0. ... 1. 1. 1.]]\n" ] } ], "source": [ "bow_representation_count = tokenizer.texts_to_matrix(newsliststring,mode=\"count\")\n", "print(bow_representation_count.shape)\n", "print(bow_representation_count)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Tf-idf-based BoW\n", "In the BoW representation above the term frequency (tf) has been applied. This value measures how often the term (word) appears in the document. If document similarity is calculated on such tf-based BoW representation, common words which appear quite often (in many documents) but have low semantic focus, have a strong impact on the similarity-value. In most cases this is a drawback, since similarity should be based on terms with a high semantic focus. Such semantically meaningful words usually appear only in a few documents. The term frequency inversed document frequency measure (tf-idf) does not only count the frequency of a term in a document, but weighs those terms stronger, which occur only in a few documents of the corpus." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(15, 229)\n", "[[0. 0. 1.05605267 ... 0. 0. 0. ]\n", " [0. 0. 0. ... 0. 0. 0. ]\n", " [0. 0. 1.05605267 ... 0. 0. 0. ]\n", " ...\n", " [0. 0. 0. ... 0. 0. 0. ]\n", " [0. 0. 1.05605267 ... 0. 0. 0. ]\n", " [0. 0. 0. ... 2.14006616 2.14006616 2.14006616]]\n" ] } ], "source": [ "bow_representation_idf = tokenizer.texts_to_matrix(newsliststring,mode=\"tfidf\")\n", "print(bow_representation_idf.shape)\n", "print(bow_representation_idf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Analyse Similarities\n", "For each document the most similar document is calculated from the \n", "* binary\n", "* count\n", "* tf-idf\n", "BoW-matrix." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "From Binary BoW: \t: [ 3 3 14 11 11 10 8 11 10 12 8 4 9 0 11]\n", "From Count BoW: \t: [ 3 7 14 10 11 10 3 1 10 12 3 14 9 3 2]\n", "From tf-idf BoW: \t: [ 3 3 14 11 11 10 8 11 10 12 8 14 9 3 2]\n" ] } ], "source": [ "from sklearn.metrics.pairwise import cosine_similarity\n", "import numpy as np\n", "\n", "def most_similar_rows(bow_representation):\n", " similarities = cosine_similarity(bow_representation)\n", " np.fill_diagonal(similarities, 0) # Ignore self-similarity\n", " most_similar = np.argmax(similarities, axis=1)\n", " return most_similar\n", "\n", "most_similar_bin = most_similar_rows(bow_representation_bin)\n", "print(\"From Binary BoW: \\t:\",most_similar_bin)\n", "most_similar_count = most_similar_rows(bow_representation_count)\n", "print(\"From Count BoW: \\t:\",most_similar_count)\n", "most_similar_idf = most_similar_rows(bow_representation_idf)\n", "print(\"From tf-idf BoW: \\t:\",most_similar_idf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plot each document and the corresponding most similar document, calculated from the tf-idf Bow:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "------------------------------\n", "Most similar news to news 0: 3 3 3\n", "Umwelt: Robben in Netzen verendet? Expertin sieht weitere Hinweise\n", "\n", "Ampelstreit: Christian Lindner fordert Kehrtwende in Wirtschafts- und Finanzpolitik\n", "Der Bundesfinanzminister distanziert sich in einem Grundsatzpapier in Teilen von der Ampelregierung. Mit Blick auf den Bundeshaushalt fordert er weitere Einsparungen.\n", "------------------------------\n", "Most similar news to news 1: 3 7 3\n", "Ermittlungen: Mann wird auf Straße gefunden - und stirbt zwei Tage später\n", "\n", "Ampelstreit: Christian Lindner fordert Kehrtwende in Wirtschafts- und Finanzpolitik\n", "Der Bundesfinanzminister distanziert sich in einem Grundsatzpapier in Teilen von der Ampelregierung. Mit Blick auf den Bundeshaushalt fordert er weitere Einsparungen.\n", "------------------------------\n", "Most similar news to news 2: 14 14 14\n", "Umfragen zur US-Wahl: Wer zieht ins Weiße Haus – Donald Trump oder Kamala Harris?\n", "Die Kandidaten liegen weiter nah beisammen, doch Trump erlangt die Führung in wichtigen Swing-States. Die Daten zum US-Wahlkampf im täglich aktualisierten Überblick\n", "US-Wahlkampf: Liz Cheney warnt nach erneuter Attacke vor Donald Trump\n", "Auf offener Bühne diskutierte Donald Trump Gewaltfantasien gegen seine parteiinterne Kritikerin Liz Cheney. Die warnt nun vor einem Tyrannen als Präsidenten.\n", "------------------------------\n", "Most similar news to news 3: 11 10 11\n", "Ampelstreit: Christian Lindner fordert Kehrtwende in Wirtschafts- und Finanzpolitik\n", "Der Bundesfinanzminister distanziert sich in einem Grundsatzpapier in Teilen von der Ampelregierung. Mit Blick auf den Bundeshaushalt fordert er weitere Einsparungen.\n", "Umgang mit der AfD: Senatorin warnt vor AfD-Verbotsverfahren auf Bundesebene\n", "\n", "------------------------------\n", "Most similar news to news 4: 11 11 11\n", "3. Fußball-Liga: Wehen Wiesbaden mit Respekt vor Pokal-Schreck Bielefeld\n", "\n", "Umgang mit der AfD: Senatorin warnt vor AfD-Verbotsverfahren auf Bundesebene\n", "\n", "------------------------------\n", "Most similar news to news 5: 10 10 10\n", "Hochschulen: Peter Bernshausen ist neuer Kanzler der TU Chemnitz\n", "\n", "Ukraine-Krieg: Der Winter naht, die Ukraine macht mobil\n", "Die Ukraine erlebte im Oktober einen der härtesten Monate seit Kriegsbeginn. Jetzt beginnt der Winter. Wie ist die Stimmung? Und wieder Unwetterwarnungen in Spanien\n", "------------------------------\n", "Most similar news to news 6: 8 3 8\n", "Katargate: EU-Staatsanwaltschaft ermittelt gegen hohen Beamten wegen Korruption\n", "In der EU laufen Ermittlungen gegen Henrik Hololei. Der estnische EU-Beamte steht unter Verdacht, teure Geschenke aus Katar angenommen zu haben.\n", "Nahostkonflikt: Trügerische Siege\n", "Israel hat Irans Macht in der Region stark geschwächt. So dominant wie heute war es noch nie. Doch der Iran könnte aus seiner derzeitigen Schwäche eine Stärke machen.\n", "------------------------------\n", "Most similar news to news 7: 11 1 11\n", "Zweithöchste Warnstufe: Unwetter erreicht Balearen: Starker Regen auf Mallorca\n", "\n", "Umgang mit der AfD: Senatorin warnt vor AfD-Verbotsverfahren auf Bundesebene\n", "\n", "------------------------------\n", "Most similar news to news 8: 10 10 10\n", "Nahostkonflikt: Trügerische Siege\n", "Israel hat Irans Macht in der Region stark geschwächt. So dominant wie heute war es noch nie. Doch der Iran könnte aus seiner derzeitigen Schwäche eine Stärke machen.\n", "Ukraine-Krieg: Der Winter naht, die Ukraine macht mobil\n", "Die Ukraine erlebte im Oktober einen der härtesten Monate seit Kriegsbeginn. Jetzt beginnt der Winter. Wie ist die Stimmung? Und wieder Unwetterwarnungen in Spanien\n", "------------------------------\n", "Most similar news to news 9: 12 12 12\n", "Kriminalität: 18-Jähriger soll mehr als 30 Straftaten begangen haben\n", "\n", "Hamburgs Gewässer: Die Elbe kann mehr, als nur Schiffe zu tragen\n", "Ein Podcast für mehr Lebensqualität: Hamburg könnte Elbe, Alster und Bille noch besser nutzen. Wo man künftig schwimmen, surfen und flanieren könnte.\n", "------------------------------\n", "Most similar news to news 10: 8 3 8\n", "Ukraine-Krieg: Der Winter naht, die Ukraine macht mobil\n", "Die Ukraine erlebte im Oktober einen der härtesten Monate seit Kriegsbeginn. Jetzt beginnt der Winter. Wie ist die Stimmung? Und wieder Unwetterwarnungen in Spanien\n", "Nahostkonflikt: Trügerische Siege\n", "Israel hat Irans Macht in der Region stark geschwächt. So dominant wie heute war es noch nie. Doch der Iran könnte aus seiner derzeitigen Schwäche eine Stärke machen.\n", "------------------------------\n", "Most similar news to news 11: 4 14 14\n", "Umgang mit der AfD: Senatorin warnt vor AfD-Verbotsverfahren auf Bundesebene\n", "\n", "US-Wahlkampf: Liz Cheney warnt nach erneuter Attacke vor Donald Trump\n", "Auf offener Bühne diskutierte Donald Trump Gewaltfantasien gegen seine parteiinterne Kritikerin Liz Cheney. Die warnt nun vor einem Tyrannen als Präsidenten.\n", "------------------------------\n", "Most similar news to news 12: 9 9 9\n", "Hamburgs Gewässer: Die Elbe kann mehr, als nur Schiffe zu tragen\n", "Ein Podcast für mehr Lebensqualität: Hamburg könnte Elbe, Alster und Bille noch besser nutzen. Wo man künftig schwimmen, surfen und flanieren könnte.\n", "Kriminalität: 18-Jähriger soll mehr als 30 Straftaten begangen haben\n", "\n", "------------------------------\n", "Most similar news to news 13: 0 3 3\n", "Klimaschutz: Jugendliche sollen in Klimaräten mitwirken können\n", "\n", "Ampelstreit: Christian Lindner fordert Kehrtwende in Wirtschafts- und Finanzpolitik\n", "Der Bundesfinanzminister distanziert sich in einem Grundsatzpapier in Teilen von der Ampelregierung. Mit Blick auf den Bundeshaushalt fordert er weitere Einsparungen.\n", "------------------------------\n", "Most similar news to news 14: 11 2 2\n", "US-Wahlkampf: Liz Cheney warnt nach erneuter Attacke vor Donald Trump\n", "Auf offener Bühne diskutierte Donald Trump Gewaltfantasien gegen seine parteiinterne Kritikerin Liz Cheney. Die warnt nun vor einem Tyrannen als Präsidenten.\n", "Umfragen zur US-Wahl: Wer zieht ins Weiße Haus – Donald Trump oder Kamala Harris?\n", "Die Kandidaten liegen weiter nah beisammen, doch Trump erlangt die Führung in wichtigen Swing-States. Die Daten zum US-Wahlkampf im täglich aktualisierten Überblick\n" ] } ], "source": [ "for i in range(len(newsliststring)):\n", " print(\"-\"*30)\n", " print(\"Most similar news to news %d: \"%i,most_similar_bin[i],most_similar_count[i],most_similar_idf[i])\n", " print(newsliststring[i])\n", " print(newsliststring[most_similar_idf[i]])" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "from sklearn.manifold import TSNE\n", "from matplotlib import pyplot as plt\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "tsneModel=TSNE(n_components=2,random_state=0,perplexity=12,metric=\"cosine\")\n", "np.set_printoptions(suppress=True)\n", "model2d=tsneModel.fit_transform(bow_representation_idf)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "image/png": "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AAAAAAUgCAAAAAAAQAEIAgAAAAAAUACCAAAAAAAAFIAgAAAAAAAABSAIAAAAAABAAQgCAAAAAABQAIIAAAAAAAAUgCAAAAAAAAAFIAgAAAAAAEABCAIAAAAAAFAAggAAAAAAABSAIAAAAAAAAAUgCAAAAAAAQAEIAgAAAAAAUACCAAAAAAAAFIAgAAAAAAAABSAIAAAAAABAAQgCAAAAAABQAIIAAAAAAAAUgCAAAAAAAAAFIAgAAAAAAEABCAIAAAAAAFAAggAAAAAAABSAIAAAAAAAAAUgCAAAAAAAQAEIAgAAAAAAUACCAAAAAAAAFIAgAAAAAAAABSAIAAAAAABAAQgCAAAAAABQAIIAAAAAAAAUgCAAAAAAAAAFIAgAAAAAAEABCAIAAAAAAFAAggAAAAAAABSAIAAAAAAAAAUgCAAAAAAAQAEIAgAAAAAAUACCAAAAAAAAFIAgAAAAAAAABSAIAAAAAABAAQgCAAAAAABQAIIAAAAAAAAUgCAAAAAAAAAFIAgAAAAAAEABCAIAAAAAAFAAggAAAAAAABSAIAAAAAAAAAUgCAAAAAAAQAEIAgAAAAAAUACCAAAAAAAAFIAgAAAAAAAABSAIAAAAAABAAQgCAAAAAABQAIIAAAAAAAAUgCAAAAAAAAAFIAgAAAAAAEABCAIAAAAAAFAAggAAAAAAABSAIAAAAAAAAAUgCAAAAAAAQAEIAgAAAAAAUACCAAAAAAAAFIAgAAAAAAAABSAIAAAAAABAAQgCAAAAAABQAIIAAAAAAAAUgCAAAAAAAAAFIAgAAAAAAEABCAIAAAAAAFAAggAAAAAAABSAIAAAAAAAAAUgCAAAAAAAQAEIAgAAAAAAUACCAAAAAAAAFIAgAAAAAAAABSAIAAAAAABAAQgCAAAAAABQAIIAAAAAAAAUgCAAAAAAAAAFIAgAAAAAAEABCAIAAAAAAFAAggAAAAAAABSAIAAAAAAAAAUgCAAAAAAAQAEIAgAAAAAAUACCAAAAAAAAFIAgAAAAAAAABSAIAAAAAABAAQgCAAAAAABQAIIAAAAAAAAUgCAAAAAAAAAFIAgAAAAAAEABCAIAAAAAAFAAggAAAAAAABSAIAAAAAAAAAUgCAAAAAAAQAEIAgAAAAAAUACCAAAAAAAAFIAgAAAAAAAABSAIAAAAAABAAQgCAAAAAABQAIIA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AAAAACgAQQAAAAAAAApAEAAAAAAAgAIQBAAAAAAAoAAEAQAAAAAAKABBAAAAAAAACkAQAAAAAACAAhAEAAAAAACgAAQBAAAAAAAoAEEAAAAAAAAKQBAAAAAAAIACEAQAAAAAAKAABAEAAAAAACgAQQAAAAAAAApAEAAAAAAAgAIQBAAAAAAAoAAEAQAAAAAAKABBAAAAAAAACkAQAAAAAACAAhAEAAAAAACgAAQBAAAAAAAoAEEAAAAAAAAKQBAAAAAAAIACEAQAAAAAAKAABAEAAAAAACgAQQAAAAAAAApAEAAAAAAAgAIQBAAAAAAAoAAEAQAAAAAAKABBAAAAAAAACkAQAAAAAACAAhAEAAAAAACgAAQBAAAAAAAoAEEAAAAAAAAKQBAAAAAAAIACEAQAAAAAAKAABAEAAAAAACgAQQAAAAAAAApAEAAAAAAAgAIQBAAAAAAAoAAEAQAAAAAAKABBAAAAAAAACkAQAAAAAACAAhAEAAAAAACgAAQBAAAAAAAoAEEAAAAAAAAKQBAAAAAAAIACEAQAAAAAAKAABAEAAAAAACgAQQAAAAAAAApAEAAAAAAAgAIQBAAAAAAAoAAEAQAAAAAAKABBAAAAAAAACkAQAAAAAACAAhAEAAAAAACgAAQBAAAAAAAoAEEAAAAAAAAKQBAAAAAAAIACEAQAAAAAAKAABAEAAAAAACgAQQAAAAAAAApAEAAAAAAAgAIQBAAAAAAAoAAEAQAAAAAAKABBAAAAAAAACkAQAAAAAACAAhAEAAAAAACgAAQBAAAAAAAoAEEAAAAAAAAKQBAAAAAAAIACEAQAAAAAAKAABAEAAAAAACgAQQAAAAAAAApAEAAAAAAAgAIQBAAAAAAAoAAEAQAAAAAAKABBAAAAAAAACkAQAAAAAACAAhAEAAAAAACgAAQBAAAAAAAoAEEAAAAAAAAKQBAAAAAAAIACEAQAAAAAAKAABAEAAAAAACgAQQAAAAAAAApAEAAAAAAAgAIQBAAAAAAAoAAEAQAAAAAAKABBAAAAAAAACkAQAAAAAACAAhAEAAAAAACgAAQBAAAAAAAoAEEAAAAAAAAKQBAAAAAAAIACEAQAAAAAAKAABAEAAAAAACgAQQAAAAAAAApAEAAAAAAAgAIQBAAAAAAAoAAEAQAAAAAAKABBAAAAAAAACkAQAAAAAACAAhAE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55xzTpLKGQAvdRbTPffc036GwDnnnCNoAnSDUrlcLld7iO7W0tKShoaGNDc3p76+vtrjAAAA7JcFCxbkHe94R5Lk5JNPzq9+9ascdNBBHdbcf//9Ofnkk/Pcc8/lsMMOy7p16zJggJPDga6zatWqjBs3LkkyY8aMzJ07d6/7/O53v8urX/3q7NixIyeccEJ++ctfpra2tv39bdu25U1velPuu+++DBgwIA899FAmTpzYXT8CQL/SmePf/lYIAADQR9x5553tzz/1qU/tEgOS5Pjjj8+ZZ56ZH/3oR3nmmWfyyCOP5LjjjuvJMYF+5o477sjy5cvbX69fv779+fLly3cJAjNnztzlexx99NG59NJL8/d///e57777Mnny5PzVX/1VJkyYkBUrVuQLX/hCHnjggSTJX/7lX4oBAN1EEAAAAOgjtm/f3v58/PjxL7luwoQJ7c9bW1u7dSag/7vhhhsyb9683b535513doiVye6DQJJceeWVWbduXf7lX/4lDzzwQN797nfvsuaDH/xg/u7v/u6AZwZg99xDAAAAoI84+uij25+vXLnyJdetWLEiSeW63T5lC/QWNTU1+eY3v5lFixblnHPOyZFHHplDDjkkRx55ZM4555wsXrw4N9xwQ2pqHK4C6C7uIQAAANBHPP3003nFK16RlpaWTJ48OUuXLt3lskEPPPBATjrppGzfvj3vec978p3vfKdK0wIA0BM6c/xbcgUAAOgjRowYkblz56a2tjZ33nlnJk2alPnz5+eee+7JbbfdltmzZ+e0007L9u3b87rXvS5f+cpXqj0yAAC9iDMEAAAA+piHHnooX/nKV/Iv//IvefF/0o0cOTJ/9Vd/lQ996EMZPHhwlSYEAKCnOEMAAACgn3ruuefyne98JzfddNMuMSBJfv/73+fGG2/M7bff3vPDAQDQqwkCAAAAfcSWLVvyx3/8x7nyyiuzYcOGXHbZZXn44YfT2tqa5ubm3HLLLTn11FOzbNmynHXWWbnmmmuqPTIAAL2ISwYBAAD0EZdeemm+/OUvJ0nmzp2bGTNm7LJmx44dmTJlSn7xi1+kpqYmDzzwQF772tf29KgAAPQQlwwCAADoZ8rlcubMmZMkOfroo3cbA5JkwIAB+dznPpckaWtra98HAAAEAQAAgD7g97//fTZu3Jgkef3rX7/Htccff3z780ceeaRb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ZgIAAKAzSqWksbHyAACALuCSQQAAAAAAUACCAAAAAAAAFIAgAAAAAAAABSAIAAAAAABAAQgCAAAAAABQAIIAAAAAAAAUgCAAAAAAAAAFIAgAAAAAAEABCAIAAAAAAFAAggAAAAAAABSAIAAAAAAAAAUgCAAAAAAAQAEIAgAAAAAAUACCAAAAAAAAFIAgAAAAAAAABSAIAAAAAABAAQgCAAAAAABQAIIAAAAAAAAUgCAAAAAAAAAFIAgAAAAAAEABCAIAAAAAAFAAggAAAAAAABSAIAAAAAAAAAUgCAAAAAAAQAEIAgAAAAAAUACCAAAAAAAAFIAgAAAAAAAABSAIAAAAAABAAQgCAAAAAABQAIIAAAAAAAAUgCAAAAAAAAAFIAgAAAAAAEABCAIAAAAAAFAAggAAAAAAABSAIAAAAAAAAAUgCAAAAAAAQAEIAgAAAAAAUACCAAAAAAAAFIAgAAAAAAAABSAIAAAAAABAAQgCAAAAAABQAIIAAAAAAAAUgCAAAAAAAAAFIAgAAAAAAEABCAIAAAAAAFAAggAAAAAAABSAIAAAAAAAAAUgCAAAAAAAQAEIAgAAAAAAUACCAAAAAAAAFIAgAAAAAAAABSAIAAAAAABAAQgCAAAAAABQAIIAAAAAAAAUgCAAAAAAAAAFIAgAAAAAAEABCAIAAAAAAFAAggAAAAAAABSAIAAAAAAAAAUgCAAAAAAAQAEIAgAAAAAAUACCAAAAAAAAFIAgAAAAAAAABSAIAAAAAABAAQgCAAAAAABQAIIAAAAAAAAUgCAAAAAAAAAFIAgAAAAAAEABCAIAAAAAAFAAggAAAAAAABSAIAAAAAAAAAUgCAAAAAAAQAEIAgAAAAAAUACCAAAAAAAAFIAgAAAAAAAABSAIAAAAAABAAQgCAAAAAABQAIIAAAAAAAAUgCAAAAAAAAAFIAgAAAAAAEABCAIAAAAAAFAAggAAAAAAABSAIAAAAAAAAAUgCAAAAAAAQAEIAgAAAAAAUACCAAAAAAAAFIAgAAAAAAAABSAIAAAAAABAAQgCAAAAAABQAIIAAAAAAAAUgCAAAAAAAAAFIAgAAAAAAEABCAIAAAAAAFAAggAAAAAAABSAIAAAAAAAAAUgCAAAAAAAQAEIAgAAAAAAUACCAAAAAAAAFIAgAAAAAAAABSAIAAAAAABAAQgCAAAAAABQAIIAAAAAAAAUgCAAAAAAAAAFIAgAAAAAAEABCAIAAAAAAFAAggAAAAAAABSAIAAAAAAAAAUgCAAAAAAAQAEIAgAAAAAAUACCAAAAAAAAFIAgAAAAAAAABSAIAAAAAABAAQgCAAAAAABQAIIAAAAAAAAUgCAAAAAAAAAFIAgAAAAAAEABCAIAAAAAAFAAggAAAAAAABSAIAAAAAAAAAUgCAAAAAAAQAEIAgAAAAAAUACCAAAAAAAAFIAgAAAAAAAABSAIAAAAAABAAQgCAAAAAABQAIIAAAAAAAAUgCAAAAAAAAAFUNUgMHbs2JRKpQ6Pv/7rv+6w5vHHH89ZZ52VwYMHZ/jw4bn44ouzffv2Kk0MAAAAAAB904BqD/DZz342F110UfvrIUOGtD9//vnnM23atIwYMSJ33HFHNmzYkBkzZqRcLue6666rxrgAAAAAANAnVT0I1NXVZdSoUbt975ZbbslDDz2UJ554IkceeWSS5Mtf/nJmzpyZK6+8MvX19bvdr7W1Na2tre2vW1paun5wAAAAAADoQ6p+D4EvfOELaWxszOte97pceeWVHS4HdPfdd+e4445rjwFJMnXq1LS2tub+++9/ye951VVXpaGhof0xZsyYbv0ZAAAAAACgt6vqGQKf+MQn8od/+Ic57LDDcu+99+ZTn/pUHnvssdxwww1JkrVr12bkyJEd9jnssMNyyCGHZO3atS/5fT/1qU/lz//8z9tft7S0iAIAAAAAABRalweBK664IrNnz97jmmXLluWEE07IJZdc0r7tta99bQ477LC84x3vaD9rIElKpdIu+5fL5d1u32ngwIEZOHDgfv4EAAAAAADQ/3R5EPj4xz+ed7/73XtcM3bs2N1uP+mkk5Iky5cvT2NjY0aNGpX/83/+T4c1zzzzTJ577rldzhwAAAAAAABeWpcHgeHDh2f48OH7te8DDzyQJDniiCOSJCeffHKuvPLKPPXUU+3bbrnllgwcODDHH3981wwMAAAAAAAFULV7CNx999255557cvrpp6ehoSHLli3LJZdckrPPPjsvf/nLkyRTpkzJq171qrzvfe/LF7/4xWzcuDGXXnppLrrootTX11drdAAAAAAA6HOqFgQGDhyY733ve5k9e3ZaW1tz1FFH5aKLLspll13Wvuaggw7KokWL8tGPfjSTJ09ObW1tLrjggnzpS1+q1tgAAAAAANAnlcrlcrnaQ3S3lpaWNDQ0pLm52ZkFAAAAAAD0G505/l3TQzMBAAAAAABVJAgAAAAAAEABCAIAAAAAAFAAggAAAAAAABSAIAAAAAAAAAUgCAAAAAAAQAEIAgAAAAAAUACCAAAAAAAAFIAgAAAAAAAABSAIAAAAAABAAQgCAAAAAABQAIIAAAAAAAAUgCAAAAAAAAAFIAgAUBjr1q3LzTffnMsvvzxnnHFGhg8fnlKplFKplJkzZ+7T93j22Wfzb//2b5k1a1ZOPPHEDBs2LAcffHCGDRuWk08+OVdccUWeeuqp7v1BAAAAAPbDgGoPAAA9ZeTIkQe0/3/8x3/k1FNPzaZNm3Z575lnnsk999yTe+65J1/5yldyww035Pzzzz+gPw8AAACgKwkCABTSmDFjcuyxx+aWW27Z531aWlraY8DkyZNz5pln5oQTTkhjY2OefvrpLFy4MDfccEM2bdqUCy64IHV1dTnjjDO660cAAAAA6BRBAIDCuPzyyzNp0qRMmjQpI0eOzKpVqzJu3Lh93r+mpibnn39+PvOZz+RVr3rVLu9PmTIlZ5xxRt7+9rfn+eefz6xZs/Loo4+mVCp15Y8BAAAAsF8EAQAKY/bs2Qe0/ymnnJJTTjllj2vOOeecnHfeeVmwYEFWrFiRX//613n9619/QH8uAAAAQFdwU2EA6GKnn356+/MVK1ZUcRIAAACA/yEIAEAXa21tbX9eU+NftQAAAEDv4CgFAHSxpUuXtj8/5phjqjgJAAAAwP8QBACgC/3mN7/JokWLkiSvfvWrd3vzYQAAAIBqEAQAoIu0trbmT//0T/P8888nST7/+c9XeSIAAACA/yEIAEAX+fjHP5777rsvSTJjxoycffbZVZ4IAAAA4H8IAgDQBa666qrccMMNSZLjjz8+//iP/1jliQAAAAA6EgQA4AB9/etfz9/8zd8kSV75ylfmJz/5SQYPHlzlqQAAAAA6EgQA4ADceOON+ehHP5okOeqoo3LbbbdlxIgRVZ4KAAAAYFeCAADsp3//93/PhRdemLa2thxxxBH52c9+ltGjR1d7LAAAAIDdEgQAYD/87Gc/y/nnn58dO3aksbExt956ayZMmFDtsQAAAABekiAAAJ1011135Zxzzklra2vq6+uzZMmSvPrVr672WAAAAAB7JAgAQCf8+te/zrRp07Jly5YMHjw4ixcvzvHHH1/tsQAAAAD2akC1BwCAnnLHHXdk+fLl7a/Xr1/f/nz58uWZO3duh/UzZ87s8HrFihWZOnVqmpqakiR/93d/l4aGhvz2t799yT/z8MMPz+GHH37AswMAAAAcqFK5XC5Xe4ju1tLSkoaGhjQ3N6e+vr7a4wBQJTNnzsy8efP2ef2L/xU5d+7cvP/97+/Un/mZz3wmV1xxRaf2AQAAANhXnTn+7ZJBAAAAAABQAM4QAAAAAACAPsoZAgAAAAAAQAeCAAAAAAAAFIAgAAAAAAAABSAIAAAAAABAAQgCAAAAAABQAIIAAAAAAAAUgCAAAAAAAAAFMKDaAwBAtyiXkw0bks2bkyFDksbGpFSq9lQAAAAAVeMMAQD6l6am5JprkokTkxEjknHjKl8nTqxsb2qq9oQAAAAAVSEIANB/LFmSjB6dXHJJsnJlx/dWrqxsHz26sg4AAACgYAQBAPqHJUuSadOSbdsqlwsqlzu+v3Pbtm2VdaIAAAAAUDCCAAB9X1NTMn165YB/W9ue17a1VdZNn+7yQQAAAEChCAIA9H3z5iVbt+49BuzU1lZZP39+984FAAAA0IsIAgD0beVyct11+7fvtdfuemkhAAAAgH5KEACgb9uwIVmxovMH9svlyn4bN3bPXAAAAAC9jCAAQN+2efOB7b9pU9fMAQAAANDLCQIA9G1DhhzY/nV1XTMHAAAAQC8nCADQtzU2JhMmJKVS5/YrlSr7DRvWPXMBAAAA9DKCAAB9W6mUzJq1f/tefHHnQwIAAABAHyUIAND3zZiRDBqU1Ozjv9ZqairrL7ywe+cCAAAA6EUEAQD6vqFDkwULKp/231sUqKmprFu4sLIfAAAAQEEIAgD0D1OnJosWJbW1lQP+L74U0M5ttbXJ4sXJlCnVmRMAAACgSgQBAPqPqVOT1auTq69Oxo/v+N748ZXta9aIAQAAAEAhlcrlcrnaQ3S3lpaWNDQ0pLm5OfX19dUeB4CeUC4nGzcmmzYldXXJsGFuIAwAAAD0O505/j2gh2YCgJ5VKiWNjZUHAAAAAC4ZBAAAAAAARSAIAAAAAABAAQgCAAAAAABQAIIAAAAAAAAUgCAAAAAAAAAFIAgAAAAAAEABCAIAAAAAAFAAggAAAAAAABSAIAAAAAAAAAUgCAAAAAAAQAEIAgAAAAAAUACCAAAAAAAAFIAgAAAAAAAABSAIAAAAAABAAQgCAAAAAABQAIIAAAAAAAAUgCAAAAAAAAAFIAgAAAAAAEABCAIAAAAA/397dx/lVV3nAfw9PMww8jA8DIIkIrjYrpE9aFuwGZoKumhlRGXnKJw1206i+bSnklQ0MWulNNu0PRpqramb1vq0oeVTuhZEejLdNR/QUYEMlBlABWLu/jGHqQnkQWbmB7/7ep3zO/P7fe/n/vyM53fvZe77d78XAEpAIAAAAAAAACUgEAAAAAAAgBIQCAAAAAAAQAkIBAAAAAAAoAQEAgAAAAAAUAICAQAAAAAAKAGBAAAAAAAAlIBAAAAAAAAASkAgAAAAAAAAJSAQAAAAAACAEhAIAAAAAABACQgEAAAAAACgBAQCAAAAAABQAgIBAAAAAAAoAYEAAAAAAACUgEAAAAAAAABKQCAAAAAAAAAlIBAAAAAAAIASEAgAAAAA7KJ+85vf5MILL8yRRx6ZkSNHpq6uLv369cu+++6bGTNm5Be/+EWlWwRgJ1JTFEVR6Sa6WktLSxoaGtLc3JwBAwZUuh0AAACAHTZx4sTcf//9W6077rjjcuWVV6a2trYbugKgu23P+e9e3dQTAAAAAJ3oxRdfTJKMGDEi06ZNy0EHHZS99torGzZsyEMPPZS5c+fmxRdfzPe///386U9/ynXXXVfhjgGoNFcIAAAAAOyCjjrqqBx//PGZOnVqevbsucny5cuX5x/+4R/y+9//Pkly//3356CDDuruNgHoYttz/ts9BAAAAAB2Qbfddls+/vGPbzYMSJLGxsbMnTu3/fWPfvSj7moNgJ2UQAAAAACgSh188MHtz59++unKNQLATkEgAAAAAFCl1q1b1/68Rw+ngQDKzpEAAAAAoErdd9997c//9m//toKdALAzEAgAAAAAVKHW1tZcdNFF7a8//vGPV7AbAHYGAgEAAACAKvTNb34zCxYsSJIcc8wxOfDAAyvcEQCVJhAAAAAAqDL33XdfvvjFLyZJdt9991x++eUV7giAnYFAAAAAAKCKPPbYYznmmGPypz/9KXV1dbnxxhszbNiwSrcFwE5AIAAAAABQJRYvXpxJkybllVdeSc+ePfPDH/4wEydOrHRbAOwkBAIAAAAAVWDJkiU57LDDsmTJktTU1OR73/tejjnmmEq3BcBORCAAAAAAsItbvnx5Dj/88DzzzDNJkssuuyzHH398hbsCYGcjEAAAAADYhTU3N2fy5Ml5/PHHkyQXXXRRTjrppAp3BcDOSCAAAAAAsIt69dVXM2XKlPzmN79JksyaNStf+MIXKtwVADsrgQAAAADALmjdunU55phj8uCDDyZJPv/5z+eCCy6ocFcA7Mx6VboBAACASnjppZeyYMGCLFiwIAsXLszChQuzYsWKJMn06dNz9dVXv+n3fvXVVzNu3LgsXrw4STJq1Kg8++yzndA1wJ8de+yxufPOO5MkH/zgB3PCCSfkd7/73RvW19bWZt999+2u9gDYCQkEAACAUho2bFiXvfc555zTHgYAdJWbb765/fndd9+d/ffff4v1wkkATBkEAACU3siRIzNp0qROea+HH344l1xySfr06ZP+/ft3ynsCAEBnEAgAAACldM455+TWW2/NsmXL0tTUlO9+97s7/J4bNmzIiSeemA0bNuSss87K4MGDO6FTgM0rimK7Hq4OAEAgAAAAlNJ5552Xo446qlOnDrr00kuzaNGivPWtb80XvvCFTntfAADoDAIBAACATvDcc8/lnHPOSZJcfvnlqa2trXBHAADQkUAAAACgE3zuc5/LmjVrctxxx+WQQw6pdDsAALAJgQAAAMAOuv7663PHHXdk0KBBufjiiyvdDgAAbJZAAAAAYAe88sorOfXUU5MkF110UXbffffKNgQAAG9AIAAAALAD/uVf/iV/+MMfMn78+Jx44omVbgcAAN6QQAAAAOBNuv/++/O9730vvXr1yhVXXJGamppKtwQAAG+oV6UbAAAA2BWtXbs2n/nMZ1IURT7/+c9n//33r3RLQLUrimTFimT16qRfv2TIkEQQCcB2cIUAAADAmzBnzpw88cQTGTlyZGbPnl3pdoBqtnJlcumlydixydChyejRbT/Hjm0bX7my0h0CsItwhQAAAMCb8LWvfS1Jcthhh+W2227bbM2aNWvaf15//fVJkt133z0f/OAHu6dJYNc3f34ydWry6qubLnvmmeS005JZs5KbbkomT+7+/gDYpQgEAAAA3oR169YlSebNm5d58+ZtsXb58uU59thjkyQTJ04UCADbZv78ZMqUtqmCimLT5RvHXnutre7224UCAGyRKYMAAAAAdjYrV7ZdGVAUSWvrlmtbW9vqpk41fRAAWyQQAAAAeBOKotjqY9SoUUmSUaNGtY/de++9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1BMAlVZTkwwZ0vYAAAAAoHRMGQQAAAAAACUgEAAAAAAAgBIQCAAAAAAAQAkIBAAAAAAAoAQEAgAAAAAAUAICAQAAAAAAKAGBAAAAAAAAlECXBgJz5szJhAkTsttuu2XgwIGbrWlqasrRRx+dvn37prGxMaecckrWrVvXoebRRx/NxIkTU19fn7e85S05//zzUxRFV7YOAAAAAABVpVdXvvm6desybdq0jB8/PlddddUmyzds2JApU6Zk6NCheeCBB7JixYpMnz49RVHksssuS5K0tLTk8MMPzyGHHJKFCxfm97//fWbMmJG+ffvmjDPO6Mr2AQAAAACganRpIHDeeeclSa6++urNLr/zzjvz+OOP5/nnn8+IESOSJHPnzs2MGTMyZ86cDBgwIP/xH/+R119/PVdffXXq6uoybty4/P73v883vvGNnH766ampqenKXwEAAAAAAKpCRe8h8NBDD2XcuHHtYUCSTJ48OWvXrs2iRYvaayZOnJi6uroONUuWLMmzzz672fddu3ZtWlpaOjwAAAAAAKDMKhoILFu2LMOGDeswNmjQoNTW1mbZsmVvWLPx9caav/bVr341DQ0N7Y+RI0d2QfcAAAAAALDr2O5AYPbs2ampqdni49e//vU2v9/mpvwpiqLD+F/XbLyh8BtNF/SlL30pzc3N7Y/nn39+m/sBAAAAAIBqtN33EJg5c2Y++clPbrFm77333qb3Gj58eH71q191GHvllVeyfv369qsAhg8fvsmVAC+99FKSbHLlwEZ1dXUdphgCAAAAAICy2+5AoLGxMY2NjZ3yHx8/fnzmzJmTpUuXZo899kjSdqPhurq6HHDAAe01Z511VtatW5fa2tr2mhEjRmxz8AAAAAAAAGXXpfcQaGpqyiOPPJKmpqZs2LAhjzzySB555JGsXr06STJp0qTst99+Oe644/Lwww/n5z//ec4888yceOKJGTBgQJLkU5/6VOrq6jJjxoz87ne/y49//ONceOGFOf30099wyiAAAAAAAKCjmmLjhPxdYMaMGbnmmms2Gb/nnnty8MEHJ2kLDT73uc/l7rvvTn19fT71qU/l4osv7jDlz6OPPpqTTjopCxYsyKBBg/LZz34255xzzjYHAi0tLWloaEhzc3N70AAAAAAAALu67Tn/3aWBwM5CIAAAAAAAQDXanvPfXTplEAAAAAAAsHMQCAAAAAAAQAkIBAAAAAAAoAQEAgAAAAAAUAICAQAAAAAAKAGBAAAAAAAAlIBAAAAAAAAASkAgAAAAAAAAJSAQAAAAAACAEhAIAAAAAABACQgEAAAAAACgBAQCAAAAAABQAgIBAAAAAAAoAYEAAAAAAACUgEAAAAAAAABKQCAAAAAAAAAlIBAAAAAAAIASEAgAAAAAAEAJCAQAAAAAAKAEBAIAAAAAAFACvSrdQHcoiiJJ0tLSUuFOAAAAAACg82w8773xPPiWlCIQWLVqVZJk5MiRFe4EAAAAAAA636pVq9LQ0LDFmppiW2KDXVxra2uWLFmS/v37p6amptLtVLWWlpaMHDkyzz//fAYMGFDpdqDb2QYoO9sAZWcboOxsA5SdbYCysw1QdpXaBoqiyKpVqzJixIj06LHluwSU4gqBHj16ZM8996x0G6UyYMAAO35KzTZA2dkGKDvbAGVnG6DsbAOUnW2AsqvENrC1KwM2clNhAAAAAAAoAYEAAAAAAACUgECATlVXV5dzzz03dXV1lW4FKsI2QNnZBig72wBlZxug7GwDlJ1tgLLbFbaBUtxUGAAAAAAAys4VAgAAAAAAUAICAQAAAAAAKAGBAAAAAAAAlIBAAAAAAAAASkAgAAAAAAAAJSAQoFPce++9qamp2exj4cKF7XWbW37FFVdUsHPoPHvvvfcmn+8vfvGLHWqamppy9NFHp2/fvmlsbMwpp5ySdevWVahj6DzPPvtsTjjhhIwePTr19fXZZ599cu65527y+XYcoNp95zvfyejRo9OnT58ccMAB+cUvflHplqDTffWrX8173vOe9O/fP7vvvns+8pGP5IknnuhQM2PGjE329+973/sq1DF0rtmzZ2/y+R4+fHj78qIoMnv27IwYMSL19fU5+OCD89hjj1WwY+hcm/vbt6amJieddFISxwCqz/3335+jjz46I0aMSE1NTX7yk590WL4t+/21a9fm5JNPTmNjY/r27ZsPfehDeeGFF7rxt/gzgQCdYsKECVm6dGmHx6c//ensvffeOfDAAzvUzps3r0Pd9OnTK9Q1dL7zzz+/w+f7y1/+cvuyDRs2ZMqUKVmzZk0eeOCBXH/99bnppptyxhlnVLBj6Bz/93//l9bW1nz3u9/NY489lm9+85u54oorctZZZ21S6zhAtbrhhhty6qmnZtasWXn44Ydz0EEH5cgjj0xTU1OlW4NOdd999+Wkk07KL3/5y9x1113505/+lEmTJmXNmjUd6o444ogO+/s77rijQh1D53vb297W4fP96KOPti/7+te/nm984xv59re/nYULF2b48OE5/PDDs2rVqgp2DJ1n4cKFHT7/d911V5Jk2rRp7TWOAVSTNWvW5B3veEe+/e1vb3b5tuz3Tz311Pz4xz/O9ddfnwceeCCrV6/OUUcdlQ0bNnTXr9GuV7f/F6lKtbW1Hb4RsX79+txyyy2ZOXNmampqOtQOHDiwQy1Uk/79+7/h5/vOO+/M448/nueffz4jRoxIksydOzczZszInDlzMmDAgO5sFTrVEUcckSOOOKL99ZgxY/LEE0/k8ssvz8UXX9yh1nGAavWNb3wjJ5xwQj796U8nSS655JLMnz8/l19+eb761a9WuDvoPD/96U87vJ43b1523333LFq0KB/4wAfax+vq6uzvqVq9evXa7Oe7KIpccsklmTVrVj760Y8mSa655poMGzYs1113Xf75n/+5u1uFTjd06NAOry+66KLss88+mThxYvuYYwDV5Mgjj8yRRx652WXbst9vbm7OVVddle9///s57LDDkiQ/+MEPMnLkyPzsZz/L5MmTu+13SVwhQBe55ZZbsnz58syYMWOTZTNnzkxjY2Pe85735Iorrkhra2v3Nwhd5Gtf+1qGDBmSd77znZkzZ06H6VIeeuihjBs3rj0MSJLJkydn7dq1WbRoUSXahS7V3NycwYMHbzLuOEA1WrduXRYtWpRJkyZ1GJ80aVL+53/+p0JdQfdobm5Okk32+ffee29233337LvvvjnxxBPz0ksvVaI96BJPPvlkRowYkdGjR+eTn/xknnnmmSTJ4sWLs2zZsg7Hg7q6ukycONHxgKq0bt26/OAHP8g//dM/dfhCqGMAZbEt+/1FixZl/fr1HWpGjBiRcePGVeTY4AoBusRVV12VyZMnZ+TIkR3Gv/KVr+TQQw9NfX19fv7zn+eMM87I8uXLO0yrAruqz3/+83n3u9+dQYMGZcGCBfnSl76UxYsX58orr0ySLFu2LMOGDeuwzqBBg1JbW5tly5ZVomXoMk8//XQuu+yyzJ07t8O44wDVavny5dmwYcMm+/lhw4bZx1PViqLI6aefnve///0ZN25c+/iRRx6ZadOmZdSoUVm8eHHOPvvsfPCDH8yiRYtSV1dXwY5hx733ve/Ntddem3333Td/+MMfcsEFF2TChAl57LHH2vf5mzsePPfcc5VoF7rUT37yk6xcubLDF0IdAyiTbdnvL1u2LLW1tRk0aNAmNZX4W0EgwBbNnj0755133hZrFi5c2OE+AS+88ELmz5+fG2+8cZPavzzh8853vjNJ25zrTgSxs9qebeC0005rH9t///0zaNCgfOxjH2u/aiDJJlNoJW1/SG9uHHYGb+Y4sGTJkhxxxBGZNm1a+9QpGzkOUO3+en9uH0+1mzlzZn7729/mgQce6DD+iU98ov35uHHjcuCBB2bUqFG5/fbb2y+nh13VX04b8fa3vz3jx4/PPvvsk2uuuab9xqmOB5TFVVddlSOPPLLDlfCOAZTRm9nvV+rYIBBgi2bOnJlPfvKTW6zZe++9O7yeN29ehgwZkg996ENbff/3ve99aWlpyR/+8IdNkjTYGbyZbWCjjX8MPPXUUxkyZEiGDx+eX/3qVx1qXnnllaxfv97nn53W9m4DS5YsySGHHJLx48fn3//937f6/o4DVIvGxsb07Nlzk2/4vPTSSz7bVK2TTz45t9xyS+6///7sueeeW6zdY489MmrUqDz55JPd1B10n759++btb397nnzyyXzkIx9J0vZt0D322KO9xvGAavTcc8/lZz/7WW6++eYt1jkGUM023itjS/v94cOHZ926dXnllVc6XCXw0ksvZcKECd3bcAQCbEVjY2MaGxu3ub4oisybNy/HH398evfuvdX6hx9+OH369MnAgQN3oEvoOtu7Dfylhx9+OEnaDwjjx4/PnDlzsnTp0vaxO++8M3V1dTnggAM6p2HoZNuzDbz44os55JBDcsABB2TevHnp0WPrtypyHKBa1NbW5oADDshdd92VY445pn38rrvuyoc//OEKdgadryiKnHzyyfnxj3+ce++9N6NHj97qOitWrMjzzz/f4Q9lqBZr167N//7v/+aggw7K6NGjM3z48Nx1111517velaRtjvX77rsvX/va1yrcKXSujTeVnzJlyhbrHAOoZtuy3z/ggAPSu3fv3HXXXfn4xz+eJFm6dGl+97vf5etf/3q39ywQoFPdfffdWbx4cU444YRNlt16661ZtmxZxo8fn/r6+txzzz2ZNWtWPvOZz5hDjl3eQw89lF/+8pc55JBD0tDQkIULF+a0007Lhz70oey1115J2m4sud9+++W4447Lv/7rv+bll1/OmWeemRNPPDEDBgyo8G8AO2bJkiU5+OCDs9dee+Xiiy/OH//4x/ZlG78x4ThAtTv99NNz3HHH5cADD2y/SqapqSmf/exnK90adKqTTjop1113Xf7rv/4r/fv3b78ypqGhIfX19Vm9enVmz56dqVOnZo899sizzz6bs846K42NjR0CM9hVnXnmmTn66KOz11575aWXXsoFF1yQlpaWTJ8+PTU1NTn11FNz4YUXZuzYsRk7dmwuvPDC7LbbbvnUpz5V6dah07S2tmbevHmZPn16evX68+lFxwCq0erVq/PUU0+1v168eHEeeeSRDB48OHvttddW9/sNDQ054YQTcsYZZ2TIkCEZPHhwzjzzzLz97W/PYYcd1v2/UAGd6Nhjjy0mTJiw2WX//d//Xbzzne8s+vXrV+y2227FuHHjiksuuaRYv359N3cJnW/RokXFe9/73qKhoaHo06dP8da3vrU499xzizVr1nSoe+6554opU6YU9fX1xeDBg4uZM2cWr7/+eoW6hs4zb968IslmHxs5DlAG//Zv/1aMGjWqqK2tLd797ncX9913X6Vbgk73Rvv7efPmFUVRFK+++moxadKkYujQoUXv3r2Lvfbaq5g+fXrR1NRU2cahk3ziE58o9thjj6J3797FiBEjio9+9KPFY4891r68tbW1OPfcc4vhw4cXdXV1xQc+8IHi0UcfrWDH0Pnmz59fJCmeeOKJDuOOAVSje+65Z7P/9pk+fXpRFNu233/ttdeKmTNnFoMHDy7q6+uLo446qmLbRU1RFEV3hxAAAAAAAED32vrkvgAAAAAAwC5PIAAAAAAAACUgEAAAAAAAgBIQCAAAAAAAQAkIBAAAAAAAoAQEAgAAAAAAUAICAQAAAAAAKAGBAAAAAAAAlIBAAAAAAAAASkAgAAAAAAAAJSAQAAAAAACAEvh/othosIVRqTgAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=(19,14))\n", "idx=0\n", "for a in model2d:\n", " w=bow_representation_idf[idx]\n", " plt.plot(a[0],a[1],'r.',markersize=20)\n", " plt.text(a[0],a[1]+3,idx,size=20)\n", " idx+=1\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.9" } }, "nbformat": 4, "nbformat_minor": 4 }